개요
이 실습에서는 배포 매니페스트 사용의 기본사항에 대해 알아봅니다. 매니페스트는 여러 포드에서 사용할 수 있는 배포에 필요한 구성이 포함된 파일입니다. 매니페스트는 간단히 변경할 수 있습니다.
목표
이 실습에서는 다음 작업을 수행하는 방법을 알아봅니다.
- 배포 매니페스트를 만들고, 클러스터에 배포하고, 노드가 사용 중지되면 포드 재예약 확인하기
 
- 배포의 포드 수동 확장 및 축소 트리거하기
 
- 배포 출시(새 버전으로의 순차적 업데이트) 및 롤백 트리거하기
 
- 카나리아 배포 수행하기
 
실습 설정
실습 액세스하기
각 실습에서는 정해진 기간 동안 새 Google Cloud 프로젝트와 리소스 집합이 무료로 제공됩니다.
- 
실습 시작 버튼을 클릭합니다. 실습 비용을 결제해야 하는 경우 결제 수단을 선택할 수 있는 팝업이 열립니다.
왼쪽에는 다음과 같은 항목이 포함된 실습 세부정보 패널이 있습니다.
- 
Google Cloud 콘솔 열기 버튼
 
- 남은 시간
 
- 이 실습에 사용해야 하는 임시 사용자 인증 정보
 
- 필요한 경우 실습 진행을 위한 기타 정보
 
 
- 
Google Cloud 콘솔 열기를 클릭합니다(Chrome 브라우저를 실행 중인 경우 마우스 오른쪽 버튼으로 클릭하고 시크릿 창에서 링크 열기를 선택합니다).
실습에서 리소스가 가동되면 다른 탭이 열리고 로그인 페이지가 표시됩니다.
팁: 두 개의 탭을 각각 별도의 창으로 나란히 정렬하세요.
참고: 계정 선택 대화상자가 표시되면 다른 계정 사용을 클릭합니다.        
 
 
- 
필요한 경우 아래의 사용자 이름을 복사하여 로그인 대화상자에 붙여넣습니다.
 {{{user_0.username | "Username"}}}
 
실습 세부정보 패널에서도 사용자 이름을 확인할 수 있습니다.
 
- 
다음을 클릭합니다.
 
- 
아래의 비밀번호를 복사하여 시작하기 대화상자에 붙여넣습니다.
 {{{user_0.password | "Password"}}}
 
실습 세부정보 패널에서도 비밀번호를 확인할 수 있습니다.
 
- 
다음을 클릭합니다.
중요: 실습에서 제공하는 사용자 인증 정보를 사용해야 합니다. Google Cloud 계정 사용자 인증 정보를 사용하지 마세요. 
 
참고: 이 실습에 자신의 Google Cloud 계정을 사용하면 추가 요금이 발생할 수 있습니다.
 
 
- 
이후에 표시되는 페이지를 클릭하여 넘깁니다.
- 이용약관에 동의합니다.
 
- 임시 계정이므로 복구 옵션이나 2단계 인증을 추가하지 않습니다.
 
- 무료 체험판을 신청하지 않습니다.
 
 
잠시 후 Google Cloud 콘솔이 이 탭에서 열립니다.
참고: Google Cloud 제품 및 서비스 목록이 있는 메뉴를 보려면 왼쪽 상단의 탐색 메뉴를 클릭하거나 검색창에 제품 또는 서비스 이름을 입력합니다.
초기 로그인 단계를 완료하면 프로젝트 대시보드가 표시됩니다.
Google Cloud Shell 활성화하기
Google Cloud Shell은 다양한 개발 도구가 탑재된 가상 머신으로, 5GB의 영구 홈 디렉터리를 제공하며 Google Cloud에서 실행됩니다.
Google Cloud Shell을 사용하면 명령줄을 통해 Google Cloud 리소스에 액세스할 수 있습니다.
- 
Cloud 콘솔의 오른쪽 상단 툴바에서 'Cloud Shell 열기' 버튼을 클릭합니다.

 
- 
계속을 클릭합니다.
 
