1. 개요
Kubernetes에서 작동하도록 기존 애플리케이션을 다시 작성하거나 재설계하는 것은 항상 가능하거나 수동으로 수행하기에 적합하지 않습니다. Migrate for Anthos는 기존 애플리케이션을 현대화하고 Kubernetes에서 실행하는 데 도움이 될 수 있습니다. 이 Codelab에서는 Migrate for Anthos를 사용하여 Compute Engine에서 호스팅되는 기존 웹 앱을 Kubernetes Engine으로 마이그레이션합니다.
학습할 내용
- Kubernetes 클러스터에 Migrate for Anthos를 배포하는 방법
- 기존 Compute Engine 인스턴스에서 스테이트풀(Stateful) 세트의 컨테이너를 만드는 방법
- 컨테이너를 Kubernetes에 배포하고 부하 분산기로 구성하는 방법
필요한 항목
- 결제가 설정된 Google Cloud 프로젝트. 프로젝트가 없다면 하나 만들어야 합니다.
2. 설정
이 Codelab은 로컬 설치 또는 구성 없이 Google Cloud Platform에서 완전히 실행할 수 있습니다.
API 사용 설정
시작하기 전에 Google Cloud 프로젝트에서 필요한 API를 사용 설정해야 합니다.
Compute 인스턴스 웹 서버 만들기
웹 서버의 기본 방문 페이지를 볼 수 있도록 하는 방화벽 규칙과 함께 초기 nginx 웹 서버를 호스팅하는 데 사용할 컴퓨팅 인스턴스를 만들어 보겠습니다. 이 작업을 수행하는 방법은 여러 가지가 있지만 사용 편의성을 위해 Cloud Shell을 사용합니다.
Cloud Shell에서 다음을 실행합니다.
gcloud compute instances create webserver --zone=us-central1-a && \ gcloud compute firewall-rules create default-allow-http --allow=tcp:80
이 명령어의 첫 번째 절반은 us-central1-a 영역에 Google Cloud 인스턴스를 만들고 두 번째 절반은 네트워크로의 http 트래픽을 허용하는 'default-allow-http'라는 방화벽 규칙을 만듭니다.
인스턴스가 생성되면 인스턴스의 세부정보가 포함된 표가 표시됩니다. 외부 IP 를 기록해 둡니다. 나중에 웹 서버가 실행 중인지 확인하는 데 필요합니다.

인스턴스가 실행되면 Cloud Shell에서 인스턴스에 SSH로 연결하여 nginx를 설치하고 웹 서버를 시작할 수 있습니다.
gcloud compute ssh --zone us-central1-a webserver
컴퓨팅 인스턴스에 로그인한 후 nginx를 설치합니다.
sudo apt install nginx
logout 명령어로 SSH 세션에서 로그아웃합니다.
이전의 인스턴스 외부 IP 를 브라우저에 입력하여 웹 서버가 실행 중인지 확인해 보겠습니다. 기본 nginx 시작 화면이 표시됩니다.

이 웹 서버는 Migrate for Anthos를 사용하여 Kubernetes로 마이그레이션할 기존 웹 앱 역할을 합니다.
3. Migrate for Anthos가 포함된 Kubernetes 클러스터
다음으로 Compute Engine 웹 서버를 최종적으로 마이그레이션할 GKE 클러스터를 만듭니다. Cloud Console에서 다음을 실행합니다.
gcloud container clusters create my-gke-cluster \ --zone us-central1-a \ --cluster-version 1.13 \ --machine-type n1-standard-4 \ --image-type "UBUNTU" \ --num-nodes 1 \ --enable-stackdriver-kubernetes
이 명령어가 완료되는 데 몇 분 정도 걸립니다. 클러스터가 생성되면 세부정보가 포함된 출력이 표시됩니다.

다음으로 GCP Marketplace로 이동하여 Migrate for Anthos를 배포합니다.

Migrate for Anthos의 Marketplace 페이지에서 구성을 클릭하고 메시지가 표시되면 목록에서 프로젝트를 선택합니다. 다음 페이지에는 일부 기본값이 입력된 양식이 표시됩니다. 선택한 클러스터가 방금 만든 클러스터인지 확인하고 배포 를 클릭합니다.

