Migrate for Anthos를 사용하여 Compute Engine에서 Kubernetes Engine으로 마이그레이션

1. 개요

Kubernetes에서 작동하도록 기존 애플리케이션을 다시 작성하거나 리엔지니어링하는 것은 수동으로 항상 가능하거나 실행 가능한 것은 아닙니다. Migrate for Anthos를 사용하면 기존 애플리케이션을 현대화하고 Kubernetes에서 실행할 수 있습니다. 이 Codelab에서는 Compute Engine에서 호스팅되는 기존 웹 앱을 Migrate for Anthos를 사용하여 Kubernetes Engine으로 이전합니다.

학습할 내용

  • Kubernetes 클러스터에 Migrate for Anthos를 배포하는 방법
  • 기존 Compute Engine 인스턴스에서 스테이트풀 세트의 컨테이너를 만드는 방법
  • Kubernetes에 컨테이너를 배포하고 부하 분산기로 구성하는 방법

필요한 항목

2. 설정

이 Codelab은 로컬 설치나 구성 없이 Google Cloud Platform에서 완전히 실행할 수 있습니다.

API 사용 설정

시작하기 전에 Google Cloud 프로젝트에서 필요한 API를 사용 설정해야 합니다.

컴퓨트 인스턴스 웹 서버 만들기

초기 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를 기록해 둡니다. 나중에 웹 서버가 실행 중인지 확인하는 데 필요합니다.

a08aa5bf924b107d.png

인스턴스가 실행되면 Cloud Shell에서 인스턴스로 SSH 연결하여 nginx를 설치하고 웹 서버를 시작할 수 있습니다.

gcloud compute ssh --zone us-central1-a webserver

컴퓨팅 인스턴스에 로그인한 후 nginx를 설치합니다.

sudo apt install nginx

logout 명령어로 SSH 세션에서 로그아웃합니다.

브라우저에 앞서 확인한 인스턴스의 외부 IP를 입력하여 웹 서버가 실행 중인지 확인해 보겠습니다. 다음과 같이 기본 nginx 시작 화면이 표시됩니다.

5c08e3b2bd17e03.png

이 웹 서버는 Migrate for Anthos를 사용하여 Kubernetes로 이전할 기존 웹 앱 역할을 합니다.

3. Migrate for Anthos가 포함된 Kubernetes 클러스터

다음으로 Compute Engine 웹 서버를 최종적으로 이전할 GKE 클러스터를 만듭니다. Cloud 콘솔에서 다음을 실행합니다.

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

이 명령어가 완료되는 데 몇 분 정도 걸릴 수 있습니다. 클러스터가 생성되면 세부정보가 포함된 출력이 표시됩니다.

c69778b8fb8ac72b.png

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

45f5753cae53ccb5.png

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

94dc6238b2affd16.png

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

5bf601103a5335cf.png

4. 컴퓨팅 인스턴스에서 스테이트풀 세트까지

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 인스턴스가 꺼져 있는지 확인
  • 인스턴스의 각 디스크에서 스냅샷 만들기
  • 각 스냅샷에서 새 디스크 만들기
  • 생성된 스냅샷 삭제
  • 웹 서버를 호스팅할 스테이트풀 세트를 배포하기 위해 현재 작업 디렉터리에 YAML 파일을 생성합니다.

생성된 yaml 파일은 복사된 디스크를 웹 서버 컨테이너에 마운트하는 데 필요한 영구 볼륨 클레임과 함께 Kubernetes 클러스터에 스테이트풀 세트를 프로비저닝합니다. kubectl를 사용하여 이러한 변경사항을 적용할 수 있습니다.

kubectl apply -f containerized-webserver.yaml

워크로드 페이지에서 webserver-statefulset의 상태를 확인합니다.

kubectl apply를 실행한 후 몇 분 동안 상태가 '포드가 대기 중입니다'로 표시되는 것은 정상입니다. 상태가 '확인'으로 표시되면 다음 단계로 진행합니다.

5. 부하 분산기에 클러스터 노출