환경을 프로비저닝하고 연결하는 데 몇 분 정도 소요됩니다. 연결되면 사용자가 미리 인증되어 프로젝트가 PROJECT_ID로 설정됩니다. 예:

gcloud는 Google Cloud의 명령줄 도구입니다. Cloud Shell에 사전 설치되어 있으며 명령줄 자동 완성을 지원합니다.
- 다음 명령어를 사용하여 사용 중인 계정 이름을 나열할 수 있습니다.
 
gcloud auth list
출력:
Credentialed accounts:
 - @.com (active)
출력 예시:
Credentialed accounts:
 - google1623327_student@qwiklabs.net
 
- 다음 명령어를 사용하여 프로젝트 ID를 나열할 수 있습니다.
 
gcloud config list project
출력:
[core]
project = 
출력 예시:
[core]
project = qwiklabs-gcp-44776a13dea667a6
참고: 
gcloud 전체 문서는 gcloud CLI 개요 가이드를 참조하세요.
작업 1. 배포 매니페스트를 만들고 클러스터에 배포하기
이 작업에서는 클러스터 내부의 포드를 위한 배포 매니페스트를 만듭니다.
실습용 GKE 클러스터에 연결
- Cloud Shell에서 다음 명령어를 입력하여 영역 및 클러스터 이름의 환경 변수를 설정합니다.
 
export my_region={{{ project_0.default_region | REGION }}}
export my_cluster=dev-cluster
- Cloud Shell에서 kubectl 명령줄 자동 완성을 구성합니다.
 
source <(kubectl completion bash)
- Cloud Shell에서 다음 명령어를 사용하여 kubectl 명령줄 도구의 클러스터 액세스를 구성합니다.
 
gcloud container clusters get-credentials $my_cluster --region $my_region
배포 매니페스트 만들기
nginx-deployment.yaml이라는 샘플 배포 매니페스트를 사용하여 배포를 만듭니다. 이 배포는 각 포드에 TCP 포트 80에서 수신 대기하는 단일 nginx 컨테이너가 있는 3개의 포드 복제본을 실행하도록 구성됩니다.
- 다음 명령어를 사용하여 nano로 
nginx-deployment.yaml이라는 파일을 만들고 엽니다. 
nano nginx-deployment.yaml
- nano가 열리면 다음을 
nginx-deployment.yaml 파일에 붙여넣습니다. 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.27.0
        ports:
        - containerPort: 80
- 
Ctrl+O 키를 누른 다음 Enter 키를 눌러 수정한 파일을 저장합니다.
 
- 
Ctrl+X 키를 눌러 nano 텍스트 편집기를 종료합니다.
 
- 
매니페스트를 배포하기 위해 다음 명령어를 실행합니다.
 
kubectl apply -f ./nginx-deployment.yaml
- 배포 목록을 보려면 다음 명령어를 실행합니다.
 
kubectl get deployments
출력은 다음 예시와 같이 표시됩니다.
출력:
NAME               READY      UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   0/3        3            0           3s
- 몇 분 동안 기다렸다가 명령어에 의해 보고된 CURRENT 배포에 대해 나열된 수가 DESIRED 배포의 수와 일치할 때까지 명령어를 반복 실행합니다.
 
최종 출력은 다음 예시와 같이 표시됩니다.
출력:
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3            3           42s
내 진행 상황 확인하기를 클릭하여 목표를 확인합니다.
매니페스트 nginx 배포 생성 및 배포
작업 2. 배포의 포드 수를 수동으로 확장 및 축소하기
포드 인스턴스를 종료하려 할 때가 있고, 10개의 포드를 실행하려 할 때가 있습니다. Kubernetes에서 특정 포드를 원하는 인스턴스 수만큼 확장할 수 있습니다. 인스턴스를 종료하려면 0으로 조정합니다.
이 작업에서는 Google Cloud 콘솔 및 Cloud Shell에서 포드를 확장 및 축소합니다.
콘솔에서 포드 확장 및 축소
- Google Cloud 콘솔 탭으로 전환합니다.
 
- 
탐색 메뉴(
)에서 Kubernetes Engine > 워크로드를 클릭합니다. 
- 
nginx-deployment(사용자의 배포)를 클릭하여 배포 세부정보 페이지를 엽니다.
 