이제 Migrate for Anthos가 Kubernetes 클러스터에 배포됩니다. 배포가 완료되면 Kubernetes Engine 애플리케이션 페이지에 '확인' 상태가 표시됩니다.

4. 컴퓨팅 인스턴스에서 스테이트풀(Stateful) 세트로
Migrate for Anthos를 실행하는 Kubernetes 클러스터가 있으므로 이제 마이그레이션 프로세스를 시작할 수 있습니다. 컴퓨팅 인스턴스를 Kubernetes 클러스터에 배포하려면 디스크의 스냅샷을 만들 수 있도록 Compute Engine 인스턴스를 종료합니다. 계속하기 전에 나중에 필요한 인스턴스 ID를 기록해 둡니다.
gcloud compute instances describe webserver --zone us-central1-a | grep ^id
컴퓨팅 인스턴스를 종료해 보겠습니다.
gcloud compute instances stop webserver --zone us-central1-a
이제 인스턴스가 중지되었으므로 다음 스크립트를 실행하여 디스크의 스냅샷을 안전하게 만들 수 있습니다. 프로젝트 ID 와 인스턴스 ID 를 삽입해야 합니다.
python3 /google/migrate/anthos/gce-to-gke/clone_vm_disks.py \ -p <project-id> -i <instance-id> \ -z us-central1-a \ -T us-central1-a \ -A webserver-statefulset \ -o containerized-webserver.yaml
이러한 플래그를 사용하면 clone_vm_disks.py가 다음을 수행합니다.
- GCE 인스턴스가 꺼져 있는지 확인합니다.
- 각 인스턴스 디스크에서 스냅샷을 만듭니다.
- 각 스냅샷에서 새 디스크를 만듭니다.
- 생성된 스냅샷을 삭제합니다.
- 웹 서버를 호스팅할 스테이트풀(Stateful) 세트를 배포하기 위해 현재 작업 디렉터리에 YAML 파일을 생성합니다.
생성된 YAML 파일은 복사된 디스크를 웹 서버 컨테이너에 마운트하는 데 필요한 영구 볼륨 신청과 함께 Kubernetes 클러스터에서 스테이트풀(Stateful) 세트 를 프로비저닝합니다. kubectl을 사용하여 이러한 변경사항을 적용할 수 있습니다.
kubectl apply -f containerized-webserver.yaml
워크로드 페이지에서 webserver-statefulset의 상태를 확인합니다.
kubectl apply를 실행한 후 몇 분 동안 상태가 '포드가 대기 중'으로 표시되는 것은 정상입니다. 상태가 '확인'으로 표시되면 계속 진행합니다.
5. 클러스터를 부하 분산기에 노출
이 시점에서 Kubernetes 클러스터는 웹 서버를 스테이트풀(Stateful) 세트로 실행해야 하지만 외부 IP 주소를 통해 웹 서버에 액세스하려면 컨테이너를 부하 분산기 에 노출해야 합니다. Cloud Shell에서 다음 콘텐츠가 포함된 loadbalancer.yaml이라는 새 파일을 만듭니다.
loadbalancer.yaml
apiVersion: v1
kind: Service
metadata:
name: webserver-loadbalancer
spec:
type: LoadBalancer
selector:
app: webserver-statefulset
ports:
- protocol: TCP
port: 80
targetPort: 80
이제 kubectl을 사용하여 적용합니다.
kubectl apply -f loadbalancer.yaml
kubectl을 사용하여 webserver-container 서비스의 외부 IP 주소를 가져올 수 있습니다.
kubectl get services
브라우저에 외부 IP 주소를 입력하면 이전과 동일한 기본 nginx 시작 화면이 표시됩니다.

