PaaS-TA-5.5.0
Search…
CaaS 서비스용 Release 설치 가이드

Table of Contents

1. 문서 개요

1.1. 목적

본 문서(컨테이너 서비스 설치 가이드)는 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에 컨테이너 서비스를 배포하는 내용이다.

1.4. 참고 자료

2. 컨테이너 서비스 설치

2.1. Prerequisite

본 설치 가이드는 Ubuntu환경에서 설치하는 것을 기준으로 작성하였다. 서비스 설치를 위해서는 BOSH 2.0과 PaaS-TA 5.5, PaaS-TA 포털 API, PaaS-TA 포털 UI가 설치 되어 있어야 한다.

2.2. Stemcell 확인

Stemcell 목록을 확인하여 서비스 설치에 필요한 Stemcell 이 업로드 되어 있는 것을 확인한다. (PaaS-TA 5.5 와 동일 Stemcell 사용)
  • Stemcell 업로드 및 Cloud Config, Runtime Config 설정 부분은 PaaS-TA 5.5 설치가이드를 참고 한다.
    $ bosh -e micro-bosh stemcells
1
Using environment '10.0.1.6' as client 'admin'
2
3
Name Version OS CPI CID
4
bosh-aws-xen-hvm-ubuntu-xenial-go_agent 621.94 ubuntu-xenial - ami-0694eb07c57faca73
5
6
(*) Currently deployed
7
8
1 stemcells
9
10
Succeeded
Copied!

2.3. Deployment 다운로드

서비스 설치에 필요한 Deployment를 Git Repository에서 받아 서비스 설치 작업 경로로 위치시킨다.
1
# Deployment 다운로드 파일 위치 경로 생성 및 이동
2
$ mkdir -p ~/workspace/paasta-5.5.0/deployment/
3
$ cd ~/workspace/paasta-5.5.0/deployment/
4
5
# Deployment 다운로드
6
$ git clone https://github.com/PaaS-TA/paas-ta-container-platform-deployment.git
7
8
# Bosh 배포 경로로 이동
9
$ cd paas-ta-container-platform-deployment/bosh/
Copied!

2.4. Deployment 파일 수정

BOSH Deployment manifest는 Components 요소 및 배포의 속성을 정의한 YAML 파일이다. Deployment 파일에서 사용하는 network, vm_type, disk_type 등은 Cloud config를 활용하고, 활용 방법은 BOSH 2.0 가이드를 참고한다.
  • Cloud config 설정 내용을 확인한다.
    $ bosh -e micro-bosh cloud-config
1
Using environment '10.0.1.6' as client 'admin'
2
3
azs:
4
- cloud_properties:
5
availability_zone: ap-northeast-2a
6
name: z1
7
- cloud_properties:
8
availability_zone: ap-northeast-2a
9
name: z2
10
11
... ((생략)) ...
12
13
disk_types:
14
- disk_size: 1024
15
name: default
16
- disk_size: 1024
17
name: 1GB
18
19
... ((생략)) ...
20
21
networks:
22
- name: default
23
subnets:
24
- az: z1
25
cloud_properties:
26
security_groups: paasta-security-group
27
subnet: subnet-00000000000000000
28
dns:
29
- 8.8.8.8
30
gateway: 10.0.1.1
31
range: 10.0.1.0/24
32
reserved:
33
- 10.0.1.2 - 10.0.1.9
34
static:
35
- 10.0.1.10 - 10.0.1.120
36
37
... ((생략)) ...
38
39
vm_types:
40
- cloud_properties:
41
ephemeral_disk:
42
size: 3000
43
type: gp2
44
instance_type: t2.small
45
name: minimal
46
- cloud_properties:
47
ephemeral_disk:
48
size: 10000
49
type: gp2
50
instance_type: t2.small
51
name: small
52
53
... ((생략)) ...
54
55
Succeeded
Copied!
일부 application의 경우 이중화를 위한 조치는 되어 있지 않으며 인스턴스 수 조정 시 신규로 생성되는 인스턴스에는 데이터의 반영이 안될 수 있으니, 1개의 인스턴스로 유지한다.
  • Deployment YAML에서 사용하는 변수 파일을 서버 환경에 맞게 수정한다.
    $ vi ~/workspace/paasta-5.5.0/deployment/paas-ta-container-platform-deployment/bosh/manifests/paasta-container-service-vars-{IAAS}.yml (e.g. {IAAS} :: aws)
