Kubernetes Service를 사용하여 클러스터 배포하기

이 가이드에서는 네이버 클라우드 플랫폼의 Kubernetes Service를 사용하여 클러스터에 WordPress 애플리케이션을 배포합니다.

클러스터 만들기

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

자세한 가이드는 사용 가이드를 참고해주세요.

클러스터 연결하기

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에서의 설정 방법은 이 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-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하기

  • 현재 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로 업데이트된 것을 확인할 수 있습니다.

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

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

    처리중...