The script creates and sets up of user K8S profile
* Allow users the ability to connect K8S cluster remotely * Authenthicate to UCP Keystone * Then able remotely execute into containers * Install all required software components Change-Id: I1062ab14d1c643e1161b6fcfb870eaee55f5e64b
This commit is contained in:
parent
4b71275e37
commit
5f3ce78d7f
165
jmphost/README.md
Normal file
165
jmphost/README.md
Normal file
@ -0,0 +1,165 @@
|
|||||||
|
# Jump host installation
|
||||||
|
|
||||||
|
The install will Kubernetes client and the corresponding dependencies in order
|
||||||
|
to able to connect to K8S cluster remotely. It will also create a generic
|
||||||
|
kubectl configuration file with appropriate attributes required.
|
||||||
|
|
||||||
|
This revision covers the implementation as described. [k8s-keystone-auth](
|
||||||
|
https://github.com/kubernetes/cloud-provider-openstack/blob/master/docs/using-keystone-webhook-authenticator-and-authorizer.md#new-kubectl-clients-from-v1110-and-later)
|
||||||
|
|
||||||
|
## 1. Pre-requisites
|
||||||
|
|
||||||
|
* Ubuntu OS version 14.x or higher
|
||||||
|
* Connectivity to the Internet
|
||||||
|
* The installer has sudo ability without prompting for password
|
||||||
|
* Installer's Git profile setup accordingly
|
||||||
|
|
||||||
|
## 2. Installation
|
||||||
|
|
||||||
|
### 2.1 Clone Porthole main project
|
||||||
|
|
||||||
|
$git clone https://review.opendev.org/airship/porthole
|
||||||
|
|
||||||
|
Cloning into 'porthole'...
|
||||||
|
remote: Counting objects: 362, done
|
||||||
|
remote: Finding sources: 100% (362/362)
|
||||||
|
remote: Total 362 (delta 185), reused 311 (delta 185)
|
||||||
|
Receiving objects: 100% (362/362), 98.30 KiB | 0 bytes/s, done.
|
||||||
|
Resolving deltas: 100% (185/185), done.
|
||||||
|
Checking connectivity... done.
|
||||||
|
|
||||||
|
### 2.2 Pull PatchSet (optional)
|
||||||
|
|
||||||
|
$cd porthole
|
||||||
|
$git pull https://review.opendev.org/airship/porthole refs/changes/92/674892/[latest change set]
|
||||||
|
|
||||||
|
remote: Counting objects: 10, done
|
||||||
|
remote: Finding sources: 100% (8/8)
|
||||||
|
remote: Total 8 (delta 2), reused 7 (delta 2)
|
||||||
|
Unpacking objects: 100% (8/8), done.
|
||||||
|
From https://review.opendev.org/airship/porthole
|
||||||
|
branch refs/changes/92/674892/9 -> FETCH_HEAD
|
||||||
|
Merge made by the 'recursive' strategy.
|
||||||
|
jmphost/README.md | 130 ++++++++++++++++++++++++++++++++++++++++
|
||||||
|
jmphost/funs_uc.sh | 57 ++++++++++++++++++++++++++++++++++++++++
|
||||||
|
jmphost/setup-access.sh | 132 ++++++++++++++++++++++++++++++++++++++++
|
||||||
|
zuul.d/jmphost-utility.yaml | 35 ++++++++++++++++++++++++++++++++++++++++
|
||||||
|
|
||||||
|
4 files changed, 354 insertions(+)
|
||||||
|
create mode 100644 jmphost/README.md
|
||||||
|
create mode 100755 jmphost/funs_uc.sh
|
||||||
|
create mode 100755 jmphost/setup-access.sh
|
||||||
|
create mode 100644 zuul.d/jmphost-utility.yaml
|
||||||
|
|
||||||
|
### 2.3 Run Setup
|
||||||
|
|
||||||
|
$sudo -s
|
||||||
|
$cd jmphost
|
||||||
|
$./setup-access.sh "site" "userid" "namespace"
|
||||||
|
|
||||||
|
[Kubectl binary] is not found on this system..
|
||||||
|
Checking user[johnSmith] sudo ability
|
||||||
|
Looking good. You [johnSmith] are root now
|
||||||
|
deb https://apt.kubernetes.io/ kubernetes-xenial main
|
||||||
|
OK
|
||||||
|
........................
|
||||||
|
........................
|
||||||
|
........................
|
||||||
|
........................
|
||||||
|
Installing [kubectl] dependency required...
|
||||||
|
Reading package lists... Done
|
||||||
|
Building dependency tree
|
||||||
|
Reading state information... Done
|
||||||
|
The following package was automatically installed and is no longer required:
|
||||||
|
libclamav6
|
||||||
|
Use 'apt-get autoremove' to remove it.
|
||||||
|
The following NEW packages will be installed:
|
||||||
|
kubectl
|
||||||
|
0 upgraded, 1 newly installed, 0 to remove and 104 not upgraded.
|
||||||
|
Need to get 9,231 kB of archives.
|
||||||
|
After this operation, 46.7 MB of additional disk space will be used.
|
||||||
|
Fetched 9,231 kB in 12s (732 kB/s)
|
||||||
|
Selecting previously unselected package kubectl.
|
||||||
|
(Reading database ... 114982 files and directories currently installed.)
|
||||||
|
Preparing to unpack .../kubectl_1.16.0-00_amd64.deb ...
|
||||||
|
Unpacking kubectl (1.16.0-00) ...
|
||||||
|
Setting up kubectl (1.16.0-00) ...
|
||||||
|
........................
|
||||||
|
........................
|
||||||
|
W: Duplicate sources.list entry https://apt.kubernetes.io/ kubernetes-xenial/main amd64 Packages (/var/lib/apt/lists/apt.kubernetes.io_dists_kubernetes-xenial_main_binary-amd64_Packages)
|
||||||
|
W: Duplicate sources.list entry https://apt.kubernetes.io/ kubernetes-xenial/main i386 Packages (/var/lib/apt/lists/apt.kubernetes.io_dists_kubernetes-xenial_main_binary-i386_Packages)
|
||||||
|
........................
|
||||||
|
W: You may want to run apt-get update to correct these problems
|
||||||
|
|
||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
namespace: utility
|
||||||
|
Authentication via API WebHook Ingress service endpoint
|
||||||
|
clusters:
|
||||||
|
- cluster:
|
||||||
|
server: https://<FQDN-WEBHOOK-APISERVER>
|
||||||
|
name: <CLUSTER_NAME>
|
||||||
|
contexts:
|
||||||
|
- context:
|
||||||
|
cluster: <CLUSTER_NAME>
|
||||||
|
user: <USERID>
|
||||||
|
name: <USERID>@<CLUSTER_NAME>
|
||||||
|
current-context: <USERID>@<CLUSTER_NAME>
|
||||||
|
kind: Config
|
||||||
|
preferences: {}
|
||||||
|
users:
|
||||||
|
- name: <USERID>
|
||||||
|
user:
|
||||||
|
exec:
|
||||||
|
command: "/usr/local/uc/bin/client-keystone-auth"
|
||||||
|
apiVersion: "client.authentication.k8s.io/v1beta1"
|
||||||
|
env:
|
||||||
|
- name: "OS_DOMAIN_NAME"
|
||||||
|
value: default
|
||||||
|
- name: "OS_INTERFACE"
|
||||||
|
value: public
|
||||||
|
- name: "OS_USERNAME"
|
||||||
|
value: <USER_ID>
|
||||||
|
- name: "OS_PASSWORD"
|
||||||
|
value: "<USER-PASSWORD>"
|
||||||
|
- name: "OS_PROJECT_NAME"
|
||||||
|
value: <admin-project>
|
||||||
|
- name: "OS_REGION_NAME"
|
||||||
|
value: <SITE>
|
||||||
|
- name: "OS_IDENTITY_API_VERSION"
|
||||||
|
value: "3"
|
||||||
|
args:
|
||||||
|
- "--keystone-url=https://<FQDN TO UCP KEYSTONE>/v3"
|
||||||
|
|
||||||
|
## Validation
|
||||||
|
|
||||||
|
- Now log out and log back in as the user.
|
||||||
|
- Update the configuration file with user corresponding credentials.
|
||||||
|
|
||||||
|
For testing purposes:
|
||||||
|
- Replacing **"OS_USERNAME"** and **"OS_PASSWORD"** with UCP Keystone credentials
|
||||||
|
- Set the **"OS_PROJECT_NAME"** value accordingly
|
||||||
|
|
||||||
|
### List pods
|
||||||
|
|
||||||
|
$kubectl get pods -n utility
|
||||||
|
|
||||||
|
NAME READY STATUS RESTARTS AGE
|
||||||
|
clcp-calicoctl-utility-6457864fc8-zpfxk 1/1 Running 0 4h27m
|
||||||
|
clcp-ncct-utility-6588ff5566-8mqsb 1/1 Running 0 4h27m
|
||||||
|
clcp-tenant-ceph-utility-7b8f6d45f8-5q4ts 1/1 Running 0 99m
|
||||||
|
clcp-tenant-ceph-utility-config-ceph-ns-key-generator-hd9rb 0/1 Completed 0 99m
|
||||||
|
clcp-ucp-ceph-utility-6f4bbd4569-vrm7c 1/1 Running 0 4h11m
|
||||||
|
clcp-ucp-ceph-utility-config-ceph-ns-key-generator-pvfcl 0/1 Completed 0 4h12m
|
||||||
|
clcp-ucp-ceph-utility-config-test 0/1 Completed 0 4h12m
|
||||||
|
|
||||||
|
### Execute into the pod
|
||||||
|
|
||||||
|
$kubectl exec -it [pod-name] -n utility /bin/bash
|
||||||
|
|
||||||
|
rpc error: code = 2 desc = oci runtime error: exec failed: container_linux.go:247: starting container process caused "exec: \"/bin/\": permission denied"
|
||||||
|
|
||||||
|
command terminated with exit code 126
|
||||||
|
|
||||||
|
Because the user id entered in the configuration file is not a member in UCP keystone
|
||||||
|
RBAC to execute into the pod, it's expecting to see "permission denied".
|
57
jmphost/funs_uc.sh
Executable file
57
jmphost/funs_uc.sh
Executable file
@ -0,0 +1,57 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
# Author: Trung Thai, tt2189@att.com
|
||||||
|
#
|
||||||
|
# Purpose: Common shared functions defined and used on jumphost server.
|
||||||
|
#
|
||||||
|
|
||||||
|
# Author Krishna Venkata, kv988c@att.com
|
||||||
|
#
|
||||||
|
# Purpose - kubectl wrapper providing some of overwriting behavior from Kubectl
|
||||||
|
# when users to exectute into utility container.
|
||||||
|
|
||||||
|
declare -frx kubectl
|
||||||
|
|
||||||
|
function kubectl() {
|
||||||
|
if [[ $* == *"exec"* ]] && [[ $* == *"bash"* ]]; then
|
||||||
|
aft_bash=$(echo "$*" | awk -F'bash' '{print $2}')
|
||||||
|
bef_bash=$(echo "$*" | awk -F'bash' '{print $1}')
|
||||||
|
if [[ -z $aft_bash ]]; then
|
||||||
|
if [[ $* == *"--"* ]]; then
|
||||||
|
$(which kubectl) $bef_bash bash -c "export AUSER=$USER;bash;"
|
||||||
|
else
|
||||||
|
$(which kubectl) $bef_bash -- bash -c "export AUSER=$USER;bash;"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
command=$(echo $aft_bash | cut -d' ' -f2-)
|
||||||
|
$(which kubectl) $bef_bash bash -c "export AUSER=$USER;$command;"
|
||||||
|
fi
|
||||||
|
elif [[ $* == *"exec"* ]] && [[ $* == *"sh"* ]]; then
|
||||||
|
aft_sh=$(echo "$*" | awk -F'sh' '{print $2}')
|
||||||
|
bef_sh=$(echo "$*" | awk -F'sh' '{print $1}')
|
||||||
|
if [[ -z $aft_sh ]]; then
|
||||||
|
if [[ $* == *"--"* ]]; then
|
||||||
|
$(which kubectl) $bef_sh sh -c "export AUSER=$USER;sh;"
|
||||||
|
else
|
||||||
|
$(which kubectl) $bef_sh -- sh -c "export AUSER=$USER;sh;"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
command=$(echo $aft_sh | cut -d' ' -f2-)
|
||||||
|
`which kubectl` $bef_sh sh -c "export AUSER=$USER;$command;"
|
||||||
|
fi
|
||||||
|
elif [[ $* == *"exec"* ]] && [[ $* == *"utilscli"* ]]; then
|
||||||
|
aft_utilscli=$(echo "$*" | awk -F'utilscli' '{print $2}')
|
||||||
|
bef_utilscli=$(echo "$*" | awk -F'utilscli' '{print $1}')
|
||||||
|
if [[ -z $aft_utilscli ]]; then
|
||||||
|
echo "Invalid Command"
|
||||||
|
else
|
||||||
|
if [[ $* == *"--"* ]]; then
|
||||||
|
$(which kubectl) $bef_utilscli bash -c "export AUSER=$USER;utilscli $aft_utilscli;"
|
||||||
|
else
|
||||||
|
$(which kubectl) $bef_utilscli -- bash -c "export AUSER=$USER;utilscli $aft_utilscli;"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
$(which kubectl) $*
|
||||||
|
fi
|
||||||
|
}
|
136
jmphost/setup-access.sh
Executable file
136
jmphost/setup-access.sh
Executable file
@ -0,0 +1,136 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Script installs Kubectl latest binary and K8S-Keystone-Auth provider.
|
||||||
|
# It will generate a default 'kubectl' configuration file for the user with the appropriate
|
||||||
|
# settings to remotely connect to K8S cluster through Keystone authentication mechanism.
|
||||||
|
|
||||||
|
|
||||||
|
if [[ ${#} -lt 2 ]] ; then
|
||||||
|
echo "Abort - Usage $0 <SITE NAME> <USER_ID> <NAMESPACE>"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
SITE_NAME=$1 ; LOGNAME=$2 ; NAMESPACE=$3
|
||||||
|
|
||||||
|
LOGNAME_GRP=$(grep ${LOGNAME} /etc/passwd |cut -d":" -f3)
|
||||||
|
|
||||||
|
# set default env variables
|
||||||
|
: ${USER_HOME:=$HOME}
|
||||||
|
: ${USER_KUBECFG:=$USER_HOME/.kube/config}
|
||||||
|
|
||||||
|
function _addSourceList() {
|
||||||
|
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | \
|
||||||
|
tee -a /etc/apt/sources.list.d/kubernetes.list
|
||||||
|
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
|
||||||
|
apt-get update
|
||||||
|
}
|
||||||
|
|
||||||
|
# Install dependencies once
|
||||||
|
function _installDep () {
|
||||||
|
|
||||||
|
# kubectl
|
||||||
|
if [[ $1 == 'kubectl' ]] ; then
|
||||||
|
echo "Installing [${1}] dependency required..."
|
||||||
|
apt-get install -y kubectl
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Create kubeconfig skelton file
|
||||||
|
function _createConfig() {
|
||||||
|
tee ${USER_KUBECFG} <<EOF
|
||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
namespace: ${NAMESPACE}
|
||||||
|
|
||||||
|
# Authentication via API WebHook Ingress service endpoint
|
||||||
|
clusters:
|
||||||
|
- cluster:
|
||||||
|
server: https://<WEBHOOK-API-INGRESS-FQDN>
|
||||||
|
name: kubernetes
|
||||||
|
contexts:
|
||||||
|
- context:
|
||||||
|
cluster: kubernetes
|
||||||
|
user: ${LOGNAME}
|
||||||
|
name: ${LOGNAME}@kubernetes
|
||||||
|
current-context: ${LOGNAME}@kubernetes
|
||||||
|
kind: Config
|
||||||
|
preferences: {}
|
||||||
|
users:
|
||||||
|
- name: ${LOGNAME}
|
||||||
|
user:
|
||||||
|
exec:
|
||||||
|
command: "/usr/local/uc/bin/client-keystone-auth"
|
||||||
|
apiVersion: "client.authentication.k8s.io/v1beta1"
|
||||||
|
|
||||||
|
env:
|
||||||
|
- name: "OS_DOMAIN_NAME"
|
||||||
|
value: default
|
||||||
|
- name: "OS_INTERFACE"
|
||||||
|
value: public
|
||||||
|
- name: "OS_USERNAME"
|
||||||
|
value: ${LOGNAME}
|
||||||
|
- name: "OS_PASSWORD"
|
||||||
|
value: "<USER-PASSWORD>"
|
||||||
|
- name: "OS_PROJECT_NAME"
|
||||||
|
value: admin
|
||||||
|
- name: "OS_REGION_NAME"
|
||||||
|
value: ${SITE_NAME}
|
||||||
|
- name: "OS_IDENTITY_API_VERSION"
|
||||||
|
value: "3"
|
||||||
|
|
||||||
|
args:
|
||||||
|
- "--keystone-url=<UCP-KEYSTONE-INGRESS-FQDN>/v3"
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
# checking and installing 'kubectl'
|
||||||
|
if [[ ! -x /usr/bin/kubectl ]] ; then
|
||||||
|
echo "[Kubectl binary] is not found on this system.."
|
||||||
|
echo "Checking user[${LOGNAME}] sudo ability"
|
||||||
|
let num=$(id -u)
|
||||||
|
if [ $num -ne '0' ]; then
|
||||||
|
echo "Abort dependencies installation. You [$LOGNAME] are not root yet"
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
echo "Looking good. You [$LOGNAME] are root now"
|
||||||
|
_addSourceList
|
||||||
|
_installDep "kubectl"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ ! -d ${USER_HOME}/.kube ]]; then
|
||||||
|
mkdir ${USER_HOME}/.kube
|
||||||
|
chown -R ${LOGNAME}:${LOGNAME_GRP} ${USER_HOME}/.kube
|
||||||
|
fi
|
||||||
|
|
||||||
|
# create config if it does not exit
|
||||||
|
if [[ ! -f ${USER_KUBECFG} ]]; then
|
||||||
|
_createConfig
|
||||||
|
chown ${LOGNAME}:${LOGNAME_GRP} ${USER_HOME}/.kube/config
|
||||||
|
fi
|
||||||
|
|
||||||
|
# staging uc functions to a common area
|
||||||
|
if [[ ! -d /usr/local/uc/bin/ ]]; then
|
||||||
|
mkdir -p /usr/local/uc/bin/
|
||||||
|
cp -p funs_uc.sh /usr/local/uc/bin/
|
||||||
|
echo "Installing [k8s-keystone-authentication] component"
|
||||||
|
curl -SL# https://api.nz-por-1.catalystcloud.io:8443/v1/AUTH_b23a5e41d1af4c20974bf58b4dff8e5a/lingxian-public/client-keystone-auth \
|
||||||
|
-o /usr/local/uc/bin/client-keystone-auth
|
||||||
|
chmod 755 -R /usr/local/uc
|
||||||
|
chown root:root -R /usr/local/uc
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Update user bash rc script to include uc funcions
|
||||||
|
if [[ -f ${HOME}/.bashrc ]]; then
|
||||||
|
cp -p ${HOME}/.bashrc ${HOME}/.bashrc.jmp.bck.$(date +%s)
|
||||||
|
egrep funs_uc ${HOME}/.bashrc
|
||||||
|
if [[ $? -eq '1' ]] ; then
|
||||||
|
tee -a ${HOME}/.bashrc <<EOF
|
||||||
|
# Utility container common functions
|
||||||
|
if [[ -f /usr/local/uc/bin/funs_uc.sh ]]; then
|
||||||
|
. /usr/local/uc/bin/funs_uc.sh
|
||||||
|
fi
|
||||||
|
EOF
|
||||||
|
fi
|
||||||
|
fi
|
Loading…
Reference in New Issue
Block a user