IPS - k8s_api_server_ip : Kubernetes Master Node IP IPS - k8s_auth_bearer : Kubespray 설치 가이드 - 4.1. Cluster Role 운영자 생성 및 Token 획득
1
# INCEPTION OS USER NAME
2
inception_os_user_name: "ubuntu"
3
4
# REQUIRED FILE PATH VARIABLE
5
paasta_version: "5.5"
6
7
# RELEASE
8
container_platform_release_name: "paasta-container-platform"
9
container_platform_release_version: "1.0"
10
11
# IAAS
12
kubernetes_cluster_tag: 'kubernetes' # Do not update!
13
14
# STEMCELL
15
stemcell_os: "ubuntu-xenial" # stemcell os
16
stemcell_version: "621.94" # stemcell version
17
stemcell_alias: "xenial" # stemcell alias
18
19
# CREDHUB
20
credhub_server_url: "10.0.1.6:8844"
21
credhub_admin_client_secret: "eft2zkfaerzyt8g6eonj"
22
23
# VM_TYPE
24
vm_type_small: "small" # vm type small
25
vm_type_small_highmem_16GB: "small-highmem-16GB" # vm type small highmem
26
vm_type_small_highmem_16GB_100GB: "small-highmem-16GB" # vm type small highmem_100GB
27
vm_type_container_small: "small" # vm type small for caas's etc
28
vm_type_container_small_api: "small" # vm type small for caas's api
29
30
# NETWORK
31
service_private_nat_networks_name: "default" # private network name
32
service_private_networks_name: "default"
33
service_public_networks_name: "vip" # public network name
34
35
# IPS
36
haproxy_public_url: "<HAPROXY_IP>" # haproxy's public IP
37
k8s_api_server_ip: "<KUBERNETES_API_SERVER_IP>" # kubernetes master node IP
38
k8s_api_server_port: "6443"
39
k8s_auth_bearer: "<KUBERNETES_AUTH_KEY>" # kubernetes bearer token
40
41
# HAPROXY
42
haproxy_http_port: 8080 # haproxy port
43
haproxy_azs: [z7] # haproxy azs
44
45
# MARIADB
46
mariadb_port: "13306" # mariadb port (e.g. 13306)-- Do Not Use "3306"
47
mariadb_azs: [z5] # mariadb azs
48
mariadb_persistent_disk_type: "10GB" # mariadb persistent disk type
49
mariadb_admin_user_id: "cp-admin" # mariadb admin user name (e.g. cp-admin)
50
mariadb_admin_user_password: "[email protected]" # mariadb admin user password (e.g. [email protected])
51
mariadb_role_set_administrator_code_name: "Administrator" # administrator role's code name (e.g. Administrator)
52
mariadb_role_set_administrator_code: "RS0001" # administrator role's code (e.g. RS0001)
53
mariadb_role_set_regular_user_code_name: "Regular User" # regular user role's code name (e.g. Regular User)
54
mariadb_role_set_regular_user_code: "RS0002" # regular user role's code (e.g. RS0002)
55
mariadb_role_set_init_user_code_name: "Init User" # init user role's code name (e.g. Init User)
56
mariadb_role_set_init_user_code: "RS0003" # init user role's code (e.g. RS0003)
57
58
# PRIVATE IMAGE REPOSITORY
59
private_image_repository_azs: [z7] # private image repository azs
60
private_image_repository_port: 5001 # private image repository port (e.g. 5001)-- Do Not Use "5000"
61
private_image_repository_root_directory: "/var/vcap/data/private-image-repository" # private image repository root directory
62
private_image_repository_persistent_disk_type: "10GB" # private image repository's persistent disk type
Copied!
  • 서버 환경에 맞추어 Deploy 스크립트 파일의 VARIABLES 설정을 수정한다.
    $ vi ~/workspace/paasta-5.5.0/deployment/paas-ta-container-platform-deployment/bosh/deploy-{IAAS}.sh (e.g. {IAAS} :: aws)
1
#!/bin/bash
2
3
# SET VARIABLES
4
export CONTAINER_DEPLOYMENT_NAME='paasta-container-platform' # deployment name
5
export CONTAINER_BOSH2_NAME='micro-bosh' # bosh name (e.g. micro-bosh)
6
export CONTAINER_BOSH2_UUID=`bosh int <(bosh -e ${CONTAINER_BOSH2_NAME} environment --json) --path=/Tables/0/Rows/0/uuid`
7
8
# DEPLOY
9
bosh -e ${CONTAINER_BOSH2_NAME} -n -d ${CONTAINER_DEPLOYMENT_NAME} deploy --no-redact manifests/paasta-container-service-deployment-aws.yml \
10
-l manifests/paasta-container-service-vars-aws.yml \
11
-o manifests/ops-files/paasta-container-service/network-aws.yml \
12
-o manifests/ops-files/misc/first-time-deploy.yml \
13
-v deployment_name=${CONTAINER_DEPLOYMENT_NAME} \
14
-v director_name=${CONTAINER_BOSH2_NAME} \
15
-v director_uuid=${CONTAINER_BOSH2_UUID}
Copied!

2.5. 서비스 설치

  • 서비스 설치에 필요한 릴리즈 파일을 다운로드 받아 Local machine의 서비스 설치 작업 경로로 위치시킨다.
1
# 릴리즈 다운로드 파일 위치 경로 생성
2
$ mkdir -p ~/workspace/paasta-5.5.0/release/service
3
$ cd ~/workspace/paasta-5.5.0/release/service
4
5
# 릴리즈 파일 다운로드 및 파일 경로 확인
6
$ wget --content-disposition https://nextcloud.paas-ta.org/index.php/s/zYjJg9yffxwSbFT/download
7
$ ls ~/workspace/paasta-5.5.0/release/service
8
paasta-container-platform-1.0.tgz
Copied!
  • 서비스를 설치한다.
