Kubernetes Service를 사용하여 클러스터 배포하기
이 가이드에서는 네이버 클라우드 플랫폼의 Kubernetes Service를 사용하여 클러스터에 WordPress 애플리케이션을 배포합니다.
클러스터 만들기
- 네이버 클라우드 플랫폼 콘솔에 로그인합니다.
- 왼쪽 메뉴에서 Kubernetes Service를 선택합니다.
- 상단의 생성하기 버튼을 클릭합니다.
- 다음 단계를 완료합니다.
- 클러스터 설정
- 클러스터 이름: 원하는 이름을 입력합니다.
- 노드 수: 이 가이드에서는 노드 수를 1로 설정합니다.
- 로그인 키 설정
- 워커 노드에 접속하기 위해 필요한 로그인 키를 설정합니다.
- 최종 확인
- 설정이 올바르게 되었는지 확인하고 생성하기 버튼을 클릭합니다.
- 클러스터 설정
- 일정 시간(분) 경과 후 클러스터의 상태가 운영중이 되면 사용이 가능해집니다.
자세한 가이드는 링크를 참고해주세요.
클러스터 연결하기
kubectl 설치
- 생성된 클러스터에 연결하기 위해서는 CLI인
kubectl
이 필요합니다. 아래 공식 문서에서 운영체제에 맞는 kubectl을 설치합니다.
클러스터 연결
- 클러스터 상세정보에서 설정파일을 다운로드합니다.
- 클러스터 접근에는 두 가지 방법이 있습니다.
- $HOME/.kube/config에 설정 파일 추가
- kubectl 명령 사용 시 --kubeconfig "설정파일" 옵션 추가
- 이번 설명에서는
--kubeconfig "설정파일"
옵션을 사용하겠습니다. - 편의를 위해 설정파일이 있는 경로에서
$KUBE_CONFIG
환경변수를 설정 후 진행합니다. 아래"설정파일"
부분에 다운로드한 설정파일 경로를 입력합니다.
export KUBE_CONFIG="설정파일"
예:
export KUBE_CONFIG=kubeconfig-318.yaml
kubectl get nodes
명령을 사용하여 클러스터 노드가 클러스터 생성 시 설정한 수(1개)만큼 나오는지 조회합니다.
kubectl --kubeconfig $KUBE_CONFIG get nodes
- 실행 결과
NAME STATUS ROLES AGE VERSION
nks-pool-318-w-181 Ready node 7m v1.16.6
Windows에서의 설정 방법은 이 kubeconfig 환경변수 설정하기를 참고하시기 바랍니다.
애플리케이션 배포
kubectl 명령과 함께 Kubernetes Manifest 파일(.yaml)을 사용하여 MySQL 서비스와 WordPress 서비스를 배포해보겠습니다.
MySQL 배포
- WordPress에 필요한 MySQL을 먼저 배포합니다.
MySQL Password Secret 생성
- 먼저
kubectl create secret
명령을 사용하여 MySQL에 접속하기 위한 Password를 Secret으로 생성합니다. 아래"YOUR_PASSWORD"
부분에 새로 만들 비밀번호를 입력합니다.
kubectl --kubeconfig $KUBE_CONFIG create secret generic mysql-pass --from-literal=password="YOUR_PASSWORD"
- 실행 결과
secret/mysql-pass created
예: kubectl --kubeconfig $KUBE_CONFIG create secret generic mysql-pass --from-literal=password=1234
MySQL 애플리케이션 배포
- MySQL을 배포하기 위해서 아래의 링크의 Manifest 파일을 사용합니다. Manifest 파일에는 MySQL 서비스에 필요한 오브젝트인 PersistentVolume, PersistentVolumeClaim, Deployment, Service가 정의되어 있습니다.
- 아래와 같이
kubectl apply -f
명령을 사용하여 위 Manifest 파일을 클러스터에 반영합니다.
kubectl --kubeconfig $KUBE_CONFIG apply -f https://gist.githubusercontent.com/NaverCloudPlatformDeveloper/39e63bf8051c2af338bf4728b4336358/raw/1804b7b36eb6818fedf600c73f6b9cf9219529a0/nks-tutorial-mysql.yaml
- 실행 결과
persistentvolume/mysql-pv created
persistentvolumeclaim/mysql-pv-claim created
deployment.apps/wordpress-mysql created
service/wordpress-mysql created
실제 서비스에서는 안정적인 운영을 위해 Cloud DB for MySQL 서비스 사용을 권장합니다.
WordPress 배포
- MySQL이 잘 생성되었다면 이번에는 WordPress를 배포하기 위해서 아래의 링크의 Manifest 파일을 사용합니다. Manifest 파일에는 Deployment, Service가 정의되어 있습니다.
- MySQL과 동일하게
kubectl apply -f
명령으로 WordPress를 배포합니다.
kubectl --kubeconfig $KUBE_CONFIG apply -f https://gist.githubusercontent.com/NaverCloudPlatformDeveloper/8bb23ccd8310f05d2ef737835d4d1748/raw/d97aa174df6f31d7c4b0de5957fe67c6a2846fe3/nks-tutorial-wordpress.yaml
- 실행 결과
deployment.apps/wordpress created
service/wordpress created
kubectl get service --watch
명령으로 WordPress 서비스의 배포 상황을 실시간으로 확인할 수 있습니다.
kubectl --kubeconfig $KUBE_CONFIG get service wordpress --watch
- 실행 결과
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
wordpress LoadBalancer 172.21.5.101 <pending> 80:31864/TCP 35s
wordpress LoadBalancer 172.21.5.101 slb-1815725.n... 80:31864/TCP 40s
- 일정 시간 경과 후
EXTERNAL-IP
가pending
상태에서 실제 주소로 변경되면 서비스가 가능해집니다. kubectl get service
명령으로 WordPress 서비스의EXTERNAL-IP
전체 주소를 확인합니다.
kubectl --kubeconfig $KUBE_CONFIG get service wordpress
- 실행 결과
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
wordpress LoadBalancer 172.21.5.101 slb-1815725.ncloudslb.com 80:31864/TCP 70s
- 브라우저에서 WordPress Service의 EXTERNAL-IP(예시: slb-1815725.ncloudslb.com)로 접속하면 WordPress 화면을 확인할 수 있습니다.
Pod 스케일링하기
현재 Pod 조회
kubectl get pods
명령으로 현재 mysql pod와 WordPress pod가 한 개씩 있는 것을 확인합니다.
kubectl --kubeconfig $KUBE_CONFIG get pods
- 실행 결과
NAME READY STATUS RESTARTS AGE
wordpress-6d884d9866-lj5bl 1/1 Running 0 10m
wordpress-mysql-7977b9588d-gbtll 1/1 Running 0 11m
Pod 스케일
kubectl scale
명령으로 WordPress pod를 3개로 늘려보겠습니다.
kubectl --kubeconfig $KUBE_CONFIG scale deployments/wordpress --replicas=3
- 실행 결과
deployment.extensions/wordpress scaled
결과 확인
- 다시
kubectl get pods
명령을 사용하면 WordPress pod만 3개로 늘어난 것을 확인할 수 있습니다.
kubectl --kubeconfig $KUBE_CONFIG get pods
- 실행 결과
NAME READY STATUS RESTARTS AGE
wordpress-6d884d9866-2c8cl 1/1 Running 0 5s
wordpress-6d884d9866-7rxj8 1/1 Running 0 5s
wordpress-6d884d9866-lj5bl 1/1 Running 0 12m
wordpress-mysql-7977b9588d-gbtll 1/1 Running 0 14m
Application Update하기
- 현재 5.2 버전으로 구동 중인 WordPress의 버전을 5.2.2 버전으로 업데이트해보겠습니다.
현재 버전 확인
kubectl get deployments -o wide
명령으로 현재 WordPress 이미지의 버전(5.2)을 확인합니다.
kubectl --kubeconfig $KUBE_CONFIG get deployments wordpress -o wide
- 실행 결과
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
wordpress 3 3 3 3 55m wordpress wordpress:5.2-apache app=wordpress,tier=frontend
버전 업데이트
kubectl set image
명령을 사용하여 현재 5.2 버전으로 구동 중인 WordPress의 버전을 5.2.2 버전으로 변경합니다.
kubectl --kubeconfig $KUBE_CONFIG set image deployments/wordpress wordpress=wordpress:5.2.2-apache
실행 결과
deployment.extensions/wordpress image updated
결과 확인
다시
kubectl get deployments -o wide -w
옵션으로 변경된 WordPress 업데이트를 실시간으로 확인합니다.
kubectl --kubeconfig $KUBE_CONFIG get deployments wordpress -o wide -w
- 실행 결과
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR wordpress 3 3 3 3 55m wordpress wordpress:5.2-apache app=wordpress,tier=frontend wordpress 3 3 3 3 56m wordpress wordpress:5.2.2-apache app=wordpress,tier=frontend
- 일정 시간이 지나 WordPress 이미지 버전이 wordpress:5.2.2-apache로 업데이트된 것을 확인할 수 있습니다.