- 상단에서 작업 > 확장 > 복제본 수정을 클릭합니다.
 
- 
1을 입력하고 확장을 클릭합니다.
 
이 작업으로 클러스터가 축소됩니다. 관리형 포드 아래에 업데이트 중인 포드 상태가 표시됩니다. 새로고침을 클릭해야 할 수 있습니다.
Cloud Shell에서 포드 확장 및 축소
- Cloud Shell 브라우저 탭으로 다시 전환합니다.
 
- Cloud Shell에서 배포의 포드 목록을 보려면 다음 명령어를 실행합니다.
 
kubectl get deployments
출력:
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   1/1     1            1           3m
- 포드 백업을 3개의 복제본으로 확장하려면 다음 명령어를 실행합니다.
 
kubectl scale --replicas=3 deployment nginx-deployment
- 배포의 포드 목록을 보려면 다음 명령어를 실행합니다.
 
kubectl get deployments
출력:
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3            3           4m
작업 3. 배포 출시 및 배포 롤백 트리거하기
배포의 출시는 배포의 포드 템플릿(.spec.template)이 변경된 경우에만 트리거됩니다(예: 템플릿의 라벨 또는 컨테이너 이미지가 업데이트된 경우). 배포 확장과 같은 다른 업데이트는 출시를 트리거하지 않습니다.
이 작업에서는 배포 출시를 트리거한 다음 배포 롤백을 트리거합니다.
배포 출시 트리거
- 배포의 nginx 버전을 업데이트하려면 다음 명령어를 실행합니다.
 
kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.28.0 
그러면 배포의 컨테이너 이미지가 nginx v1.28.0으로 업데이트됩니다.
- 출시에 변경사항 세부정보를 주석으로 추가하기 위해 다음 명령어를 실행합니다.
 
kubectl annotate deployment nginx-deployment kubernetes.io/change-cause="version change to 1.28.0" --overwrite=true
- 출시 상태를 보려면 다음 명령어를 실행합니다.
 
kubectl rollout status deployment.v1.apps/nginx-deployment
출력은 다음 예와 같이 표시됩니다.
출력:
Waiting for rollout to finish: 1 out of 3 new replicas updated...
Waiting for rollout to finish: 1 out of 3 new replicas updated...
Waiting for rollout to finish: 1 out of 3 new replicas updated...
Waiting for rollout to finish: 2 out of 3 new replicas updated...
Waiting for rollout to finish: 2 out of 3 new replicas updated...
Waiting for rollout to finish: 2 out of 3 new replicas updated...
Waiting for rollout to finish: 1 old replicas pending termination...
Waiting for rollout to finish: 1 old replicas pending termination...
deployment "nginx-deployment" successfully rolled out
- 변경된 것을 확인하려면 배포 목록을 가져옵니다.
 
kubectl get deployments
출력은 다음 예와 같이 표시됩니다.
출력:
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3            3           6m
내 진행 상황 확인하기를 클릭하여 목표를 확인합니다.
배포의 nginx 버전 업데이트
- 배포의 출시 기록을 봅니다.
 
kubectl rollout history deployment nginx-deployment
출력은 다음 예와 같이 표시됩니다. 출력이 정확히 일치하지 않을 수 있습니다.
출력:
deployments "nginx-deployment"
REVISION  CHANGE-CAUSE
1         
2         version change to 1.28.0
배포 롤백 트리거
객체의 출시를 롤백하려면 kubectl rollout undo 명령어를 사용하면 됩니다.
- 이전 버전의 nginx 배포로 롤백하려면 다음 명령어를 실행합니다.
 
kubectl rollout undo deployments nginx-deployment
- 배포의 업데이트된 출시 기록을 봅니다.
 
kubectl rollout history deployment nginx-deployment
출력은 다음 예와 같이 표시됩니다. 출력이 정확히 일치하지 않을 수 있습니다.
출력:
deployments "nginx-deployment"
REVISION  CHANGE-CAUSE
2        version change to 1.28.0
3         
참고: kubectl annotate 명령어를 사용하지 않았기 때문에 CHANGE-CAUSE의 최신 업데이트가 비어 있습니다.
- 최신 배포 버전의 세부정보 보기
 