1
$ cd ~/workspace/paasta-5.5.0/deployment/paas-ta-container-platform-deployment/bosh
2
$ chmod +x *.sh
3
$ ./deploy-{IAAS}.sh
Copied!

2.6. 서비스 설치 확인

설치 완료된 서비스를 확인한다.
$ bosh -e micro-bosh -d paasta-container-platform vms
1
Using environment '10.0.1.6' as client 'admin'
2
3
Task 2983. Done
4
5
Deployment 'paasta-container-platform'
6
7
Instance Process State AZ IPs VM CID VM Type Active
8
haproxy/cbd5d103-765d-47e0-ac5b-233a21108c77 running z7 10.0.0.122 i-0f49ce7431aaa2901 small true
9
15.164.15.53
10
mariadb/448be54d-f2ff-4fc9-8bf1-621eda8e2577 running z5 10.0.161.121 i-09b27b184b7aea066 small true
11
private-image-repository/561550fb-95de-4c12-95bf-94ac5fde53cc running z7 10.0.0.123 i-02ff1da176d1d0a16 small true
12
13
3 vms
14
15
Succeeded
Copied!

2.7. CVE/CCE 진단항목 적용

배포된 Kubernetes Cluster, BOSH Inception 환경에 아래 가이드를 참고하여 해당 CVE/CCE 진단항목을 필수적으로 적용시켜야 한다.

3. Kubernetes 컨테이너 서비스 배포

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를 재시작한다.
1
# Master Node, Worker Node 모두 설정 필요
2
$ sudo vi /etc/docker/daemon.json
3
{
4
"insecure-registries": ["{HAProxy_IP}:5001"]
5
}
6
7
# docker 재시작
8
$ sudo systemctl restart docker
Copied!

3.2. 컨테이너 서비스 이미지 업로드

Private Repository에 이미지 등록을 위해 컨테이너 서비스 이미지 파일을 다운로드 받아 아래 경로로 위치시킨다. 해당 내용은 Kubernetes Master Node에서 실행한다.
1
# 이미지 다운로드 파일 위치 경로 생성
2
$ mkdir -p ~/workspace/paasta-5.5.0/container-platform
3
$ cd ~/workspace/paasta-5.5.0/container-platform
4
5
# 이미지 파일 다운로드 및 파일 경로 확인
6
$ wget --content-disposition https://nextcloud.paas-ta.org/index.php/s/YGXAwbPonXD9tPk/download
7
8
$ ls ~/workspace/paasta-5.5.0/container-platform
9
cp-caas-images.tar
10
11
# 이미지 다운로드 파일 압축 해제
12
$ tar -xvf cp-caas-images.tar
13
$ cd ~/workspace/paasta-5.5.0/container-platform/container-service-image
14
$ ls ~/workspace/paasta-5.5.0/container-platform/container-service-image
15
container-jenkins-broker.tar.gz container-service-broker.tar.gz container-service-dashboard.tar.gz paasta-jenkins.tar.gz
16
container-service-api.tar.gz container-service-common-api.tar.gz image_upload_caas.sh
Copied!
  • Private Repository에 이미지를 업로드한다.
    1
    $ chmod +x *.sh
    2
    $ ./image_upload_caas.sh {HAProxy_IP}:5001
    Copied!
  • Private Repository에 업로드 된 이미지 목록을 확인한다.
    1
    $ curl -H 'Authorization:Basic YWRtaW46YWRtaW4=' http://{HAProxy_IP}:5001/v2/_catalog
    2
    3
    {"repositories":["container-jenkins-broker","container-service-api","container-service-broker","container-service-common-api","container-service-dashboard","paasta_jenkins"]}
    Copied!

3.3. Secret 생성

Private Repository에 등록된 이미지를 활용하기 위해 Kubernetes에 secret을 생성한다.
1
$ kubectl create secret docker-registry cp-secret --docker-server={HAProxy_IP}:5001 --docker-username=admin --docker-password=admin --namespace=default
Copied!

3.4. Deployment 배포

PaaS-TA 사용자포털에서 컨테이너 서비스를 추가하기 전 Kubernetes에 아래의 컨테이너 서비스 Deployment가 미리 배포되어 있어야 한다. 아래 4개의 yaml 내 nodeSelector.kubernetes.io/hostname 값은 동일한 Worker Node의 Host Name으로 설정한다.
1
# {NODE_HOST_NAME} 값 동일한 Worker Node의 Host Name으로 설정
2
nodeSelector:
3
kubernetes.io/hostname: {NODE_HOST_NAME}
Copied!
  • 컨테이너 플랫폼 yaml 파일 경로이동
1
$ cd ~/workspace/paasta-5.5.0/container-platform/container-service-yaml
2
$ ls ~/workspace/paasta-5.5.0/container-platform/container-service-yaml
3
container-jenkins-broker.yml container-service-broker.yml container-service-dashboard.yml
4
container-service-api.yml container-service-common-api.yml
Copied!

