zcp-iam 은 zcp-portal-ui (Console)의 back-end api server 로서, KeyCloak 과 Kubernetes(이하 k8s) 의 Proxy 역할을 하는 API Server 이다.
zcp-iam 을 설치하기 이전에 k8s cluster 가 설치되어 있어야 하고, cluster-admin role 권한으로 kubectl
을 수행 할 수 있는 환경을 갖추어야 한다.
Clone this project into the desktop
$ git clone https://github.com/cnpst/zcp-iam.git
설치 환경에 맞게 setenv.sh
파일을 수정한다.
각 정보를 확인하는 자세한 방법은 Appendix를 참고한다.
jenkins_token
값은 Jenkins 설치/설정 이후 값을 확인가능하다. 설정이 누락되지 않도록 주의한다. 차후, Jenkins 설치/설정 완료 후 zcp-iam-secret을 변경하여 zcp-iam pod를 다시 올린다. (warn) 최초 설치시에jenkins_token
값을 비워두지 않고 dump값을 넣어둔다.
api_server 는 kubeconfig 다운로드 시 사용되므로 반드시 api server 의 public endpoint 를 확인하여 수정해야 한다.
$ cd template
$ vi setenv.sh
#!/bin/bash
out_dir=.tmp
# variables be set as jenkins job properties. use this variables when you install manually.
keycloak_user=cloudzcp-admin
keycloak_pwd= #변경
jenkins_user=cloudzcp-admin
jenkins_token=api-token #변경
sa=zcp-system-admin
domain_prefix=pog-dev- #변경
api_server=kubernetes.default #api-server endpoint 정보 변경
namespace=zcp-system
image=registry.au-syd.bluemix.net/cloudzcp/zcp-iam:1.1.0 #확인
replicas=1
...
helm chart 를 이용하여 mongodb 를 설치한다.
$ cd mongodb
# 설치하는 클러스터 종류에 맞는 Provider 값을 입력한다. iks, aks, eks
$ export PROVIDER=iks
$ kubectl create -f zcp-iam-mongodb-pvc-${PROVIDER}.yaml
$ kubectl get pvc -n zcp-system -w | grep zcp-iam-mongo
zcp-iam-mongodb Bound pvc-xxx-xxx 20Gi RWO ibmc-block-retain-silver yy
$ bash install.sh
LAST DEPLOYED: Thu Mar 7 16:44:10 2019
NAMESPACE: zcp-system
STATUS: DEPLOYED
RESOURCES:
==> v1/Secret
NAME TYPE DATA AGE
zcp-iam-db-mongo Opaque 2 5d
==> v1/Service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
zcp-iam-db-mongo ClusterIP 172.21.46.189 <none> 27017/TCP 5d
==> v1beta1/Deployment
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
zcp-iam-db-mongo 1 1 1 1 5d
==> v1/Pod(related)
NAME READY STATUS RESTARTS AGE
zcp-iam-db-mongo-7794bdcfbb-cs8xw 1/1 Running 0 5d
...
설정된 setenv.sh
파일을 바탕으로 template.sh
파일을 실행한다.
template.sh
파일은 템플릿 파일(.tpl
/.tpl2
)을 변환하여 YAML 파일을 생성한다.
.tmp
는 setenv.sh
파일의 out_dir
값과 동일하다.
$ bash template.sh
$ ls -l .tmp
-rw-r--r-- 1 hoon staff 1312 3 15 12:27 setenv.sh
-rw-r--r-- 1 hoon staff 608 3 15 12:27 varlables.log
-rw-r--r-- 1 hoon staff 686 3 15 12:28 zcp-iam-config.yaml
-rw-r--r-- 1 hoon staff 2748 3 15 12:27 zcp-iam-deployment.yaml
-rw-r--r-- 1 hoon staff 404 3 15 12:27 zcp-iam-secret.yaml
템플릿을 통해 생성된 YAML 파일을 아래의 명령으로 실행한다.
$ kubectl create -f .tmp
configmap/zcp-iam-config created
deployment.apps/zcp-iam created
service/zcp-iam created
secret/zcp-iam-secret created
...
## check to create
$ kubectl get deploy,po,cm,secret,svc -n zcp-system -l component=zcp-iam
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
deployment.extensions/zcp-iam 1 1 1 1 17d
NAME READY STATUS RESTARTS AGE
pod/zcp-iam-68649d9bf-6n8gn 1/1 Running 0 1d
NAME DATA AGE
configmap/zcp-iam-config 10 17d
NAME TYPE DATA AGE
secret/zcp-iam-secret Opaque 6 17d
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/zcp-iam ClusterIP 172.21.17.89 <none> 80/TCP 17d
Private 환경의 클러스터에서는 Web SSH 실행에 필요한 Docker Image 를 Harbor 에 Push 한다.
$ bash push.sh
Move a web ssh docker image cloudzcp/wsh:1.1.0 -> pog-dev-registry.cloudzcp.io/cloudzcp/wsh:1.1.0
1.1.0: Pulling from cloudzcp/wsh
Digest: sha256:5e5173702bc7ac92ee66afc348e5f9f3e470697d77446fb6965030b2a56f8244
Status: Image is up to date for cloudzcp/wsh:1.1.0
Authenticating with existing credentials...
Username:
Password:
The push refers to repository [pog-dev-registry.cloudzcp.io/cloudzcp/wsh]
07113e56211b: Layer already exists
ce209fc58fa6: Layer already exists
503e53e365f3: Layer already exists
1.1.0: digest: sha256:5e5173702bc7ac92ee66afc348e5f9f3e470697d77446fb6965030b2a56f8244 size: 948
1.1.0: Pulling from cloudzcp/wsh
Digest: sha256:5e5173702bc7ac92ee66afc348e5f9f3e470697d77446fb6965030b2a56f8244
Status: Image is up to date for pog-dev-registry.cloudzcp.io/cloudzcp/wsh:1.1.0
- Jenkins에 로그인 한다. (폴더 생성권한 필요)
- 우측 상단의 사용자 이름을 클릭한다.
- 좌측 메뉴의 설정 페이지로 이동한다.
- API Token > SHOW API TOKEN... 버튼을 클릭하여 값을 확인한다.
$ kubectl config view
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: REDACTED
server: https://169.56.69.242:23078
name: zcp-demo
...
...
!) setenv.sh 에서 자동으로 설정되도록 변경됨
- KeyCloak 에서 사용하는 Postgresql 에 접속하여 Client 테이블에서 Secret 정보를 Select 한다.
$ kubectl exec -it zcp-oidc-postgresql-c94cc488f-znq2v psql
psql (9.6.2)
Type "help" for help.
keycloak=# select secret from client where realm_id = 'master' and client_id = 'master-realm';
secret
--------------------------------------
237ef2ad-c5f3-491a-89ab-dab04c8bf268
(1 row)
keycloak=# \q
Secret 정보를 복사 한 후 base64로 encoding 한다.
$ echo -n "secret of master realm client" | base64
KEYCLOAK_MASTER_CLIENT_SECRET
의 value 를 base64 encoding 된 값으로 변경한다.
KeyCloak 설치 시 설정한 admin id/password (KEYCLOAK_ADMIN_ID, KEYCLOAK_ADMIN_PWD) 도 base64 encoding 한 후, 각각 KEYCLOAK_MASTER_USERNAME
, KEYCLOAK_MASTER_PASSWORD
의 value 값을 변경한다.
(:white_check_mark: KeyCloak 설치 시 admin id/password 변경하지 않은 경우 그대로 사용하면 됨)