kubectl rollout history deployment/nginx-deployment --revision=3
출력은 다음 예와 같이 표시됩니다. 출력이 정확히 일치하지 않을 수 있지만 현재 버전이 nginx:1.27.0으로 롤백되었다는 것이 표시됩니다.
출력:
deployments "nginx-deployment" with revision #3
Pod Template:
  Labels:       app=nginx
        pod-template-hash=3123191453
  Containers:
   nginx:
    Image:      nginx:1.27.0
    Port:       80/TCP
    Host Port:  0/TCP
    Environment:        
    Mounts:     
  Volumes:      
작업 4. 매니페스트에서 서비스 유형 정의하기
이 작업에서는 애플리케이션에 대한 인바운드 트래픽을 제어하는 서비스를 만들고 확인합니다. 서비스는 ClusterIP, NodePort 또는 LoadBalancer 유형으로 구성할 수 있습니다. 이 실습에서는 LoadBalancer를 구성합니다.
매니페스트에서 서비스 유형 정의
LoadBalancer 서비스 유형을 배포하는 매니페스트 파일 service-nginx.yaml이 제공되었습니다. 이 서비스는 app: nginx 라벨이 있는 모든 컨테이너의 TCP 포트 60000에서 포트 80으로 인바운드 트래픽을 분산하도록 구성됩니다.
- 다음 명령어를 사용하여 nano로 
service-nginx.yaml이라는 파일을 만들고 엽니다. 
nano service-nginx.yaml
- nano가 열리면 다음을 
service-nginx.yaml 파일에 붙여넣습니다. 
apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  type: LoadBalancer
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 60000
    targetPort: 80
- 
Ctrl+O 키를 누른 다음 Enter 키를 눌러 수정한 파일을 저장합니다.
 
- 
Ctrl+X 키를 눌러 nano 텍스트 편집기를 종료합니다.
 
- 
Cloud Shell에서 매니페스트를 배포하기 위해 다음 명령어를 실행합니다.
 
kubectl apply -f ./service-nginx.yaml
이 매니페스트는 서비스를 정의하고 선택기에 해당하는 포드에 적용합니다. 이 경우 매니페스트는 작업 1에서 배포한 nginx 컨테이너에 적용됩니다. 이 서비스는 서비스 이후에 생성된 모든 포드를 비롯하여 app: nginx 라벨이 있는 다른 모든 포드에도 적용됩니다.
LoadBalancer 생성 확인
- nginx 서비스의 세부정보를 보려면 다음 명령어를 실행합니다.
 
kubectl get service nginx
출력은 다음 예와 같이 표시됩니다.
출력:
NAME   Type          CLUSTER-IP   EXTERNAL-IP    PORT(S)           AGE
nginx  LoadBalancer  10.X.X.X     X.X.X.X        60000:31798/TCP   1m
- 외부 IP가 표시되면 새 브라우저 탭에서 
http://[EXTERNAL_IP]:60000/을 열어 네트워크 부하 분산을 통해 제공되는 서버를 확인합니다. 
참고: 서비스의 ExternalIP 필드 값이 채워지는 데 몇 초 정도 걸릴 수 있습니다. 이는 정상적인 현상입니다. 필드가 채워질 때까지 몇 초마다 kubectl get services nginx 명령어를 다시 실행하면 됩니다.
내 진행 상황 확인하기를 클릭하여 목표를 확인합니다.
LoadBalancer 서비스 유형을 배포하는 매니페스트 파일 배포
작업 5. 카나리아 배포 수행하기
카나리아 배포는 애플리케이션의 새 버전을 테스트하는 데 사용되는 별도의 배포입니다. 단일 서비스가 카나리아 및 일반 배포 모두를 타겟팅합니다. 또한 사용자의 하위 집합을 카나리아 버전으로 전달하여 새로운 출시의 위험을 완화할 수 있습니다.
이 작업에서는 기본 배포보다 최신 버전인 nginx를 실행하는 단일 포드를 배포하도록 카나리아 배포를 만듭니다.
- 다음 명령어를 사용하여 nano로 
nginx-canary.yaml이라는 파일을 만들고 엽니다. 
nano nginx-canary.yaml
- nano가 열리면 다음을 
nginx-canary.yaml 파일에 붙여넣습니다. 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-canary
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
        track: canary
        Version: 1.28.0
    spec:
      containers:
      - name: nginx
        image: nginx:1.28.0
        ports:
        - containerPort: 80