3.4.1. container-service-common-api 배포

$ vi container-service-common-api.yml
1
apiVersion: apps/v1
2
kind: Deployment
3
metadata:
4
name: service-common-api-deployment
5
labels:
6
app: service-common-api
7
namespace: default
8
spec:
9
replicas: 1
10
selector:
11
matchLabels:
12
app: service-common-api
13
template:
14
metadata:
15
labels:
16
app: service-common-api
17
spec:
18
containers:
19
- name: service-common-api
20
image: {HAProxy_IP}:5001/container-service-common-api:latest
21
imagePullPolicy: Always
22
ports:
23
- containerPort: 3334
24
env:
25
- name: HAPROXY_IP
26
value: {HAProxy_IP}
27
- name: MARIADB_USER_ID
28
value: {MARIADB_USER_ID} # (e.g. cp-admin)
29
- name: MARIADB_USER_PASSWORD
30
value: {MARIADB_USER_PASSWORD}
31
- name: MARIADB_PORT
32
value: "13306"
33
imagePullSecrets:
34
- name: cp-secret
35
nodeSelector:
36
kubernetes.io/hostname: {NODE_HOST_NAME} # Worker Node Host Name
37
38
apiVersion: v1
39
kind: Service
40
metadata:
41
name: service-common-api-deployment
42
labels:
43
app: service-common-api
44
namespace: default
45
spec:
46
ports:
47
- nodePort: 30334
48
port: 3334
49
protocol: TCP
50
targetPort: 3334
51
selector:
52
app: service-common-api
53
type: NodePort
Copied!

3.4.2. container-service-api 배포

$ vi container-service-api.yml
1
apiVersion: apps/v1
2
kind: Deployment
3
metadata:
4
name: service-api-deployment
5
labels:
6
app: service-api
7
namespace: default
8
spec:
9
replicas: 1
10
selector:
11
matchLabels:
12
app: service-api
13
template:
14
metadata:
15
labels:
16
app: service-api
17
spec:
18
containers:
19
- name: service-api
20
image: {HAProxy_IP}:5001/container-service-api:latest
21
imagePullPolicy: Always
22
ports:
23
- containerPort: 3333
24
env:
25
- name: K8S_IP
26
value: {K8S_IP} # Master Node IP
27
imagePullSecrets:
28
- name: cp-secret
29
nodeSelector:
30
kubernetes.io/hostname: {NODE_HOST_NAME} # Worker Node Host Name
31
32
apiVersion: v1
33
kind: Service
34
metadata:
35
name: service-api-deployment
36
labels:
37
app: service-api
38
namespace: default
39
spec:
40
ports:
41
- nodePort: 30333
42
port: 3333
43
protocol: TCP
44
targetPort: 3333
45
selector:
46
app: service-api
47
type: NodePort
Copied!

3.4.3. container-service-dashboard 배포

$ vi container-service-dashboard.yml
1
apiVersion: apps/v1
2
kind: Deployment
3
metadata:
4
name: service-dashboard-deployment
5
labels:
6
app: service-dashboard
7
namespace: default
8
spec:
9
replicas: 1
10
selector:
11
matchLabels:
12
app: service-dashboard
13
template:
14
metadata:
15
labels:
16
app: service-dashboard
17
spec:
18
containers:
19
- name: service-dashboard
20
image: {HAProxy_IP}:5001/container-service-dashboard:latest
21
imagePullPolicy: Always
22
ports:
23
- containerPort: 8091
24
env:
25
- name: K8S_IP
26
value: {K8S_IP} # Master Node IP
27
- name: SYSTEM_DOMAIN
28
value: {PAASTA_SYSTEM_DOMAIN}
29
- name: HAPROXY_IP
30
value: {HAProxy_IP}
31
imagePullSecrets:
32
- name: cp-secret
33
nodeSelector:
34
kubernetes.io/hostname: {NODE_HOST_NAME} # Worker Node Host Name
35
36
apiVersion: v1
37
kind: Service
38
metadata:
39
name: service-dashboard-deployment
40
labels:
41
app: service-dashboard
42
namespace: default
43
spec:
44
ports:
45
- nodePort: 32091
46
port: 8091
47
protocol: TCP
48
targetPort: 8091
49
selector:
50
app: service-dashboard
51
type: NodePort
Copied!

3.4.4. container-service-broker 배포

