본 문서(컨테이너 서비스 설치 가이드)는 Kubernetes를 사용하기 위해 Bosh 기반 릴리즈의 설치 및 서비스 등록 방법을 기술하였다.
PaaS-TA 3.5 버전부터는 Bosh 2.0 기반으로 배포(deploy)를 진행한다.
1.2. 범위
설치 범위는 Kubernetes 서비스 배포를 기준으로 작성하였다.
1.3. 시스템 구성도
시스템 구성은 Kubernetes Cluster(Master, Worker)와 BOSH Inception(DBMS, HAProxy, Private Registry)환경으로 구성되어 있다.
Kubespary를 통해 Kubernetes Cluster를 설치하고 BOSH 릴리즈로 Database, Private registry 등 미들웨어 환경을 제공하여 Docker Image로 Kubernetes Cluster에 서비스 환경을 배포한다. PaaS-TA 컨테이너 서비스를 통해 Kubernetes Cluster에 배포된 서비스를 등록하여 서비스 포털 환경을 사용한다. 총 필요한 VM 환경으로는 Master VM: 1개, Worker VM: 1개 이상, BOSH Inception VM: 1개가 필요하며 본 문서는 BOSH Inception 환경을 구성하기 위한 VM설치와 Kubernetes Cluster에 컨테이너 서비스를 배포하는 내용이다.
Stemcell 목록을 확인하여 서비스 설치에 필요한 Stemcell 이 업로드 되어 있는 것을 확인한다. (PaaS-TA 5.5 와 동일 Stemcell 사용)
Stemcell 업로드 및 Cloud Config, Runtime Config 설정 부분은 PaaS-TA 5.5 설치가이드를 참고 한다.
$ bosh -e micro-bosh stemcells
Using environment '10.0.1.6' as client 'admin'
Name Version OS CPI CID
bosh-aws-xen-hvm-ubuntu-xenial-go_agent 621.94 ubuntu-xenial - ami-0694eb07c57faca73
(*) Currently deployed
1 stemcells
Succeeded
2.3. Deployment 다운로드
서비스 설치에 필요한 Deployment를 Git Repository에서 받아 서비스 설치 작업 경로로 위치시킨다.
# Deployment 다운로드 파일 위치 경로 생성 및 이동
$ mkdir -p ~/workspace/paasta-5.5.0/deployment/
$ cd ~/workspace/paasta-5.5.0/deployment/
# Deployment 다운로드
$ git clone https://github.com/PaaS-TA/paas-ta-container-platform-deployment.git
# Bosh 배포 경로로 이동
$ cd paas-ta-container-platform-deployment/bosh/
2.4. Deployment 파일 수정
BOSH Deployment manifest는 Components 요소 및 배포의 속성을 정의한 YAML 파일이다. Deployment 파일에서 사용하는 network, vm_type, disk_type 등은 Cloud config를 활용하고, 활용 방법은 BOSH 2.0 가이드를 참고한다.
# 릴리즈 다운로드 파일 위치 경로 생성
$ mkdir -p ~/workspace/paasta-5.5.0/release/service
$ cd ~/workspace/paasta-5.5.0/release/service
# 릴리즈 파일 다운로드 및 파일 경로 확인
$ wget --content-disposition https://nextcloud.paas-ta.org/index.php/s/zYjJg9yffxwSbFT/download
$ ls ~/workspace/paasta-5.5.0/release/service
paasta-container-platform-1.0.tgz
서비스를 설치한다.
$ cd ~/workspace/paasta-5.5.0/deployment/paas-ta-container-platform-deployment/bosh
$ chmod +x *.sh
$ ./deploy-{IAAS}.sh
2.6. 서비스 설치 확인
설치 완료된 서비스를 확인한다.
$ bosh -e micro-bosh -d paasta-container-platform vms
Using environment '10.0.1.6' as client 'admin'
Task 2983. Done
Deployment 'paasta-container-platform'
Instance Process State AZ IPs VM CID VM Type Active
haproxy/cbd5d103-765d-47e0-ac5b-233a21108c77 running z7 10.0.0.122 i-0f49ce7431aaa2901 small true
15.164.15.53
mariadb/448be54d-f2ff-4fc9-8bf1-621eda8e2577 running z5 10.0.161.121 i-09b27b184b7aea066 small true
private-image-repository/561550fb-95de-4c12-95bf-94ac5fde53cc running z7 10.0.0.123 i-02ff1da176d1d0a16 small true
3 vms
Succeeded
2.7. CVE/CCE 진단항목 적용
배포된 Kubernetes Cluster, BOSH Inception 환경에 아래 가이드를 참고하여 해당 CVE/CCE 진단항목을 필수적으로 적용시켜야 한다.
3.Kubernetes 컨테이너 서비스 배포 항목 내용은 Master Node에서 진행을 하면 된다. kubernetes에서 PaaS-TA용 컨테이너 서비스를 사용하기 위해서는 Bosh 릴리즈 배포 후 Private Repository에 등록된 이미지를 Kubernetes에 배포하여 사용하여야 한다.
3.1. K8s Cluster 설정
컨테이너 서비스 배포용 Kubernetes Master Node, Worker Node에서 daemon.json 에 insecure-registries 로 Private Image Repository URL 설정 후 Docker를 재시작한다.
# Master Node, Worker Node 모두 설정 필요
$ sudo vi /etc/docker/daemon.json
{
"insecure-registries": ["{HAProxy_IP}:5001"]
}
# docker 재시작
$ sudo systemctl restart docker
3.2. 컨테이너 서비스 이미지 업로드
Private Repository에 이미지 등록을 위해 컨테이너 서비스 이미지 파일을 다운로드 받아 아래 경로로 위치시킨다.
해당 내용은 Kubernetes Master Node에서 실행한다.
# 이미지 다운로드 파일 위치 경로 생성
$ mkdir -p ~/workspace/paasta-5.5.0/container-platform
$ cd ~/workspace/paasta-5.5.0/container-platform
# 이미지 파일 다운로드 및 파일 경로 확인
$ wget --content-disposition https://nextcloud.paas-ta.org/index.php/s/YGXAwbPonXD9tPk/download
$ ls ~/workspace/paasta-5.5.0/container-platform
cp-caas-images.tar
# 이미지 다운로드 파일 압축 해제
$ tar -xvf cp-caas-images.tar
$ cd ~/workspace/paasta-5.5.0/container-platform/container-service-image
$ ls ~/workspace/paasta-5.5.0/container-platform/container-service-image
container-jenkins-broker.tar.gz container-service-broker.tar.gz container-service-dashboard.tar.gz paasta-jenkins.tar.gz
container-service-api.tar.gz container-service-common-api.tar.gz image_upload_caas.sh
PaaS-TA 사용자포털에서 컨테이너 서비스를 추가하기 전 Kubernetes에 아래의 컨테이너 서비스 Deployment가 미리 배포되어 있어야 한다. 아래 4개의 yaml 내 nodeSelector.kubernetes.io/hostname 값은 동일한 Worker Node의 Host Name으로 설정한다.
# {NODE_HOST_NAME} 값 동일한 Worker Node의 Host Name으로 설정
nodeSelector:
kubernetes.io/hostname: {NODE_HOST_NAME}
컨테이너 플랫폼 yaml 파일 경로이동
$ cd ~/workspace/paasta-5.5.0/container-platform/container-service-yaml
$ ls ~/workspace/paasta-5.5.0/container-platform/container-service-yaml
container-jenkins-broker.yml container-service-broker.yml container-service-dashboard.yml
container-service-api.yml container-service-common-api.yml
$ kubectl apply -f container-service-common-api.yml
deployment.apps/service-common-api-deployment created
service/service-common-api-deployment created
$ kubectl apply -f container-service-api.yml
deployment.apps/service-api-deployment created
service/service-api-deployment created
$ kubectl apply -f container-service-dashboard.yml
deployment.apps/service-dashboard-deployment created
service/service-dashboard-deployment created
$ kubectl apply -f container-service-broker.yml
deployment.apps/service-deployment-deployment created
service/service-deployment-deployment created
배포 확인
배포된 Deployment, Pod, Service를 확인한다.
#Deployment 배포 정상 확인
$ kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
service-api-deployment 1/1 1 1 68s
service-common-api-deployment 1/1 1 1 78s
service-dashboard-deployment 1/1 1 1 56s
service-broker-deployment 1/1 1 1 112s
#Pod 배포 정상 확인
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
service-api-deployment-7c556d9c59-ms66r 1/1 Running 0 97s
service-common-api-deployment-689cdc8df-dxsnb 1/1 Running 0 108s
service-dashboard-deployment-d4b5fdcdb-nwrgf 1/1 Running 0 85s
service-broker-deployment-7fb5dd69f6-pdhnq 1/1 Running 0 26h
#Service 배포 정상 확인
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP xxx.xxx.xxx.xxx <none> 443/TCP 3d19h
service-api-deployment NodePort xxx.xxx.xxx.xxx <none> 3333:30333/TCP 117s
service-common-api-deployment NodePort xxx.xxx.xxx.xxx <none> 3334:30334/TCP 2m8s
service-dashboard-deployment NodePort xxx.xxx.xxx.xxx <none> 8091:32091/TCP 105s
service-broker-deployment NodePort xxx.xxx.xxx.xxx <none> 8888:31888/TCP 118s
4. 컨테이너 서비스 브로커
컨테이너 서비스 형태로 설치하는 경우에 CF와 배포된 Kubernetes와의 연동을 위해서는 컨테이너 서비스 브로커를 등록해 주어야 한다. PaaS-TA 운영자 포털을 통해 서비스를 등록하고 공개하면, PaaS-TA 사용자 포털을 통해 서비스를 신청하여 사용할 수 있다.
4.1. 컨테이너 서비스 브로커 등록
서비스 브로커 등록 시 개방형 클러스터 플랫폼에서 서비스 브로커를 등록할 수 있는 사용자로 로그인이 되어 있어야 한다.
서비스 브로커 목록을 확인한다.
$ cf service-brokers
Getting service brokers as admin...
No service brokers found
$ cf service-brokers
Getting service brokers as admin...
name url
container-service-broker http://xxx.xxx.xxx.xxx:31888
접근 가능한 서비스 목록을 확인한다.
$ cf service-access
Getting service access as admin...
broker: container-service-broker
service plan access orgs
container-service Advanced none
container-service Micro none
container-service Small none
특정 조직에 해당 서비스 접근 허용을 할당한다.
$ cf enable-service-access container-service
Enabling access to all plans of service container-service for all orgs as admin...
OK
접근 가능한 서비스 목록을 확인한다.
$ cf service-access
Getting service access as admin...
broker: container-service-broker
service plan access orgs
container-service Advanced all
container-service Micro all
container-service Small all
4.2. 컨테이너 서비스 UAA Client 등록
UAA 포털 계정 등록 절차에 대한 순서를 확인한다.
uaac의 endpoint를 설정하고 uaac 로그인을 실행한다.
# endpoint 설정
$ uaac target https://uaa.<DOMAIN> --skip-ssl-validation
# target 확인
$ uaac target
Target: https://uaa.<DOMAIN>
Context: uaa_admin, from client uaa_admin
# uaac 로그인
$ uaac token client get <UAA_ADMIN_CLIENT_ID> -s <UAA_ADMIN_CLIENT_SECRET>
Successfully fetched token via client credentials grant.
Target: https://uaa.<DOMAIN>
Context: admin, from client admin
해당 설정은 PaaS-TA 포털에 컨테이너 서비스 상의 자원들을 간략하게 조회하기 위한 설정이다.
PaaS-TA Admin 포털에 접속한다.
왼쪽 네비게이션 바에서 [설정]-[설정정보] 를 클릭한 후 나타나는 페이지의 오른쪽 상단 [인프라 등록] 버튼을 클릭하여 해당 정보들을 입력한다.
해당 정보를 입력하기 위해 필요한 값들을 찾는다.
$ bosh -e micro-bosh -d portal-api vms haproxy의 IP를 찾아 Portal_Api_Uri에 입력한다.
Deployment 'paasta-portal-api'
Instance Process State AZ IPs VM CID VM Type Active
binary_storage/acfc944b-19b9-487e-a447-c42cb2342f62 running z6 10.0.201.122 i-0af1de35c9669d11a portal_small true
haproxy/8518a6c5-6ede-409d-8e51-39e8d2ecb39b running z7 10.0.0.122 i-05613be8862607959 small true
52.78.144.229
mariadb/d32412d3-ea66-42af-a714-9ce2af4416a5 running z6 10.0.201.121 i-0e6971c85e17575a5 portal_small true
paas-ta-portal-api/992a0ca4-7857-4bc7-9e57-edc1d1ad643e running z6 10.0.201.125 i-0b2b78182049beec2 portal_medium true
paas-ta-portal-common-api/895ffa41-b401-4abb-8316-ae3bc42b3e57 running z6 10.0.201.126 i-0fa5873ed9092a4f8 portal_small true
paas-ta-portal-gateway/107836f5-e07d-446f-bc24-d727a388e16a running z6 10.0.201.123 i-067c248baed2d807a portal_small true
paas-ta-portal-log-api/301d0a23-eccc-4565-9ff6-8dac9b113440 running z6 10.0.201.128 i-045efbc8cd9f32dfd portal_small true
paas-ta-portal-registration/d70189cc-aacb-43da-876f-7fe551797792 running z6 10.0.201.124 i-0e07cb4f02250316d portal_small true
paas-ta-portal-storage-api/20170f06-6b5b-4421-8238-9cac7a276618 running z6 10.0.201.127 i-0b0ab24792fd3aa4d portal_small true
9 vms
$ bosh -e micro-bosh -d paasta-container-platform vms haproxy의 IP를 찾아 CaaS_Api_Uri에 입력한다.
Deployment 'paasta-container-platform'
Instance Process State AZ IPs VM CID VM Type Active
haproxy/cbd5d103-765d-47e0-ac5b-233a21108c77 running z7 10.0.0.122 i-0f49ce7431aaa2901 small true
15.164.15.53
mariadb/448be54d-f2ff-4fc9-8bf1-621eda8e2577 running z5 10.0.161.121 i-09b27b184b7aea066 small true
private-image-repository/561550fb-95de-4c12-95bf-94ac5fde53cc running z7 10.0.0.123 i-02ff1da176d1d0a16 small true
3 vms
[운영관리]-[카탈로그] 메뉴에서 앱서비스 탭 안에 CaaS서비스를 선택 > 서비스 항목을 Container_service로 변경 후 저장한다.
5. Jenkins 서비스 브로커(Optional)
해당 설정은 jenkins 서비스를 이용하기 위한 설정이다.
5.1. Kubernetes Cluster 설정
컨테이너 서비스 배포용 Kubernetes Master Node, Worker Node에서 daemon.json 에 insecure-registries 로 Private Image Repository URL 설정 후 Docker를 재시작한다.
# Master Node, Worker Node 모두 설정 필요
$ sudo vi /etc/docker/daemon.json
{
"insecure-registries": ["{HAProxy_IP}:5001"]
}
# docker 재시작
$ sudo systemctl restart docker
5.2. Deployment 배포
PaaS-TA 사용자포털에서 Jenkins 서비스를 추가하기 전 Kubernetes에 Jenkins 서비스 Deployment가 미리 배포되어 있어야 한다. 또한 Jenkins 서비스는 위 컨테이너 서비스(3.4. Deployment 배포)의 nodeSelector.kubernetes.io/hostname 에 설정한 Worker Node의 Host Name과 동일한 값으로 설정한다.
# {NODE_HOST_NAME} 값 컨테이너 서비스와 동일한 Worker Node의 Host Name으로 설정
nodeSelector:
kubernetes.io/hostname: {NODE_HOST_NAME}
컨테이너 플랫폼 yaml 파일 경로이동
$ cd ~/workspace/paasta-5.5.0/container-platform/container-service-yaml
$ ls ~/workspace/paasta-5.5.0/container-platform/container-service-yaml
container-jenkins-broker.yml container-service-broker.yml container-service-dashboard.yml
container-service-api.yml container-service-common-api.yml
$ kubectl apply -f container-jenkins-broker.yml
deployment.apps/jenkins-broker-deployment created
service/jenkins-broker-deployment created
배포 확인
배포된 Deployment, Pod, Service를 확인한다.
#Deployment 배포 정상 확인
$ kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
jenkins-broker-deployment 1/1 1 1 2m20s
#Pod 배포 정상 확인
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
jenkins-broker-deployment-7f84f69cf8-wgzbv 1/1 Running 0 2m30s
#Service 배포 정상 확인
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
jenkins-broker-deployment NodePort 10.233.9.92 <none> 8787:31787/TCP 2m49s
5.3. Jenkins 서비스 브로커 등록
브로커 목록을 확인한다.
$ cf service-brokers
Getting service brokers as admin...
name url
container-service-broker http://xxx.xxx.xxx.xxx:31888
$ cf service-brokers
Getting service brokers as admin...
name url
container-service-broker http://xxx.xxx.xxx.xxx:31888
jenkins-service-broker http://xxx.xxx.xxx.xxx:31787
접근 가능한 서비스 목록을 확인한다.
$ cf service-access
Getting service access as admin...
broker: container-service-broker
service plan access orgs
container-service Advanced all
container-service Micro all
container-service Small all
broker: jenkins-service-broker
service plan access orgs
container-jenkins-service jenkins_20GB limit
특정 조직에 해당 서비스 접근 허용을 할당한다.
$ cf enable-service-access container-jenkins-service
Enabling access to all plans of service container-jenkins-service for all orgs as admin...
OK
접근 가능한 서비스 목록을 확인한다.
$ cf service-access
Getting service access as admin...
broker: container-service-broker
service plan access orgs
container-service Advanced all
container-service Micro all
container-service Small all
broker: jenkins-service-broker
service plan access orgs
container-jenkins-service jenkins_20GB all