- 
Ctrl+O 키를 누른 다음 Enter 키를 눌러 수정한 파일을 저장합니다.
 
- 
Ctrl+X 키를 눌러 nano 텍스트 편집기를 종료합니다.
 
이전 작업에서 배포한 nginx 서비스의 매니페스트에서는 라벨 선택기를 사용하여 app: nginx 라벨이 있는 포드를 타겟팅합니다. 일반 배포와 새 카나리아 배포에는 모두 app: nginx 라벨이 있습니다. 인바운드 연결은 서비스에 의해 일반 및 카나리아 배포 포드 모두에 배포됩니다. 카나리아 배포에는 일반 배포보다 복제본(포드) 수가 적으므로 일반 배포보다 적은 수의 사용자가 사용할 수 있습니다.
- 구성 파일을 기반으로 카나리아 배포를 만듭니다.
 
kubectl apply -f ./nginx-canary.yaml
- 배포가 완료되면 nginx 및 nginx-canary 배포가 모두 있는지 확인합니다.
 
kubectl get deployments
- 외부 LoadBalancer 서비스 IP에 연결된 브라우저 탭으로 다시 전환하고 페이지를 새로고침합니다. 표준 
Welcome to nginx 페이지가 계속 표시됩니다. 
- Cloud Shell로 다시 전환하고 기본 배포를 복제본 0개로 축소합니다.
 
kubectl scale --replicas=0 deployment nginx-deployment
- 현재 실행 중인 유일한 복제본이 카나리아 배포인지 확인합니다.
 
kubectl get deployments
- 외부 LoadBalancer 서비스 IP에 연결된 브라우저 탭으로 다시 전환하고 페이지를 새로고침합니다. 서비스가 트래픽을 카나리아 배포로 자동 분산하고 있음을 보여주는 표준 
Welcome to nginx 페이지가 계속 표시됩니다. 
내 진행 상황 확인하기를 클릭하여 목표를 확인합니다.
카나리아 배포 만들기
세션 어피니티
실습에서 사용되는 서비스 구성은 단일 클라이언트의 모든 요청이 항상 동일한 포드에 연결되도록 보장하지 않습니다. 각 요청은 개별적으로 처리되며 일반 nginx 배포 또는 nginx-canary 배포에 연결될 수 있습니다.
카나리아 릴리스의 기능이 크게 변경된 경우 다른 버전 간 전환으로 인해 문제가 발생할 수 있습니다. 이를 방지하려면 클라이언트의 첫 번째 요청이 모든 후속 연결에 사용할 포드를 결정하도록 서비스 사양에서 sessionAffinity 필드를 ClientIP로 설정하면 됩니다.
예를 들면 다음과 같습니다.
apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  type: LoadBalancer
  sessionAffinity: ClientIP
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 60000
    targetPort: 80
실습 종료하기
실습을 완료하면 실습 종료를 클릭합니다. Google Cloud Skills Boost에서 사용된 리소스를 자동으로 삭제하고 계정을 지웁니다.
실습 경험을 평가할 수 있습니다. 해당하는 별표 수를 선택하고 의견을 입력한 후 제출을 클릭합니다.
별점의 의미는 다음과 같습니다.
- 별표 1개 = 매우 불만족
 
- 별표 2개 = 불만족
 
- 별표 3개 = 중간
 
- 별표 4개 = 만족
 
- 별표 5개 = 매우 만족
 
의견을 제공하고 싶지 않다면 대화상자를 닫으면 됩니다.
의견이나 제안 또는 수정할 사항이 있다면 지원 탭을 사용하세요.
Copyright 2020 Google LLC All rights reserved. Google 및 Google 로고는 Google LLC의 상표입니다. 기타 모든 회사명 및 제품명은 해당 업체의 상표일 수 있습니다.