$ vi container-service-broker.yml
1
apiVersion: apps/v1
2
kind: Deployment
3
metadata:
4
name: service-broker-deployment
5
labels:
6
app: service-broker
7
namespace: default
8
spec:
9
replicas: 1
10
selector:
11
matchLabels:
12
app: service-broker
13
template:
14
metadata:
15
labels:
16
app: service-broker
17
spec:
18
containers:
19
- name: service-broker
20
image: {HAPROXY_IP}:5001/container-service-broker:latest
21
imagePullPolicy: Always
22
ports:
23
- containerPort: 8091
24
env:
25
- name: K8S_IP
26
value: {K8S_IP} # Master Node IP
27
- name: K8S_PORT
28
value: "6443"
29
- name: K8S_AUTH_BEARER
30
value: {K8S_AUTH_BEARER}
31
- name: HAPROXY_IP
32
value: {HAPROXY_IP}
33
- name: MARIADB_USER_ID
34
value: {MARIADB_USER_ID} # (e.g. cp-admin)
35
- name: MARIADB_USER_PASSWORD
36
value: {MARIADB_USER_PASSWORD}
37
- name: COMMON_API_ID
38
value: admin
39
- name: COMMON_API_PASSWORD
40
value: PaaS-TA
41
- name: LOGGGING_LEVEL
42
value: INFO
43
- name: REGISTRY_PORT
44
value: "5001"
45
- name: MARIADB_PORT
46
value: "13306"
47
- name: NODE_IP
48
value: {NODE_IP} # Worker Node IP
49
imagePullSecrets:
50
- name: cp-secret
51
nodeSelector:
52
kubernetes.io/hostname: {NODE_HOST_NAME} # Worker Node Host Name
53
54
apiVersion: v1
55
kind: Service
56
metadata:
57
name: service-broker-deployment
58
labels:
59
app: service-broker
60
namespace: default
61
spec:
62
ports:
63
- nodePort: 31888
64
port: 8888
65
protocol: TCP
66
targetPort: 8888
67
selector:
68
app: service-broker
69
type: NodePort
Copied!
1
$ kubectl apply -f container-service-common-api.yml
2
deployment.apps/service-common-api-deployment created
3
service/service-common-api-deployment created
4
5
$ kubectl apply -f container-service-api.yml
6
deployment.apps/service-api-deployment created
7
service/service-api-deployment created
8
9
$ kubectl apply -f container-service-dashboard.yml
10
deployment.apps/service-dashboard-deployment created
11
service/service-dashboard-deployment created
12
13
$ kubectl apply -f container-service-broker.yml
14
deployment.apps/service-deployment-deployment created
15
service/service-deployment-deployment created
Copied!
  • 배포 확인
배포된 Deployment, Pod, Service를 확인한다.
1
#Deployment 배포 정상 확인
2
$ kubectl get deployments
3
NAME READY UP-TO-DATE AVAILABLE AGE
4
service-api-deployment 1/1 1 1 68s
5
service-common-api-deployment 1/1 1 1 78s
6
service-dashboard-deployment 1/1 1 1 56s
7
service-broker-deployment 1/1 1 1 112s
8
9
#Pod 배포 정상 확인
10
$ kubectl get pods
11
NAME READY STATUS RESTARTS AGE
12
service-api-deployment-7c556d9c59-ms66r 1/1 Running 0 97s
13
service-common-api-deployment-689cdc8df-dxsnb 1/1 Running 0 108s
14
service-dashboard-deployment-d4b5fdcdb-nwrgf 1/1 Running 0 85s
15
service-broker-deployment-7fb5dd69f6-pdhnq 1/1 Running 0 26h
16
17
#Service 배포 정상 확인
18
$ kubectl get svc
19
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
20
kubernetes ClusterIP xxx.xxx.xxx.xxx <none> 443/TCP 3d19h
21
service-api-deployment NodePort xxx.xxx.xxx.xxx <none> 3333:30333/TCP 117s
22
service-common-api-deployment NodePort xxx.xxx.xxx.xxx <none> 3334:30334/TCP 2m8s
23
service-dashboard-deployment NodePort xxx.xxx.xxx.xxx <none> 8091:32091/TCP 105s
24
service-broker-deployment NodePort xxx.xxx.xxx.xxx <none> 8888:31888/TCP 118s
Copied!

4. 컨테이너 서비스 브로커

컨테이너 서비스 형태로 설치하는 경우에 CF와 배포된 Kubernetes와의 연동을 위해서는 컨테이너 서비스 브로커를 등록해 주어야 한다. PaaS-TA 운영자 포털을 통해 서비스를 등록하고 공개하면, PaaS-TA 사용자 포털을 통해 서비스를 신청하여 사용할 수 있다.

4.1. 컨테이너 서비스 브로커 등록

서비스 브로커 등록 시 개방형 클러스터 플랫폼에서 서비스 브로커를 등록할 수 있는 사용자로 로그인이 되어 있어야 한다.
  • 서비스 브로커 목록을 확인한다.
1
$ cf service-brokers
2
Getting service brokers as admin...
3
No service brokers found
Copied!
  • 컨테이너 서비스 브로커를 등록한다.
    $ create-service-broker {서비스팩 이름} {서비스팩 사용자ID} {서비스팩 사용자비밀번호} http://{Worker Node IP}:31888
    • 서비스팩 이름 : 서비스 팩 관리를 위해 개방형 클라우드 플랫폼에서 보여지는 명칭
    • 서비스팩 사용자 ID/비밀번호 : 서비스팩에 접근할 수 있는 사용자 ID/비밀번호
    • 서비스팩 URL : Kubernetes Worker Node IP 와 배포된 컨테이너 서비스 브로커 NodePort