우리가 해냈어요! 이제 GCE 웹 서버가 Kubernetes에서 호스팅됩니다. 좋은 소식입니다.
6. Stackdriver Monitoring
측정항목
관리형 Kubernetes 서비스인 Kubernetes Engine은 Stackdriver를 사용하여 로깅 및 모니터링을 위해 자동으로 계측됩니다. Stackdriver에서 자동으로 캡처하는 측정항목을 살펴보겠습니다.
제품 메뉴에서 Monitoring 링크를 클릭합니다. 프로젝트에서 처음 액세스하는 경우 작업공간을 설정하는 동안 몇 분 정도 걸릴 수 있습니다.
로드되면 왼쪽 창에서 리소스 위로 마우스를 가져간 후 메뉴에서 'Kubernetes Engine NEW'를 선택합니다.
여기에 표시된 대시보드의 각 행은 Kubernetes 리소스를 나타냅니다. 대시보드 위의 링크를 사용하여 인프라, 워크로드 또는 서비스 보기 간에 전환할 수 있습니다.

워크로드 보기에서 'my-gke-cluster'를 펼치고 기본 > webserver-statefulset > webserver-statefulset-0 > webserver-statefulset으로 드릴다운합니다. webserver-statefulset 컨테이너를 클릭합니다. 여기에는 메모리 사용률 및 CPU 사용률을 비롯하여 Stackdriver에서 캡처하는 기본 제공 측정항목이 있습니다.

이 대시보드에 표시된 차트는 커스텀 대시보드를 만드는 데 사용할 수 있는 차트입니다.
커스텀 대시보드
Stackdriver를 사용하면 사용 가능한 측정항목 데이터의 차트와 그래프를 구성하는 데 사용할 수 있는 커스텀 대시보드를 만들 수 있습니다. 웹 서버의 측정항목을 한눈에 볼 수 있도록 커스텀 대시보드를 만들어 보겠습니다.
왼쪽 창에서 대시보드 위로 마우스를 가져간 후 대시보드 만들기를 클릭합니다.

이제 빈 대시보드가 있으므로 주시할 측정항목을 추가할 수 있습니다. 제목 없는 대시보드에 '내 웹 서버 컨테이너'와 같은 유용한 이름을 지정하고 오른쪽 상단의 '차트 추가'를 클릭합니다.

기본 제공 측정항목을 기억하시나요? 컨테이너 CPU 사용률 차트를 추가해 보겠습니다. 차트 제목 필드에 'CPU 사용률'을 입력합니다. '리소스 유형 및 측정항목 찾기' 상자에 request_utilization을 입력하고 필터링된 목록에서 CPU 요청 사용률을 선택합니다. 이 선택 항목은 리소스 유형 및 측정항목 필드를 모두 채웁니다.
다음으로 프로젝트가 여러 개 있는 경우 project_id와 container_name으로 필터링합니다. 필터 상자에 project_id를 입력하고 필터링된 목록에서 선택한 후 값 필드에서 프로젝트를 선택합니다. container_name으로도 필터링해야 합니다. 필터 상자에 container_name을 입력하고 필터링된 목록에서 선택한 후 값 필드에서 webserver-statefulset을 선택합니다. 저장을 클릭합니다.
이제 첫 번째 차트가 포함된 대시보드가 있습니다.

7. 업타임 체크 및 알림 정책
Stackdriver를 사용하면 측정항목이 지정한 임곗값에 도달할 때 알림을 받도록 설정할 수 있습니다. 예를 들어 Stackdriver에서 마지막 단계의 CPU 사용률이 일정 시간 동안 특정 임곗값을 초과할 때 이메일을 보내도록 할 수 있습니다. 이는 앱에 문제가 있음을 나타낼 수 있습니다. 이러한 알림의 모양을 보여주기 위해 업타임 체크 를 설정한 후 중단을 시뮬레이션해 보겠습니다.
왼쪽 창에서 업타임 체크를 선택한 후 업타임 체크 개요를 선택합니다.

업타임 체크 페이지에서 제안하는 대로 첫 번째 업타임 체크를 설정해 보겠습니다. 페이지 오른쪽 상단에 있는 업타임 체크 추가 버튼을 클릭합니다.
다음 양식에서 제목으로 '엔드포인트 업타임'을 입력하고 호스트 이름으로 부하 분산기의 외부 IP 주소를 입력합니다.

저장을 클릭하면 함께 제공되는 알림 정책을 만들라는 메시지가 표시됩니다.