이 시점에서 Kubernetes 클러스터는 웹 서버를 스테이트풀 세트로 실행해야 하지만 외부 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 시작 화면이 표시됩니다.

5c08e3b2bd17e03.png

우리가 해냈어! 이제 GCE 웹 서버가 Kubernetes에서 호스팅됩니다. 좋은 소식입니다.

6. Stackdriver Monitoring

측정항목

관리형 Kubernetes 서비스인 Kubernetes Engine은 Stackdriver를 사용한 로깅 및 모니터링을 위해 자동으로 계측됩니다. Stackdriver에서 자동으로 캡처하는 측정항목을 살펴보겠습니다.

제품 메뉴에서 모니터링 링크를 클릭합니다. 프로젝트에서 처음 액세스하는 경우 작업공간을 설정하는 데 몇 분 정도 걸릴 수 있습니다.

로드가 완료되면 왼쪽 창에서 리소스 위로 마우스를 가져간 후 메뉴에서 'Kubernetes Engine NEW'를 선택합니다.

4e62c8ad3f2b3fe9.png

여기에 표시된 대시보드의 각 행은 Kubernetes 리소스를 나타냅니다. 대시보드 위의 링크를 사용하여 인프라, 워크로드 또는 서비스 보기 간에 전환할 수 있습니다.

62066a9251d19843.png

워크로드 뷰에서 'my-gke-cluster'를 펼치고 default > webserver-statefulset > webserver-statefulset-0 > webserver-statefulset으로 드릴다운합니다. webserver-stateful set 컨테이너를 클릭합니다. 여기에는 메모리 사용률, CPU 사용률 등 Stackdriver에서 기본적으로 캡처하는 측정항목이 표시됩니다.

d054778de301429e.png

이 대시보드에 표시된 차트는 커스텀 대시보드를 만드는 데 사용할 수 있습니다.

커스텀 대시보드

Stackdriver를 사용하면 사용 가능한 모든 측정항목 데이터의 차트와 그래프를 정리하는 데 사용할 수 있는 맞춤 대시보드를 만들 수 있습니다. 웹 서버의 측정항목을 한눈에 볼 수 있는 맞춤 대시보드를 만들어 보겠습니다.

왼쪽 창에서 대시보드 위로 마우스를 가져간 다음 대시보드 만들기를 클릭합니다.

56a0513efe60de3e.png

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

bd66ba91f3125028.png

기본 제공 측정항목을 기억하시나요? 컨테이너 CPU 사용률 차트를 추가해 보겠습니다. 차트 제목 필드에 'CPU 사용률'을 입력합니다. '리소스 유형 및 측정항목 찾기' 상자에 request_utilization을 입력하고 필터링된 목록에서 CPU 요청 사용률을 선택합니다. 이 선택 항목은 리소스 유형과 측정항목 필드를 모두 채웁니다.

다음으로 project_id (프로젝트가 여러 개인 경우)와 container_name으로 필터링합니다. 필터 상자에 project_id를 입력하고 필터링된 목록에서 선택한 다음 값 필드에서 프로젝트를 선택합니다. container_name으로도 필터링해야 합니다. 필터 상자에 container_name을 입력하고 필터링된 목록에서 선택한 후 값 필드에서 webserver-statefulset을 선택합니다. 저장을 클릭합니다.

이제 첫 번째 차트가 포함된 대시보드가 표시됩니다.

3d3d45e4357454e0.png

7. 업타임 체크 및 알림 정책

Stackdriver를 사용하면 지정한 기준값에 측정항목이 도달할 때 알림을 받도록 설정할 수 있습니다. 예를 들어 마지막 단계의 CPU 사용률이 일정 시간 동안 특정 기준을 초과하면 Stackdriver에서 이메일을 보내도록 할 수 있습니다. 이는 앱에 문제가 있음을 나타낼 수 있습니다. 이러한 알림이 어떻게 표시되는지 보여주기 위해 가동시간 확인을 설정한 다음 서비스 중단을 시뮬레이션해 보겠습니다.