1
$ cf create-service-broker container-service-broker admin cloudfoundry http://xxx.xxx.xxx.xxx:31888
Copied!
  • 등록된 컨테이너 서비스 브로커를 확인한다.
1
$ cf service-brokers
2
Getting service brokers as admin...
3
4
name url
5
container-service-broker http://xxx.xxx.xxx.xxx:31888
Copied!
  • 접근 가능한 서비스 목록을 확인한다.
1
$ cf service-access
2
Getting service access as admin...
3
broker: container-service-broker
4
service plan access orgs
5
container-service Advanced none
6
container-service Micro none
7
container-service Small none
Copied!
  • 특정 조직에 해당 서비스 접근 허용을 할당한다.
1
$ cf enable-service-access container-service
2
Enabling access to all plans of service container-service for all orgs as admin...
3
OK
Copied!
  • 접근 가능한 서비스 목록을 확인한다.
1
$ cf service-access
2
Getting service access as admin...
3
broker: container-service-broker
4
service plan access orgs
5
container-service Advanced all
6
container-service Micro all
7
container-service Small all
Copied!

4.2. 컨테이너 서비스 UAA Client 등록

UAA 포털 계정 등록 절차에 대한 순서를 확인한다.
  • uaac의 endpoint를 설정하고 uaac 로그인을 실행한다.
1
# endpoint 설정
2
$ uaac target https://uaa.<DOMAIN> --skip-ssl-validation
3
4
# target 확인
5
$ uaac target
6
Target: https://uaa.<DOMAIN>
7
Context: uaa_admin, from client uaa_admin
8
9
# uaac 로그인
10
$ uaac token client get <UAA_ADMIN_CLIENT_ID> -s <UAA_ADMIN_CLIENT_SECRET>
11
Successfully fetched token via client credentials grant.
12
Target: https://uaa.<DOMAIN>
13
Context: admin, from client admin
Copied!
  • 컨테이너 서비스 계정 생성을 한다.
$ uaac client add caasclient -s {클라이언트 비밀번호} --redirect_uri "http://{Worker Node IP}:32091, http://{Worker Node IP}:32091/callback" --scope {퍼미션 범위} --authorized_grant_types {권한 타입} --authorities={권한 퍼미션} --autoapprove={자동승인권한}
  • <클라이언트 비밀번호> : uaac 클라이언트 secret
  • <컨테이너 서비스 DashBoard URI> : 성공적으로 리다이렉션 할 컨테이너 서비스 접근 URI (Kubernetes Worker Node IP 와 배포된 컨테이너 서비스 대시보드 NodePort)
  • <퍼미션 범위> : 클라이언트가 사용자를 대신하여 얻을 수있는 허용 범위 목록
  • <권한 타입> : 서비스가 제공하는 API를 사용할 수 있는 권한 목록
  • <권한 퍼미션> : 클라이언트에 부여 된 권한 목록
  • <자동승인권한> : 사용자 승인이 필요하지 않은 권한 목록
1
# e.g. 컨테이너 서비스 계정 생성
2
$ uaac client add caasclient -s clientsecret --redirect_uri "http://xxx.xxx.xxx.xxx:32091, http://xxx.xxx.xxx.xxx:32091/callback" \
3
--scope "cloud_controller_service_permissions.read , openid , cloud_controller.read , cloud_controller.write , cloud_controller.admin" \
4
--authorized_grant_types "authorization_code , client_credentials , refresh_token" \
5
--authorities="uaa.resource" \
6
--autoapprove="openid , cloud_controller_service_permissions.read"
7
8
9
# e.g. 컨테이너 서비스 계정 생성 확인
10
$ uaac clients
11
12
caasclient
13
scope: cloud_controller.read cloud_controller.write
14
cloud_controller_service_permissions.read openid cloud_controller.admin
15
resource_ids: none
16
authorized_grant_types: refresh_token client_credentials authorization_code
17
redirect_uri: http://xxx.xxx.xxx.xxx:32091/callback http://xxx.xxx.xxx.xxx:32091
18
autoapprove: cloud_controller_service_permissions.read openid
19
authorities: uaa.resource
20
name: caasclient
21
lastmodified: 1612173849506
Copied!
  • uaac caasclient의 redirect_uri가 잘못 등록되어있다면 uaac client update를 통해 uri를 수정해야한다.
    $ uaac client update caasclient --redirect_uri "{http://{Worker Node IP}:32091}, {http://{Worker Node IP}:32091}/callback"
1
# e.g. caasclient redirect_uri update
2
$ uaac client update caasclient --redirect_uri "http://xxx.xxx.xxx.xxx:32091, http://xxx.xxx.xxx.xxx:32091/callback"
Copied!

4.3. PaaS-TA 포털에서 컨테이너 서비스 조회 설정

해당 설정은 PaaS-TA 포털에 컨테이너 서비스 상의 자원들을 간략하게 조회하기 위한 설정이다.
  1. 1.
    PaaS-TA Admin 포털에 접속한다.
  2. 2.
    왼쪽 네비게이션 바에서 [설정]-[설정정보] 를 클릭한 후 나타나는 페이지의 오른쪽 상단 [인프라 등록] 버튼을 클릭하여 해당 정보들을 입력한다.
    • 해당 정보를 입력하기 위해 필요한 값들을 찾는다.
      $ bosh -e micro-bosh -d portal-api vms haproxy의 IP를 찾아 Portal_Api_Uri에 입력한다.