알림 정책 만들기 를 클릭합니다.
이름을 '엔드포인트 업타임 정책'으로 지정해 보겠습니다. 구성 섹션에서 '다음의 경우 조건 트리거'를 '시계열 위반'으로 설정하고 저장 을 클릭합니다.

아직 끝나지 않았습니다. 다음으로 알림 정책이 위반될 때 알림을 받도록 알림 채널을 지정합니다. 알림 채널 유형 드롭다운에서 이메일을 선택한 후 유효한 이메일 주소를 선택합니다.

알림 채널 추가를 클릭합니다. 마지막으로 양식 하단에서 정책 이름을 '웹 앱 업타임'으로 지정하고 저장을 클릭합니다.
알림이 어떻게 표시되는지 확인하려면 Cloud Console에서 Cloud Shell을 다시 엽니다. 다음 명령어는 웹 서버 포드에서 실행 중인 nginx 서비스를 중지합니다.
kubectl exec -t webserver-statefulset-0 -- /bin/bash -c "nginx -s stop"
몇 분 후에 중단을 알리는 이메일이 전송됩니다.

이 작업을 실행취소해 보겠습니다. Cloud Shell로 돌아가서 nginx를 다시 시작해 보겠습니다.
kubectl exec -t webserver-statefulset-0 -- /bin/bash -c "nginx"
몇 분 후에 다른 Stackdriver 이메일이 전송됩니다. 이번에는 이전보다 더 좋은 소식이 있습니다.

8. 정리
이제 Migrate for Anthos를 사용하여 GCE에서 GKE로 마이그레이션했으므로 생성한 모든 리소스를 프로젝트에서 정리해 보겠습니다.
프로젝트 삭제하기
원하는 경우 전체 프로젝트를 삭제할 수 있습니다. GCP Console에서 Cloud Resource Manager 페이지로 이동합니다.
프로젝트 목록에서 작업 중인 프로젝트를 선택하고 삭제를 클릭합니다. 프로젝트 ID를 입력하라는 메시지가 표시됩니다. 프로젝트 ID를 입력하고 종료 를 클릭합니다.
여러 구성요소를 하나씩 삭제하려면 다음 섹션으로 진행합니다.
Stackdriver
대시보드
대시보드 페이지에서 페이지 상단의 설정 아이콘
을 클릭하고 대시보드 삭제를 선택합니다.
알림 정책
정책 페이지에서 만든 각 정책의 오른쪽에 있는 작업 메뉴
에서 삭제를 선택합니다.
업타임 체크
업타임 체크 페이지에서 만든 각 체크의 오른쪽에 있는 작업 메뉴에서 삭제 를 선택합니다.
GCE 및 Kubernetes
Google Compute Engine 인스턴스
gcloud compute instances delete webserver --zone=us-central1-a
Kubernetes 클러스터(Migrate for Anthos, 스테이트풀(Stateful) 세트, 부하 분산기 서비스 포함)
gcloud container clusters delete my-gke-cluster --zone=us-central1-a
디스크
스테이트풀(Stateful) 세트에서 만든 디스크를 사용했습니다. 다음을 사용하여 이름을 가져옵니다.
gcloud compute disks list --filter=webserver
내 디스크 이름 대신 디스크 이름을 사용하여 다음 명령어로 삭제합니다.
gcloud compute disks delete vls-690d-webserver --zone=us-central1-a
모두 삭제되었습니다.
9. 수고하셨습니다
수고하셨습니다 Migrate for Anthos를 사용하여 웹 서버를 GCE 인스턴스에서 Kubernetes 클러스터로 마이그레이션했습니다.
학습한 내용
- Migrate for Anthos를 사용하여 웹 서버를 GCE에서 Kubernetes 클러스터로 마이그레이션했습니다.
- Kubernetes 부하 분산기 서비스를 통해 노출하여 스테이트풀(Stateful) 세트 웹 서버를 전 세계에 공개했습니다.
- Stackdriver를 사용 설정하고 커스텀 대시보드를 만들었습니다.
- 웹 서버가 다운될 때 알려주는 알림 정책과 함께 업타임 체크를 구성했습니다.
