체크포인트
Create a Kubernetes cluster
/ 5
Create the monolith pod
/ 5
Create the healthy-monolith pod
/ 5
Create a secret, service, firewall rule and pod with label
/ 5
Kubernetes 기본사항 v1.6
개요
이 실습에서는 다음을 수행하는 방법에 대해 알아봅니다.
- Google Kubernetes Engine을 사용하여 Kubernetes 프로비저닝
-
kubectl
을 사용하여 Docker 컨테이너 배포 및 관리 - Kubernetes 배포 및 서비스를 통해 애플리케이션을 마이크로서비스로 분할
Kubernetes Engine과 Kubernetes API를 사용하여 애플리케이션을 배포, 관리 및 업그레이드할 수 있습니다. 'app'이라는 예제 애플리케이션을 사용하여 실습을 완료해보세요.
설정
1단계
각 실습에서는 정해진 기간 동안 새 Google Cloud 프로젝트와 리소스 집합이 무료로 제공됩니다.
-
시크릿 창을 사용하여 Qwiklabs에 로그인합니다.
-
실습 사용 가능 시간(예:
1:15:00
)을 참고하여 해당 시간 내에 완료합니다.
일시중지 기능은 없습니다. 필요한 경우 다시 시작할 수 있지만 처음부터 시작해야 합니다. -
준비가 되면 실습 시작을 클릭합니다.
-
실습 사용자 인증 정보(사용자 이름 및 비밀번호)를 기록해 두세요. Google Cloud Console에 로그인합니다.
-
Google Console 열기를 클릭합니다.
-
다른 계정 사용을 클릭한 다음, 안내 메시지에 이 실습에 대한 사용자 인증 정보를 복사하여 붙여넣습니다.
다른 사용자 인증 정보를 사용하는 경우 오류가 발생하거나 요금이 부과됩니다. -
약관에 동의하고 리소스 복구 페이지를 건너뜁니다.
2단계
다음 API가 Cloud Platform Console에서 사용 설정되어 있는지 확인합니다.
- Kubernetes Engine API
- Container Registry API
탐색 메뉴()에서 API 및 서비스를 클릭합니다.
아래로 스크롤하여 API가 사용 설정되어 있는지 확인합니다.
API가 누락된 경우 상단의 API 및 서비스 사용 설정을 클릭하고, API를 이름으로 검색하여 해당 프로젝트에서 사용하도록 설정합니다.
3단계
Google Cloud Shell 활성화하기
Google Cloud Shell은 다양한 개발 도구가 탑재된 가상 머신으로, 5GB의 영구 홈 디렉터리를 제공하며 Google Cloud에서 실행됩니다.
Google Cloud Shell을 사용하면 명령줄을 통해 Google Cloud 리소스에 액세스할 수 있습니다.
-
Cloud 콘솔의 오른쪽 상단 툴바에서 'Cloud Shell 열기' 버튼을 클릭합니다.
-
계속을 클릭합니다.
환경을 프로비저닝하고 연결하는 데 몇 분 정도 소요됩니다. 연결되면 사용자가 미리 인증되어 프로젝트가 PROJECT_ID로 설정됩니다. 예:
gcloud는 Google Cloud의 명령줄 도구입니다. Cloud Shell에 사전 설치되어 있으며 명령줄 자동 완성을 지원합니다.
- 다음 명령어를 사용하여 사용 중인 계정 이름을 나열할 수 있습니다.
출력:
출력 예시:
- 다음 명령어를 사용하여 프로젝트 ID를 나열할 수 있습니다.
출력:
출력 예시:
4단계
Git 저장소에서 샘플 코드를 가져옵니다.
git clone https://github.com/googlecodelabs/orchestrate-with-kubernetes.git
5단계
앱 레이아웃을 검토합니다.
cd orchestrate-with-kubernetes/kubernetes
ls
다음과 같은 구조가 표시됩니다.
|
|
|
|
|
|
|
|
|
|
|
|
코드를 가져왔으므로 이제 Kubernetes를 사용해 보겠습니다.
간단한 Kubernetes 데모
Kubernetes 클러스터 시작하기
1단계
영역을 프로젝트 기본 영역으로 정의합니다. 이렇게 하면 gcloud 명령어에 --zone 매개변수를 지정하지 않아도 됩니다.
gcloud config set compute/zone us-central1-a
Cloud Shell에서 다음 명령어를 실행하여 5개의 노드를 실행하는 bootcamp
라는 Kubernetes 클러스터를 시작합니다.
gcloud container clusters create bootcamp --num-nodes 5 --scopes "https://www.googleapis.com/auth/projecthosting,storage-rw"
scopes
인수는 나중에 사용할 프로젝트 호스팅 및 Google Cloud Storage API에 대한 액세스 권한을 제공합니다.
내 진행 상황 확인하기를 클릭하여 목표를 확인합니다.
2단계
클러스터가 생성되면 kubectl version
명령어를 사용하여 Kubernetes의 설치 버전을 확인합니다.
kubectl version
3단계
kubectl cluster-info
를 사용하여 클러스터에 관해 자세히 알아봅니다.
kubectl cluster-info
4단계
Cloud Platform Console에서 실행 중인 노드를 확인합니다.
탐색 메뉴를 열고 Compute Engine > VM 인스턴스로 이동합니다.
Bash 완성(선택사항)
Kubernetes에는 자동 완성 기능이 기본으로 포함되어 있습니다. kubectl completion 명령어와 내장된 source
명령어를 사용하면 이 기능을 설정할 수 있습니다.
1단계
다음 명령어를 실행합니다.
source <(kubectl completion bash)
2단계
탭을 눌러 사용 가능한 명령어 목록을 표시합니다.
다음 예시를 시도해봅니다.
kubectl <TAB><TAB>
명령어를 부분 입력한 후 완성할 수도 있습니다.
kubectl co<TAB><TAB>
이 기능을 통해 kubectl
의 사용이 더욱 쉬워집니다.
컨테이너 실행 및 배포
Kubernetes를 시작하는 가장 쉬운 방법은 kubectl create deployment
명령어를 사용하는 것입니다.
1단계
kubectl create deployment
을 사용하여 nginx 컨테이너의 인스턴스 하나를 실행합니다.
kubectl create deployment nginx --image=nginx:1.10.0
2단계
kubectl get pods
명령어를 사용하여 nginx 컨테이너가 실행되고 있는 pod를 확인합니다.
kubectl get pods
3단계
kubectl expose
명령어를 사용하여 nginx 컨테이너를 Kubernetes 외부에 노출시킵니다.
kubectl expose deployment nginx --port 80 --type LoadBalancer
4단계
kubectl get
명령어를 사용하여 새 서비스를 확인합니다.
kubectl get services
nginx 컨테이너를 원격으로 테스트하고 접속하는 데 사용할 수 있는 외부 IP가 표시됩니다.
5단계
kubectl scale
명령어를 사용하여 서비스에서 실행되고 있는 백엔드 애플리케이션(pod)의 수를 늘립니다.
kubectl scale deployment nginx --replicas 3
이는 트래픽이 증가하는 웹 애플리케이션의 작업 부하를 늘리고 싶을 때 유용합니다.
6단계
pod를 한 번 더 가져와서 Kubernetes에서 pod 수를 업데이트했는지 확인합니다.
kubectl get pods
7단계
kubectl get services
명령어를 다시 사용하여 외부 IP 주소가 변경되지 않았는지 확인합니다.
kubectl get services
8단계
curl
명령어에 외부 IP 주소를 사용하여 데모 애플리케이션을 테스트합니다.
curl http://<External IP>:80
Kubernetes에서는 kubectl run
, expose
및 scale
명령어를 통해 바로 사용할 수 있는 간편한 워크플로를 지원합니다.
삭제
다음 명령어를 실행하여 nginx를 삭제합니다.
kubectl delete deployment nginx
kubectl delete service nginx
Kubernetes를 간단하게 둘러보았으니 이제 각 구성요소와 추상화에 대해 자세히 알아보겠습니다.
Pod
pod에 대해 자세히 알아보겠습니다.
pod 만들기
pod 구성 파일을 사용하여 pod를 생성할 수 있습니다.
1단계
kubectl explain
명령어를 사용하여 내장 pod 문서를 살펴봅니다.
kubectl explain pods
2단계
모놀리식 pod의 구성 파일을 살펴봅니다.
cat pods/monolith.yaml
3단계
kubectl explain
명령어를 .spec
옵션과 함께 사용하여 API 개체에 대한 자세한 내용을 확인합니다. 이 예제에서는 컨테이너를 살펴보겠습니다.
kubectl explain pods.spec.containers
계속 진행하기 전에 API의 나머지 부분도 살펴보세요.
4단계
kubectl create
를 사용하여 monolith
를 생성합니다.
kubectl create -f pods/monolith.yaml
내 진행 상황 확인하기를 클릭하여 목표를 확인합니다.
5단계
kubectl get pods
명령어를 사용하여 기본 네임스페이스에서 실행 중인 모든 pod를 나열합니다.
kubectl get pods
6단계
pod가 실행되면 kubectl describe
명령어를 사용하여 monolith
pod에 대한 자세한 정보를 가져옵니다.
kubectl describe pods monolith
pod IP 주소 및 이벤트 로그를 포함한 monolith
pod에 대한 자세한 정보가 표시됩니다. 문제를 해결해야 할 때 이러한 정보를 유용하게 사용할 수 있습니다.
이와 같이 Kubernetes를 사용하면 구성 파일에 pod 관련 내용을 기술하여 간편하게 pod를 만들 수 있으며, pod가 실행 중일 때 정보를 쉽게 확인할 수 있습니다. 이제 배포에 필요한 모든 pod를 생성할 수 있을 것입니다.
pod와 상호작용
pod에는 기본적으로 비공개 IP 주소가 할당되며 클러스터 밖에서는 이에 접근할 수 없습니다. kubectl port-forward
명령어를 사용하여 로컬 포트를 monolith
pod 내의 포트에 매핑합니다.
터미널을 두 개 사용합니다. 하나에서는 kubectl port-forward
명령어를 실행하고 다른 하나에서는 curl
명령어를 실행합니다.
1단계
Cloud Shell에서 +
버튼을 클릭하여 새 터미널을 엽니다.
2단계
다음 명령어를 실행하여 로컬 포트 10080에서 컨테이너가 수신하는 pod 포트 80으로 포트 전달을 설정합니다.
kubectl port-forward monolith 10080:80
3단계
pod에 액세스하려면 첫 번째 터미널 창으로 돌아가 다음 curl
명령어를 실행합니다.
curl http://127.0.0.1:10080
컨테이너로부터 'Hello' 응답을 받게 됩니다.
4단계
보안 엔드포인트에 도달하면 어떻게 되는지 확인합니다.
curl http://127.0.0.1:10080/secure
오류가 표시되어야 합니다.
5단계
로그인하여 monolith
에서 인증 토큰을 가져옵니다.
curl -u user http://127.0.0.1:10080/login
로그인 메시지에서 비밀번호를 password
로 입력하여 로그인합니다.
6단계
Cloud Shell은 긴 문자열을 잘 복사하지 못하므로 토큰을 환경 변수에 복사합니다.
TOKEN=$(curl http://127.0.0.1:10080/login -u user|jq -r '.token')
로그인 메시지에서 비밀번호를 password
로 입력하여 로그인합니다.
7단계
인증 토큰을 포함해 다시 보안 엔드포인트에 액세스합니다.
curl -H "Authorization: Bearer $TOKEN" http://127.0.0.1:10080/secure
8단계
kubectl logs
명령어를 사용하여 monolith
pod의 로그를 확인합니다.
kubectl logs monolith
9단계
다른 터미널을 열고 -f
플래그를 사용하여 실시간 로그 스트림을 가져옵니다.
세 번째 터미널을 생성하려면 Cloud Shell에서 +
버튼을 클릭하고 다음 명령어를 실행합니다.
kubectl logs -f monolith
10단계
터미널 1에서 curl
을 사용하여 monolith
와 상호작용합니다. 그러면 터미널 3에 로그 업데이트가 표시됩니다.
curl http://127.0.0.1:10080
11단계
kubectl exec
명령어를 사용하여 monolith
pod의 대화형 셸을 실행합니다. 이는 컨테이너 내에서 문제를 해결하고 싶은 경우에 유용합니다.
kubectl exec monolith --stdin --tty -c monolith /bin/sh
12단계
선택사항: 셸에서 ping
명령어를 사용하여 외부(외부 발신) 연결을 테스트할 수 있습니다.
ping -c 3 google.com
13단계
셸에서 로그아웃합니다.
exit
이와 같이 pod와의 상호작용은 kubectl
명령어를 사용하는 것만큼 쉽습니다. 컨테이너를 원격으로 테스트하거나 로그인 셸을 가져와야 하는 경우 시작하는 데 필요한 모든 요소를 Kubernetes가 제공합니다.
14단계
터미널 2와 3에서 kubectl port-forward
및 kubectl logs
를 종료하려면 Ctrl+C
키를 누릅니다.
모니터링 및 상태 확인
Kubernetes는 준비 상태 및 활성 여부 프로브의 형태로 애플리케이션 모니터링을 지원합니다. 상태 확인은 pod의 각 컨테이너에서 수행할 수 있습니다. 준비 상태 프로브는 pod가 트래픽을 지원할 '준비'가 된 시점을 나타냅니다. 활성 여부 프로브는 컨테이너가 '활성화'되었는지를 나타냅니다. 활성 여부 프로브에서 실패가 여러 번 반복되면 컨테이너가 다시 시작됩니다. 활성 여부 프로브에서 실패가 계속될 경우에는 pod가 비정상 종료 루프로 전환됩니다. 준비 상태 확인에 실패하면 컨테이너가 준비 안 됨으로 표시되고 모든 부하 분산기에서 제거됩니다.
이 실습에서는 healthy-monolith
라는 새로운 pod를 배포해 보겠습니다. 이 pod는 대부분 monolith
pod를 기반으로 하며, 준비 상태 및 활성 여부 프로브가 추가된 것입니다.
이 실습에서는 다음을 수행하는 방법에 대해 알아봅니다.
-
준비 상태 및 활성 여부 프로브가 포함된 pod를 만듭니다.
-
준비 상태 및 활성 여부 프로브의 실패 문제를 해결합니다.
활성 여부 및 준비 상태 프로브가 포함된 pod 만들기
1단계
healthy-monolith
pod 구성 파일을 살펴봅니다.
cat pods/healthy-monolith.yaml
2단계
kubectl
을 사용하여 healthy-monolith
pod를 생성합니다.
kubectl create -f pods/healthy-monolith.yaml
내 진행 상황 확인하기를 클릭하여 목표를 확인합니다.
3단계
pod는 준비 상태 프로브가 HTTP 200 응답을 반환하기 전까지 준비됨으로 표시되지 않습니다. kubectl describe
명령어를 사용하여 healthy-monolith pod의 세부정보를 확인합니다.
kubectl describe pod healthy-monolith
준비 상태 프로브
Kubernetes가 실패한 준비 상태 프로브에 대해 어떻게 응답하는지 확인해 보겠습니다. monolith
컨테이너는 준비 상태 및 활성 여부 프로브를 강제로 실패하도록 할 수 있으므로, healthy-monolith
pod의 실패를 시뮬레이션할 수 있습니다.
1단계
터미널 2에서 kubectl port-forward
명령어를 사용하여 로컬 포트를 healthy-monolith
pod의 상태 포트로 전달합니다.
kubectl port-forward healthy-monolith 10081:81
2단계
강제적으로 monolith
컨테이너의 준비 상태 프로브가 실패하도록 합니다. 터미널 1에서 curl
명령어를 사용하여 준비 상태 프로브의 상태를 전환합니다. 이 명령어는 실행해도 아무 것도 출력하지 않습니다.
curl http://127.0.0.1:10081/readiness/status
3단계
kubectl get
pods -w
명령어를 사용하여 healthy-monolith
pod의 상태를 가져옵니다.
kubectl get pods healthy-monolith -w
4단계
준비된 컨테이너가 0/1
개 있으면 Ctrl+C
키를 누릅니다. kubectl describe
명령어를 사용하여 준비 상태 프로브 실패에 관한 자세한 정보를 가져옵니다.
kubectl describe pods healthy-monolith
5단계
실패한 준비 상태 프로브에 관한 healthy-monolith
pod 보고서 세부정보의 이벤트를 확인합니다.
monolith
컨테이너 준비 상태 프로브를 강제로 성공하게 하려면 curl
명령어를 사용하여 준비 상태 프로브의 상태를 전환합니다.
curl http://127.0.0.1:10081/readiness/status
6단계
15초 가량 기다린 후에 kubectl get pods
명령어를 사용하여 healthy-monolith
pod의 상태를 가져옵니다.
kubectl get pods healthy-monolith
7단계
터미널 2에서 Ctrl+C
키를 눌러 kubectl
프록시(예: port-forward
) 명령어를 닫습니다.
활성 여부 프로브
이전 가이드에서 학습한 내용을 토대로, kubectl port-forward
및 curl
명령어를 사용하여 강제적으로 monolith
컨테이너의 활성 여부 프로브가 실패하도록 하고, Kubernetes가 실패한 활성 여부 프로브에 어떻게 응답하는지 관찰해 보겠습니다.
1단계
터미널 2에서 kubectl port-forward
명령어를 사용하여 로컬 포트를 healthy-monolith
pod의 상태 포트로 전달합니다.
kubectl port-forward healthy-monolith 10081:81
2단계
다른 터미널에서 curl
명령어를 사용하여 준비 상태 프로브의 상태를 변경함으로써 monolith
컨테이너의 준비 상태 프로브가 강제로 성공하도록 합니다.
curl http://127.0.0.1:10081/healthz/status
3단계
kubectl get pods -w
명령어를 사용하여 healthy-monolith
pod의 상태를 가져옵니다.
kubectl get pods healthy-monolith -w
4단계
활성 여부 프로브가 실패하면 컨테이너가 다시 시작됩니다. 다시 시작되면 healthy-monolith
pod가 정상 상태로 돌아와야 합니다. pod가 다시 시작되면 Ctrl+C
키를 눌러 명령어를 종료합니다. 재시작 횟수를 기록합니다.
5단계
kubectl describe
명령어를 사용하여 실패한 활성 여부 프로브에 대한 자세한 정보를 가져옵니다. 활성 여부 프로브가 실패하고 pod가 다시 시작된 시점의 관련 이벤트를 볼 수 있습니다.
kubectl describe pods healthy-monolith
6단계
작업을 마치면 터미널 2에서 Ctrl+C
키를 눌러 kubectl proxy
명령어를 닫습니다.
서비스
다음 단계:
-
서비스를 생성합니다.
-
라벨 선택기를 사용하여 일정 수의 pod를 외부에 노출시킵니다.
서비스 만들기
서비스를 생성하기에 앞서, HTTPS 트래픽을 처리할 수 있는 secure-monolith
라는 nginx 서버로 보안 pod를 생성합니다.
1단계
보안 pod가 데이터를 가져오거나 처리하는 데 사용할 볼륨 두 개를 생성합니다.
secret
유형의 첫 번째 볼륨은 nginx 서버의 TLS 인증 파일을 저장합니다.
터미널 1로 돌아온 후 다음 명령어를 사용하여 첫 번째 볼륨을 생성합니다.
kubectl create secret generic tls-certs --from-file tls/
nginx의 구성 파일을 보관할 ConfigMap
유형의 두 번째 볼륨을 생성합니다.
kubectl create configmap nginx-proxy-conf --from-file nginx/proxy.conf
2단계
nginx에서 사용할 proxy.conf
파일을 살펴봅니다.
cat nginx/proxy.conf
이 파일은 SSL 상태를 ON으로 지정하고, 컨테이너 파일 시스템에 인증 파일의 위치를 지정합니다.
3단계
secure-monolith
pod 구성 파일을 살펴봅니다.
cat pods/secure-monolith.yaml
4단계
다음 명령어를 실행하여 구성 데이터로 secure-monolith
pod를 생성합니다.
kubectl create -f pods/secure-monolith.yaml
보안 pod를 만들었으므로 이제 Kubernetes 서비스를 사용하여 secure-monolith
pod를 외부로 노출시킵니다.
5단계
모놀리식 서비스 구성 파일을 살펴봅니다.
cat services/monolith.yaml
6단계
kubectl create
명령어를 사용하여 모놀리식 서비스 구성 파일로 모놀리식 서비스를 만듭니다.
kubectl create -f services/monolith.yaml
보통은 Kubernetes에서 이러한 포트 할당을 알아서 처리합니다. 이 실습에서 포트를 선택한 이유는 나중에 상태 확인을 구성하기가 더 편하기 때문입니다.
7단계
gcloud compute firewall-rules
명령어를 사용하여 노출된 nodeport의 모놀리식 서비스로 트래픽을 전달합니다.
gcloud compute firewall-rules create allow-monolith-nodeport --allow=tcp:31000
이제 모든 설정이 완료되었으므로, 포트 전달을 사용하지 않고도 클러스터 외부에서 secure-monolith
서비스를 테스트할 수 있습니다.
8단계
노드 하나의 IP 주소를 가져옵니다.
gcloud compute instances list
9단계
브라우저에서 URL을 열어봅니다.
https://<EXTERNAL_IP>:31000
pod에 라벨 추가
현재 모놀리식 서비스에 엔드포인트가 없는 경우, 이 문제를 해결하는 방법 중 하나는 라벨 쿼리와 함께 kubectl get pods
명령어를 사용하는 것입니다
1단계
모놀리식 라벨이 지정되어 실행되는 여러 개의 pod가 있는지 확인합니다.
kubectl get pods -l "app=monolith"
2단계
app=monolith
와 secure=enabled
라벨이 있나요?
kubectl get pods -l "app=monolith,secure=enabled"
3단계
kubectl label
명령어를 사용하여 secure-monolith
pod에 누락된 secure=enabled
라벨을 추가합니다.
kubectl label pods secure-monolith 'secure=enabled'
내 진행 상황 확인하기를 클릭하여 목표를 확인합니다.
4단계
라벨이 업데이트됐는지 확인합니다.
kubectl get pods secure-monolith --show-labels
5단계
monolith
서비스에서 엔드포인트 목록을 봅니다.
kubectl get endpoints monolith
6단계
노드 하나로 다시 테스트해 봅니다.
gcloud compute instances list | grep gke-
브라우저에서 다음 URL을 엽니다. secure-monolith
가 자체 서명 인증서를 사용 중이므로 SSL 경고를 클릭해 확인해 주어야 합니다.
https://<EXTERNAL_IP>:31000
실습 종료하기
실습을 완료하면 실습 종료를 클릭합니다. Google Cloud Skills Boost에서 사용된 리소스를 자동으로 삭제하고 계정을 지웁니다.
실습 경험을 평가할 수 있습니다. 해당하는 별표 수를 선택하고 의견을 입력한 후 제출을 클릭합니다.
별점의 의미는 다음과 같습니다.
- 별표 1개 = 매우 불만족
- 별표 2개 = 불만족
- 별표 3개 = 중간
- 별표 4개 = 만족
- 별표 5개 = 매우 만족
의견을 제공하고 싶지 않다면 대화상자를 닫으면 됩니다.
의견이나 제안 또는 수정할 사항이 있다면 지원 탭을 사용하세요.
Copyright 2020 Google LLC All rights reserved. Google 및 Google 로고는 Google LLC의 상표입니다. 기타 모든 회사명 및 제품명은 해당 업체의 상표일 수 있습니다.