1
Deployment 'paasta-portal-api'
2
3
Instance Process State AZ IPs VM CID VM Type Active
4
binary_storage/acfc944b-19b9-487e-a447-c42cb2342f62 running z6 10.0.201.122 i-0af1de35c9669d11a portal_small true
5
haproxy/8518a6c5-6ede-409d-8e51-39e8d2ecb39b running z7 10.0.0.122 i-05613be8862607959 small true
6
52.78.144.229
7
mariadb/d32412d3-ea66-42af-a714-9ce2af4416a5 running z6 10.0.201.121 i-0e6971c85e17575a5 portal_small true
8
paas-ta-portal-api/992a0ca4-7857-4bc7-9e57-edc1d1ad643e running z6 10.0.201.125 i-0b2b78182049beec2 portal_medium true
9
paas-ta-portal-common-api/895ffa41-b401-4abb-8316-ae3bc42b3e57 running z6 10.0.201.126 i-0fa5873ed9092a4f8 portal_small true
10
paas-ta-portal-gateway/107836f5-e07d-446f-bc24-d727a388e16a running z6 10.0.201.123 i-067c248baed2d807a portal_small true
11
paas-ta-portal-log-api/301d0a23-eccc-4565-9ff6-8dac9b113440 running z6 10.0.201.128 i-045efbc8cd9f32dfd portal_small true
12
paas-ta-portal-registration/d70189cc-aacb-43da-876f-7fe551797792 running z6 10.0.201.124 i-0e07cb4f02250316d portal_small true
13
paas-ta-portal-storage-api/20170f06-6b5b-4421-8238-9cac7a276618 running z6 10.0.201.127 i-0b0ab24792fd3aa4d portal_small true
14
15
9 vms
Copied!
$ bosh -e micro-bosh -d paasta-container-platform vms haproxy의 IP를 찾아 CaaS_Api_Uri에 입력한다.
1
Deployment 'paasta-container-platform'
2
3
Instance Process State AZ IPs VM CID VM Type Active
4
haproxy/cbd5d103-765d-47e0-ac5b-233a21108c77 running z7 10.0.0.122 i-0f49ce7431aaa2901 small true
5
15.164.15.53
6
mariadb/448be54d-f2ff-4fc9-8bf1-621eda8e2577 running z5 10.0.161.121 i-09b27b184b7aea066 small true
7
private-image-repository/561550fb-95de-4c12-95bf-94ac5fde53cc running z7 10.0.0.123 i-02ff1da176d1d0a16 small true
8
9
3 vms
Copied!
1
ex)
2
- NAME : PaaS-TA 5.0 (Openstack)
3
- Portal_Api_Uri : http://<portal_haproxy_IP>:2225
4
- UAA_Uri : https://api.<CF DOMAIN>
5
- Authorization : Basic YWRtaW46b3BlbnBhYXN0YQ==
6
- 설명 : PaaS-TA 5.0 install infra
7
- CaaS_Api_Uri : http://<container_service_haproxy_IP>
8
- CaaS_Authorization : Basic YWRtaW46UGFhUy1UQQ==
Copied!
[운영관리]-[카탈로그] 메뉴에서 앱서비스 탭 안에 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를 재시작한다.
1
# Master Node, Worker Node 모두 설정 필요
2
$ sudo vi /etc/docker/daemon.json
3
{
4
"insecure-registries": ["{HAProxy_IP}:5001"]
5
}
6
7
# docker 재시작
8
$ sudo systemctl restart docker
Copied!

5.2. Deployment 배포

PaaS-TA 사용자포털에서 Jenkins 서비스를 추가하기 전 Kubernetes에 Jenkins 서비스 Deployment가 미리 배포되어 있어야 한다. 또한 Jenkins 서비스는 위 컨테이너 서비스(3.4. Deployment 배포)의 nodeSelector.kubernetes.io/hostname 에 설정한 Worker Node의 Host Name과 동일한 값으로 설정한다.
1
# {NODE_HOST_NAME} 값 컨테이너 서비스와 동일한 Worker Node의 Host Name으로 설정
2
nodeSelector:
3
kubernetes.io/hostname: {NODE_HOST_NAME}
Copied!
  • 컨테이너 플랫폼 yaml 파일 경로이동
1
$ cd ~/workspace/paasta-5.5.0/container-platform/container-service-yaml
2
$ ls ~/workspace/paasta-5.5.0/container-platform/container-service-yaml
3
container-jenkins-broker.yml container-service-broker.yml container-service-dashboard.yml
4
container-service-api.yml container-service-common-api.yml
Copied!

5.2.1. container-jenkins-broker 배포