왼쪽 창에서 업타임 체크를 선택한 다음 업타임 체크 개요를 선택합니다.

49368e5700274cf2.png

업타임 체크 페이지에 표시된 대로 첫 번째 업타임 체크를 설정해 보겠습니다. 페이지 오른쪽 상단의 가동시간 확인 추가 버튼을 클릭합니다.

d884560f91011009.png

계속되는 양식에서 제목으로'엔드포인트 가동시간'을 입력하고 호스트 이름으로 부하 분산기의 외부 IP 주소를 입력합니다.

568a8f1e27ae8417.png

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

f89d53a106a709f4.png

알림 정책 만들기를 클릭합니다.

이름을'엔드포인트 가동시간 정책'으로 지정합니다. 구성 섹션에서 '다음의 경우 조건 트리거'를 '시계열 위반'으로 설정하고 저장을 클릭합니다.

74609849348bd03e.png

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

44c474e28a497659.png

알림 채널 추가를 클릭합니다. 마지막으로 양식 하단에서 정책 이름을 'Web App Uptime'으로 지정하고 'Save'(저장)를 클릭합니다.

알림이 어떻게 표시되는지 확인하려면 Cloud Console에서 Cloud Shell을 다시 엽니다. 다음 명령어는 웹 서버 포드에서 실행되는 nginx 서비스를 중지합니다.

kubectl exec -t webserver-statefulset-0 -- /bin/bash -c "nginx -s stop"

몇 분 후에 서비스 중단을 알리는 이메일이 전송됩니다.

808ac1d75ce3681f.png

이 작업을 실행취소해 보겠습니다. Cloud Shell로 돌아가서 nginx를 다시 시작합니다.

kubectl exec -t webserver-statefulset-0 -- /bin/bash -c "nginx"

몇 분 후 Stackdriver 이메일이 다시 전송됩니다. 이번에는 이전보다 더 좋은 소식이 담겨 있습니다.

5b8262fbbc4877c.png

8. 삭제

이제 Migrate for Anthos를 사용하여 GCE에서 GKE로 마이그레이션했으므로 생성한 모든 리소스를 프로젝트에서 정리해 보겠습니다.

프로젝트 삭제하기

원하는 경우 전체 프로젝트를 삭제할 수 있습니다. GCP Console에서 Cloud Resource Manager 페이지로 이동합니다.

프로젝트 목록에서 작업 중인 프로젝트를 선택하고 삭제를 클릭합니다. 프로젝트 ID를 입력하라는 메시지가 표시됩니다. 프로젝트 ID를 입력하고 종료를 클릭합니다.

여러 구성요소를 하나씩 삭제하려면 다음 섹션으로 진행하세요.

Stackdriver

대시보드

대시보드 페이지에서 페이지 상단의 설정 아이콘 dc259295eb33cb42.png을 클릭하고 대시보드 삭제를 선택합니다.

알림 정책

정책 페이지에서 생성한 각 정책의 오른쪽에 있는 작업 메뉴 2ef75d82e76accaa.png에서 삭제를 선택합니다.

업타임 체크

업타임 체크 페이지에서 만든 각 체크의 오른쪽에 있는 작업 메뉴에서 삭제를 선택합니다.

GCE 및 Kubernetes

Google Compute Engine 인스턴스

gcloud compute instances delete webserver --zone=us-central1-a

Kubernetes 클러스터 (Migrate for Anthos, 스테이트풀 세트, 부하 분산기 서비스 포함)

gcloud container clusters delete my-gke-cluster --zone=us-central1-a

디스크

스테이트풀 세트에서 사용한 디스크는 사용자가 만든 디스크입니다. 다음 코드를 사용하여 이름을 가져옵니다.

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 부하 분산기 서비스를 통해 스테이트풀 세트 웹 서버를 노출하여 전 세계에 공개했습니다.
  • Stackdriver를 사용 설정하고 맞춤 대시보드를 만들었습니다.
  • 웹 서버가 다운될 때 알림을 받을 수 있도록 알림 정책과 함께 업타임 체크를 구성했습니다.