오픈 클라우드 플랫폼 K-PaaS (구 PaaS-TA) 6.5 Container Platform Portal 사용하기
본 문서는 공식 Documents 를 참고하여 실습한 후 작성된 내용으로 구성되어 있습니다.
컨테이너 플랫폼 포털 URL 은 master 서버 (IP 또는 호스트명) 와 포트 32703 을 이용해 접근이 가능합니다.
http://115.68.142.67:32703
1. 일반 사용자 추가
컨테이너 플랫폼 포털 (이하 '포털') 로그인 화면에서 하단의 'Register' 버튼을 눌러 회원가입을 합니다.
회원가입시 Username 은 로그인 아이디에 해당 되는 부분이므로 영문 작성을 하면 되고, [Register] 버튼을 눌러 가입하면 '관리자의 승인이 필요' 하다는 메세지가 출력됩니다.
관리자는 승인을 기다리는 계정에 Namespace (프로젝트) 를 생성 후 Role (권한) 부여를 해주어야 합니다.
테스트 목적으로 아래와 같이 설정하였습니다.
1) Namespace 및 Role 생성
위치 : Clusters > Namespaces 화면에서 [생성] 버튼 클릭
> Name : mynamespace 입력 (소문자로만 입력해야 합니다)
> Resource Quotas : cp-low-resourcequota 선택
> Limit Ranges : cp-low-limitrange 선택
> [저장] 버튼을 눌러 생성합니다.
2) Namespace 및 Role 할당
위치 : 포털 로그인 > Managements > Users > 'User' 탭 > '비활성' 탭 클릭
> 사용자 계정을 클릭 후, 하단 [수정] 버튼을 누릅니다.
> Authority : [User] 로 선택합니다.
> Namespaces ⁄ Roles 옆에 [선택] 클릭합니다.
> 위에서 생성했던 mynamespace (cp-admin-role) 체크 > [선택 완료] > [수정]
이제 계정이 활성 처리 되었습니다.
admin 을 로그아웃하고 일반 사용자 계정으로 로그인합니다.
2. 응용프로그램 배포
admin 계정으로는 모든 메뉴의 권한이 열려 있기 때문에 K-PaaS 에서 제공하는 기능을 모두 사용할 수 있습니다.
여기에서는 위에서 생성했던 일반 사용자 계정으로 응용프로그램을 배포하는 과정을 설명하겠습니다.
1) Deployment 생성
컨테이너를 다운로드 받고 응용프로그램을 배포할 수 있습니다.
위치 : 포털 로그인 > Workloads > Deployments
> [생성] 버튼을 누릅니다.
> YAML 입력창에 아래 내용을 작성하고 [저장] 버튼을 누릅니다.
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 80 |
저장과 동시에 자동으로 yaml 설정값이 적용되며, Deployments 는 물론이고 Pods 와 ReplicaSets 메뉴에서도 관련 정보가 확인됩니다.
2) Services 생성
서비스를 NodePort 형식으로 생성하면 외부에서 응용 프로그램으로 연결이 가능해집니다.
위치 : 포털 로그인 > Services > Services
> [생성] 버튼을 누릅니다.
> YAML 입력창에 아래 내용을 작성하고 [저장] 버튼을 누릅니다.
apiVersion: v1 kind: Service metadata: name: nginx-service spec: selector: app: nginx type: NodePort ports: - name: nginx-port nodePort: 30001 port: 80 targetPort: 80 |
* Port 설명
- nodePort: 외부 네트워크에서 접속하는 포트 번호 입니다. (30000~32767 사이의 포트 번호를 사용) 이 포트는 Service Port 로 연결됩니다.
- port: Service 의 포트 번호 입니다. 이 포트는 targetPort 로 연결됩니다.
- targetPort: Pod 의 포트 입니다.
- 기본 80 포트 연결을 원할 경우 type 을 LoadBalancer 로 변경해야 합니다.
3) Ingresses 생성
개인이 소유하고 있는 도메인을 사용하는 방법입니다.
위치 : 포털 로그인 > Services > Ingresses
> [생성] 버튼을 누릅니다.
> Name : myingress 입력 (소문자로만 입력해야 합니다)
> Host : test.sysdocu.kr 입력 (네임서버 설정 IP 는 master node, worker node 어느것이든 상관 없습니다)
> Path : Prefix 선택, / 입력
> Target : 위에서 생성했던 Service 명, Port : 80 입력
> [저장] 버튼을 누릅니다.
4) 응용프로그램 접속
웹브라우저를 통해 준비된 도메인과 포트번호로 접근하면 웹서버 기본페이지가 출력됩니다.
http://test.sysdocu.kr:30001
5) 볼륨 추가
외부 스토리지의 일정 용량을 할당 받아 Pod 에 연결하는 방법입니다.
위치 : 포털 로그인 > Persistent Volume Claims
> [생성] 버튼을 누릅니다.
> YAML 입력창에 아래 내용을 작성하고 [저장] 버튼을 누릅니다.
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: nginx-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi |
볼륨을 위에서 생성했던 Pod 에 붙여 보겠습니다.
위치 : 포털 로그인 > Workloads > Deployments
> Deployments 이름 선택
> 아래 [수정] 버튼을 누릅니다.
> YAML 입력창에 아래 파란색으로 표시한 내용을 추가하고 [저장] 버튼을 누릅니다.
... terminationMessagePolicy: File volumeMounts: - mountPath: /backup name: my-pvc dnsPolicy: ClusterFirst ... terminationGracePeriodSeconds: 30 volumes: - name: my-pvc persistentVolumeClaim: claimName: nginx-pvc status: ... |
Deployment 를 수정하면 Pod 가 재생성 됩니다.
Pod 이름을 확인하고, Pod bash 쉘에 진입하여 파티션을 확인합니다.
$ kubectl get pod -n mynamespace
NAME READY STATUS RESTARTS AGE
nginx-deployment-b5cd59b6c-zj7pg 1/1 Running 0 1m33s
$ kubectl exec -it nginx-deployment-b5cd59b6c-zj7pg -n mynamespace -- /bin/bash
# df -h
Filesystem Size Used Avail Use% Mounted on
overlay 20G 11G 8.9G 54% /
tmpfs 64M 0 64M 0% /dev
tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
shm 64M 0 64M 0% /dev/shm
tmpfs 795M 5.0M 790M 1% /etc/hostname
172.16.1.32:/data/mynamespace-nginx-pvc-pvc-4bde4a92-4288-415f-bba7-ca99bf4fb7fe 20G 2.7G 18G 14% /backup
/dev/vda1 20G 11G 8.9G 54% /etc/hosts
tmpfs 500M 12K 500M 1% /run/secrets/kubernetes.io/serviceaccount
tmpfs 3.9G 0 3.9G 0% /proc/acpi
tmpfs 3.9G 0 3.9G 0% /proc/scsi
tmpfs 3.9G 0 3.9G 0% /sys/firmware
* 참고
PVC 를 1G 로 설정했는데, 20G 로 보이는 이유는 NFS 를 PV (Persistent Volume) 로 사용하기 때문입니다.
NFS 에서는 계정별 Quota 설정이 없으므로 공유디렉토리 총 사용량이 출력됩니다.
할당받은 용량으로 보이길 원할 경우 Ceph, ISCSI, GlusterFS 등 용량 개별 할당이 가능한 PV 로 사용하는 방법이 있습니다.
6) ConfigMaps
ConfigMap 은 어플리케이션의 환경 설정 정보나 구성 값들을 분리하여 저장하는 리소스입니다. 이를 통해 설정 값들을 어플리케이션 코드와 분리하여 관리하고, 환경별로 다른 설정을 제공하거나 변경 사항을 쉽게 적용할 수 있습니다.
다음은 ConfigMap 의 database-url 설정 값을 DATABASE_URL 환경 변수로 설정하여 Pod 에서 사용하는 예시 입니다. 이렇게 설정한 값이 Pod 내의 환경 변수로 주입되어 어플리케이션에서 사용할 수 있습니다.
위치 : 포털 로그인 > ConfigMaps > ConfigMaps
> [생성] 버튼을 누릅니다.
> YAML 입력창에 아래 내용을 작성하고 [저장] 버튼을 누릅니다.
apiVersion: v1 kind: ConfigMap metadata: name: my-config data: database-url: "mysql://sysdocu:12345678@db.sysdocu.kr/testdb" |
그리고 Pod 에서 ConfigMap 을 사용할 수 있도록 Deployment 설정을 수정해줍니다.
위치 : 포털 로그인 > Workloads > Deployments
> Deployments 이름 선택
> 아래 [수정] 버튼을 누릅니다.
> YAML 입력창에 아래 파란색으로 표시한 내용을 추가하고 [저장] 버튼을 누릅니다.
... containers: - image: nginx imagePullPolicy: Always env: - name: DATABASE_URL valueFrom: configMapKeyRef: name: my-config key: database-url name: nginx ... |
Pod 에서 변수를 확인해보겠습니다.
Pod 이름을 확인하고, Pod bash 쉘에 진입하여 변수를 잘 받아왔는지 확인합니다.
$ kubectl get pod -n mynamespace
NAME READY STATUS RESTARTS AGE
nginx-deployment-799d57d87-zwjsz 1/1 Running 0 25s
$ kubectl exec -it nginx-deployment-799d57d87-zwjsz -n mynamespace -- /bin/bash
# echo $DATABASE_URL
mysql://sysdocu:12345678@db.sysdocu.kr/testdb
7) Managements
Managements 에서는 아래 기능 설정이 가능합니다.
- Roles : 작업에 대한 권한을 정의
- Resource Quotas : 네임스페이스 내의 모든 Pod, 리소스 및 객체의 사용량을 관리
- Limit Ranges : 컨테이너 및 Pod의 리소스 사용을 제한하는 데 사용
따로 필요한 부분만 설정하여 사용이 가능하지만 여기 예제에서는 한 번에 설정하고 적용하도록 하겠습니다.
아래 설정값을 먼저 작성해둡니다.
위치 : 포털 로그인 > Managements > Roles
> [생성] 버튼을 누릅니다.
> YAML 입력창에 아래 내용을 작성하고 [저장] 버튼을 누릅니다.
apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: namespace: mynamespace name: my-role rules: - apiGroups: [""] resources: ["pods"] verbs: ["get", "list", "watch"] |
my-role 이라는 Role 에 pods 리소스에 대한 get, list, watch 명령을 수행할 수 있는 권한을 주었습니다.
이어서 Resource Quotas 를 작성합니다.
위치 : 포털 로그인 > Managements > Resource Quotas
> [생성] 버튼을 누릅니다.
> YAML 입력창에 아래 내용을 작성하고 [저장] 버튼을 누릅니다.
apiVersion: v1 kind: ResourceQuota metadata: namespace: mynamespace name: my-resource-quota spec: hard: pods: "5" requests.cpu: "1" requests.memory: 1Gi limits.cpu: "2" limits.memory: 2Gi |
my-resource-quota 라는 Resource Quota 는 네임스페이스 내에서 최대 5개의 Pod 를 생성하며, CPU 및 메모리에 대한 요청과 제한 값을 설정하였습니다.
* 참고 : 권한 상승
YAML 저장시 "해당 리소스에 접근할 수 있는 권한이 없습니다." 라는 메세지가 출력될 경우, 포털 admin 계정으로 현재 계정에 대해 권한을 상승시켜주면 됩니다.
위치 : admin 계정으로 포털 로그인 > Managements > Users > 'User' 탭
> 사용자 계정을 클릭 후 하단 [수정] 버튼을 누릅니다.
> Authority : [Cluster Admin] 으로 변경 후 [저장] 버튼을 누릅니다.
> admin 계정을 로그아웃 하고 다시 일반 계정으로 로그인합니다.
> 위 Resource Quota 를 생성합니다.
이어서 Limit Ranges 를 작성합니다.
위치 : 포털 로그인 > Managements > Limit Ranges
> [생성] 버튼을 누릅니다.
> YAML 입력창에 아래 내용을 작성하고 [저장] 버튼을 누릅니다.
apiVersion: v1 kind: LimitRange metadata: namespace: mynamespace name: my-limit-range spec: limits: - type: Container max: memory: 500Mi default: memory: 100Mi defaultRequest: memory: 50Mi |
my-limit-range 라는 Limit Range 를 생성하여 컨테이너의 메모리에 대한 제한과 요청 값을 설정하였습니다.
Resource Quota, Limit Range 는 네임스페이스 내에서 생성해 두기만 하면 이후에 생성되는 Pod 에 자동 적용이 됩니다.
그리고 Role 은 일반적으로 Kubernetes 환경에서 사용하려면 Role Binding 과 ServiceAccount 를 추가로 생성해서 Deployment 에 연결시켜줘야 하지만, K-PaaS 에서는 Role 을 만들고 admin 계정으로 특정 계정의 Namespace 와 Role 을 선택해 주기만 하면 됩니다.
위에서 미리 생성했던 Role 을 계정에 적용해 보겠습니다.
우선, 일반 계정을 로그아웃 하고 admin 계정으로 로그인 합니다.
위치 : 포털 로그인 > Managements > Users
> 'Administrator' 탭에서 계정 이름 선택
> 아래 [수정] 버튼을 누릅니다.
> Authority 값을 Cluster Admin 에서 User 로 변경하고
> 바로 아래에 있는 Namespaces ⁄ Roles 의 [선택] 버튼을 누릅니다.
> 만들었던 Namespace 와 Role 을 선택합니다. (예 : mynamespace / my-role)
> [선택 완료] 버튼을 누릅니다.
> 하단의 [수정] 버튼을 누릅니다.
일반 계정에 권한이 적용되었습니다.
절차에서 알 수 있듯이 admin 계정이나 Cluster Admin 권한의 계정은 Role 적용이 되지 않습니다.
'리눅스 > PaaS' 카테고리의 다른 글
Heroku 에 PHP 애플리케이션 배포하는 2가지 방법 (Web, CLI), Laravel 배포 방법 (0) | 2023.11.24 |
---|---|
CF (Cloud Foundry) Paketo Buildpack 의 개발언어 제공 버전 확인하기 (0) | 2023.11.21 |
Ubuntu 22.04 Kind Cluster 에서 Korifi 설치하기 (스크립트를 이용한 간단 설치) (0) | 2023.11.02 |
Kubernetes 1.28, Kind 에서 Korifi 설치 및 PHP 애플리케이션 배포하기 (0) | 2023.10.24 |
오픈 클라우드 플랫폼 K-PaaS (구 PaaS-TA) 6.5 Container Platform 설치 (on Openstack) (0) | 2023.07.07 |