NAVER CLOUD PLATFORM의 Kubernetes Service를 사용하여 클러스터 배포하기

이 가이드에서는 Naver Cloud Platform의 Kubernetes Service를 사용하여 클러스터에 WordPress 앱을 배포합니다.

클러스터 만들기

  • 네이버 클라우드 플랫폼 콘솔에 로그인합니다.
  • 왼쪽 메뉴에서 Kubernetes Service를 선택합니다.
  • 상단의 생성하기 버튼을 클릭합니다.
  • 아래의 단계를 완료합니다.
    • 클러스터 설정
      • 클러스터 이름: 원하는 이름을 입력합니다.
      • 노드 수: 이 가이드에서는 노드 수를 1로 설정합니다.
    • 로그인 키 설정
      • 워커 노드에 접속하기 위해 필요한 로그인 키를 설정합니다.
    • 최종 확인
      • 설정이 올바르게 되었는지 확인하고 생성하기 버튼을 클릭합니다.
  • 몇 분이 지난 후 클러스터의 상태가 운영중이 되면 사용 가능해집니다.

자세한 가이드는 이 링크를 참고해주세요.

클러스터 연결하기

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.12.7

Windows에서의 설정 방법은 이 링크에서 확인 부탁드립니다.

어플리케이션 배포

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/8ef271a04cf80f0c8980ba11be20df1d178ac12b/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-IPpending 상태에서 실제 주소로 변경되면 서비스가 가능해집니다.
  • 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하기

  • 현재 4.8 버전으로 구동 중인 wordpress의 버전을 4.9.8 버전으로 업데이트해보겠습니다.

현재버전 확인

  • kubectl get deployments -o wide 명령으로 현재 wordpress 이미지의 버전(4.8)을 확인합니다.
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:4.8-apache     app=wordpress,tier=frontend

버전 업데이트

  • kubectl set image 명령을 사용하여 현재 4.8 버전으로 구동 중인 wordpress의 버전을 4.9.8 버전으로 변경합니다.
kubectl --kubeconfig $KUBE_CONFIG set image deployments/wordpress wordpress=wordpress:4.9.8-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:4.8-apache   app=wordpress,tier=frontend
    wordpress   3         3         3            3           56m   wordpress    wordpress:4.9.8-apache   app=wordpress,tier=frontend
    
  • 일정 시간이 지나 wordpress 이미지 버전이 wordpress:4.9.8-apache로 업데이트된 것을 확인할 수 있습니다.

""에 대한 건이 검색되었습니다.

    ""에 대한 검색 결과가 없습니다.

    처리중...