$ vi container-jenkins-broker.yml
1
apiVersion: apps/v1
2
kind: Deployment
3
metadata:
4
name: jenkins-broker-deployment
5
labels:
6
app: jenkins-broker
7
namespace: default
8
spec:
9
replicas: 1
10
selector:
11
matchLabels:
12
app: jenkins-broker
13
template:
14
metadata:
15
labels:
16
app: jenkins-broker
17
spec:
18
containers:
19
- name: jenkins-broker
20
image: {HAPROXY_IP}:5001/container-jenkins-broker:latest
21
imagePullPolicy: Always
22
ports:
23
- containerPort: 8091
24
env:
25
- name: K8S_IP
26
value: {K8S_IP} # Master Node IP
27
- name: K8S_PORT
28
value: "6443"
29
- name: K8S_AUTH_BEARER
30
value: {K8S_AUTH_BEARER}
31
- name: HAPROXY_IP
32
value: {HAPROXY_IP}
33
- name: MARIADB_USER_ID
34
value: {MARIADB_USER_ID} # (e.g. cp-admin)
35
- name: MARIADB_USER_PASSWORD
36
value: {MARIADB_USER_PASSWORD}
37
- name: REGISTRY_PORT
38
value: "5001"
39
- name: MARIADB_PORT
40
value: "13306"
41
- name: NODE_IP
42
value: {NODE_IP} # Worker Node IP
43
imagePullSecrets:
44
- name: cp-secret
45
nodeSelector:
46
kubernetes.io/hostname: {NODE_HOST_NAME} # Worker Node Host Name
47
48
apiVersion: v1
49
kind: Service
50
metadata:
51
name: jenkins-broker-deployment
52
labels:
53
app: jenkins-broker
54
namespace: default
55
spec:
56
ports:
57
- nodePort: 31787
58
port: 8787
59
protocol: TCP
60
targetPort: 8787
61
selector:
62
app: jenkins-broker
63
type: NodePort
Copied!
1
$ kubectl apply -f container-jenkins-broker.yml
2
deployment.apps/jenkins-broker-deployment created
3
service/jenkins-broker-deployment created
Copied!
  • 배포 확인
배포된 Deployment, Pod, Service를 확인한다.
1
#Deployment 배포 정상 확인
2
$ kubectl get deployments
3
NAME READY UP-TO-DATE AVAILABLE AGE
4
jenkins-broker-deployment 1/1 1 1 2m20s
5
6
#Pod 배포 정상 확인
7
$ kubectl get pods
8
NAME READY STATUS RESTARTS AGE
9
jenkins-broker-deployment-7f84f69cf8-wgzbv 1/1 Running 0 2m30s
10
11
#Service 배포 정상 확인
12
$ kubectl get svc
13
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
14
jenkins-broker-deployment NodePort 10.233.9.92 <none> 8787:31787/TCP 2m49s
Copied!

5.3. Jenkins 서비스 브로커 등록

  • 브로커 목록을 확인한다.
1
$ cf service-brokers
2
Getting service brokers as admin...
3
4
name url
5
container-service-broker http://xxx.xxx.xxx.xxx:31888
Copied!
  • Jenkins 서비스 브로커를 등록한다.
    $ create-service-broker {서비스팩 이름} {서비스팩 사용자ID} {서비스팩 사용자비밀번호} http://{Worker Node IP}:31787
    • 서비스팩 이름 : 서비스 팩 관리를 위해 개방형 클라우드 플랫폼에서 보여지는 명칭
    • 서비스팩 사용자 ID/비밀번호 : 서비스팩에 접근할 수 있는 사용자 ID/비밀번호
    • 서비스팩 URL : Kubernetes Worker Node IP 와 배포된 Jenkins 서비스 브로커 NodePort
1
$ cf create-service-broker jenkins-service-broker admin cloudfoundry http://xxx.xxx.xxx.xxx:31787
Copied!
  • 등록된 Jenkins 서비스 브로커를 확인한다.
1
$ cf service-brokers
2
Getting service brokers as admin...
3
4
name url
5
container-service-broker http://xxx.xxx.xxx.xxx:31888
6
jenkins-service-broker http://xxx.xxx.xxx.xxx:31787
Copied!
  • 접근 가능한 서비스 목록을 확인한다.
1
$ cf service-access
2
Getting service access as admin...
3
broker: container-service-broker
4
service plan access orgs
5
container-service Advanced all
6
container-service Micro all
7
container-service Small all
8
9
broker: jenkins-service-broker
10
service plan access orgs
11
container-jenkins-service jenkins_20GB limit
Copied!
  • 특정 조직에 해당 서비스 접근 허용을 할당한다.
1
$ cf enable-service-access container-jenkins-service
2
Enabling access to all plans of service container-jenkins-service for all orgs as admin...
3
OK
Copied!
  • 접근 가능한 서비스 목록을 확인한다.
1
$ cf service-access
2
Getting service access as admin...
3
broker: container-service-broker
4
service plan access orgs
5
container-service Advanced all
6
container-service Micro all
7
container-service Small all
8
9
broker: jenkins-service-broker
10
service plan access orgs
11
container-jenkins-service jenkins_20GB all
Copied!
Last modified 8mo ago