체크포인트
Create a Kubernetes cluster and launch Nginx container
/ 25
Create Monolith pods and service
/ 25
Allow traffic to the monolith service on the exposed nodeport
/ 5
Adding Labels to Pods
/ 20
Creating Deployments (Auth, Hello and Frontend)
/ 25
Kubernetes를 사용한 Cloud 조정
GSP021
개요
Kubernetes는 kubernetes.io에서 제공되는 오픈소스 프로젝트이며 노트북에서 고가용성 다중 노드 클러스터, 퍼블릭 클라우드에서 온프레미스 배포, 가상 머신에서 베어 메탈에 이르기까지 다양한 환경에서 실행할 수 있습니다.
이 실습에서는 Kubernetes Engine과 같은 관리형 환경을 사용하여 사용자가 기본 인프라를 설정하기보다는 Kubernetes를 경험하는 데 더 집중할 수 있습니다. Kubernetes Engine은 컨테이너화된 애플리케이션 배포를 위한 관리형 환경으로서 개발자 생산성, 리소스 효율성, 자동화된 작업, 오픈소스 유연성을 혁신하여 TTM(time to market)을 단축합니다.
목표
이 실습에서는 다음 작업을 수행하는 방법을 알아봅니다.
- Kubernetes Engine을 사용하여 완전한 Kubernetes 클러스터 프로비저닝
-
kubectl
을 사용하여 Docker 컨테이너 배포 및 관리 - Kubernetes의 배포 및 서비스를 사용하여 애플리케이션을 마이크로서비스로 분할
설정 및 요건
실습 시작 버튼을 클릭하기 전에
다음 안내를 확인하세요. 실습에는 시간 제한이 있으며 일시중지할 수 없습니다. 실습 시작을 클릭하면 타이머가 시작됩니다. 이 타이머에는 Google Cloud 리소스를 사용할 수 있는 시간이 얼마나 남았는지 표시됩니다.
실무형 실습을 통해 시뮬레이션이나 데모 환경이 아닌 실제 클라우드 환경에서 직접 실습 활동을 진행할 수 있습니다. 실습 시간 동안 Google Cloud에 로그인하고 액세스하는 데 사용할 수 있는 새로운 임시 사용자 인증 정보가 제공됩니다.
이 실습을 완료하려면 다음을 준비해야 합니다.
- 표준 인터넷 브라우저 액세스 권한(Chrome 브라우저 권장)
- 실습을 완료하기에 충분한 시간---실습을 시작하고 나면 일시중지할 수 없습니다.
실습을 시작하고 Google Cloud 콘솔에 로그인하는 방법
-
실습 시작 버튼을 클릭합니다. 실습 비용을 결제해야 하는 경우 결제 수단을 선택할 수 있는 팝업이 열립니다. 왼쪽에는 다음과 같은 항목이 포함된 실습 세부정보 패널이 있습니다.
- Google Cloud 콘솔 열기 버튼
- 남은 시간
- 이 실습에 사용해야 하는 임시 사용자 인증 정보
- 필요한 경우 실습 진행을 위한 기타 정보
-
Google Cloud 콘솔 열기를 클릭합니다(Chrome 브라우저를 실행 중인 경우 마우스 오른쪽 버튼으로 클릭하고 시크릿 창에서 링크 열기를 선택합니다).
실습에서 리소스가 가동되면 다른 탭이 열리고 로그인 페이지가 표시됩니다.
팁: 두 개의 탭을 각각 별도의 창으로 나란히 정렬하세요.
참고: 계정 선택 대화상자가 표시되면 다른 계정 사용을 클릭합니다. -
필요한 경우 아래의 사용자 이름을 복사하여 로그인 대화상자에 붙여넣습니다.
{{{user_0.username | "Username"}}} 실습 세부정보 패널에서도 사용자 이름을 확인할 수 있습니다.
-
다음을 클릭합니다.
-
아래의 비밀번호를 복사하여 시작하기 대화상자에 붙여넣습니다.
{{{user_0.password | "Password"}}} 실습 세부정보 패널에서도 비밀번호를 확인할 수 있습니다.
-
다음을 클릭합니다.
중요: 실습에서 제공하는 사용자 인증 정보를 사용해야 합니다. Google Cloud 계정 사용자 인증 정보를 사용하지 마세요. 참고: 이 실습에 자신의 Google Cloud 계정을 사용하면 추가 요금이 발생할 수 있습니다. -
이후에 표시되는 페이지를 클릭하여 넘깁니다.
- 이용약관에 동의합니다.
- 임시 계정이므로 복구 옵션이나 2단계 인증을 추가하지 않습니다.
- 무료 체험판을 신청하지 않습니다.
잠시 후 Google Cloud 콘솔이 이 탭에서 열립니다.
Cloud Shell 활성화
Cloud Shell은 다양한 개발 도구가 탑재된 가상 머신으로, 5GB의 영구 홈 디렉터리를 제공하며 Google Cloud에서 실행됩니다. Cloud Shell을 사용하면 명령줄을 통해 Google Cloud 리소스에 액세스할 수 있습니다.
- Google Cloud 콘솔 상단에서 Cloud Shell 활성화 를 클릭합니다.
연결되면 사용자 인증이 이미 처리된 것이며 프로젝트가 PROJECT_ID로 설정됩니다. 출력에 이 세션의 PROJECT_ID를 선언하는 줄이 포함됩니다.
gcloud
는 Google Cloud의 명령줄 도구입니다. Cloud Shell에 사전 설치되어 있으며 명령줄 자동 완성을 지원합니다.
- (선택사항) 다음 명령어를 사용하여 활성 계정 이름 목록을 표시할 수 있습니다.
-
승인을 클릭합니다.
-
다음과 비슷한 결과가 출력됩니다.
출력:
- (선택사항) 다음 명령어를 사용하여 프로젝트 ID 목록을 표시할 수 있습니다.
출력:
출력 예시:
gcloud
전체 문서는 Google Cloud에서 gcloud CLI 개요 가이드를 참조하세요.
Google Kubernetes Engine
- Cloud Shell 환경에서 다음 명령어를 입력하여 영역을 설정합니다.
- 이 실습에서 사용할 클러스터를 시작합니다.
gcloud container clusters get-credentials io
명령어를 실행하여 다시 인증하세요.
작업 1. 샘플 코드 가져오기
- Cloud Shell 명령줄에서 소스 코드를 복사합니다.
- 이 실습의 디렉터리로 변경합니다.
- 파일 목록을 나열하여 작업 중인 파일을 확인합니다.
샘플의 레이아웃은 다음과 같습니다.
코드를 가져왔으므로 이제 Kubernetes를 사용해 보겠습니다.
작업 2. 간략한 Kubernetes 데모
Kubernetes를 시작하는 가장 쉬운 방법은 kubectl create
명령어를 사용하는 것입니다.
- 이 명령어를 사용하여 nginx 컨테이너의 단일 인스턴스를 실행합니다.
Kubernetes가 배포를 생성했습니다. 배포에 관해서는 나중에 다시 살펴보겠습니다. 지금은 배포가 포드를 실행하는 기반이 되며, 이로 인해 포드를 실행하는 노드에 오류가 발생하더라도 포드가 계속 실행된다는 것만 알아두면 됩니다.
Kubernetes에서는 모든 컨테이너가 포드에서 실행됩니다.
-
kubectl get pods
명령어를 사용하여 실행 중인 nginx 컨테이너를 확인합니다.
- nginx 컨테이너가 실행 중 상태가 되면
kubectl expose
명령어를 사용하여 Kubernetes 외부로 노출할 수 있습니다.
방금 무슨 일이 일어났을까요? Kubernetes가 백그라운드에서 공개 IP 주소가 연결된 외부 부하 분산기를 만들었습니다. 이 공개 IP 주소에 접속하는 모든 클라이언트는 서비스 뒤에 있는 포드로 라우팅됩니다. 이 경우에는 nginx 포드로 라우팅됩니다.
- 이제
kubectl get services
명령어를 사용하여 서비스 목록을 나열합니다.
ExternalIP
필드 값이 채워지는 데 몇 초 정도 걸릴 수 있습니다. 이는 정상적인 현상입니다. 필드가 채워질 때까지 몇 초마다 kubectl get services
명령어를 다시 실행합니다.
- 원격으로 Nginx 컨테이너에 접속하려면 이 명령어에 외부 IP를 추가합니다.
이제 됐습니다. Kubernetes는 kubectl
run 및 expose 명령어로 바로 사용할 수 있는 간편한 워크플로를 지원합니다.
완료된 작업 테스트하기
아래의 내 진행 상황 확인하기를 클릭하여 실습 진행 상황을 확인하세요. Kubernetes 클러스터가 생성되고 Nginx 컨테이너가 배포되면 평가 점수가 표시됩니다.
Kubernetes를 간단하게 둘러보았으니 각 구성요소와 추상화에 대해 자세히 알아보겠습니다.
작업 3. 포드
Kubernetes의 핵심에는 포드가 있습니다.
포드는 하나 또는 여러 컨테이너의 모음을 포함하고 대표합니다. 일반적으로 상호 종속성이 강한 컨테이너가 여러 개 있을 때 이를 단일 포드로 패키징합니다.
이 예시에는 모놀리식 및 nginx 컨테이너가 포함된 포드를 사용합니다.
포드에는 볼륨도 포함되어 있습니다. 볼륨은 포드가 존재하는 한 계속해서 존재하는 데이터 디스크이며 해당 포드에 포함된 컨테이너에서 사용할 수 있습니다. 포드는 포함된 컨테이너에 공유 네임스페이스를 제공합니다. 즉, 이 예시에서 포드에 포함된 2개의 컨테이너는 서로 통신할 수 있으며 연결된 볼륨도 공유합니다.
또한 포드는 네트워크 네임스페이스도 공유합니다. 즉, 포드 하나에 IP 주소가 하나씩 배정됩니다.
다음으로 포드에 관해 더 자세히 살펴보겠습니다.
작업 4. 포드 만들기
포드 구성 파일을 사용하여 포드를 생성할 수 있습니다. 잠시 시간을 내어 모놀리식 포드 구성 파일을 살펴보세요.
- 디렉터리로 이동합니다.
- 다음을 실행합니다.
공개 구성 파일의 내용이 출력됩니다.
여기서 몇 가지 주목할 점이 있습니다. 다음을 확인하세요.
- 포드는 1개의 컨테이너(모놀리식)로 구성되어 있습니다.
- 시작할 때 컨테이너로 몇 가지 인수가 전달됩니다.
- HTTP 트래픽용으로 포트 80이 열립니다.
-
kubectl
을 사용하여 모놀리식 포드를 만듭니다.
- 포드를 살펴봅니다.
kubectl get pods
명령어를 사용하여 기본 네임스페이스에서 실행 중인 모든 포드의 목록을 표시합니다.
- 모놀리식 포드가 실행되면
kubectl describe
명령어를 사용하여 이에 대해 자세히 알아봅니다.
포드 IP 주소, 이벤트 로그 등 모놀리식 포드에 관한 여러 가지 정보가 표시됩니다. 이 정보는 문제 해결 시 유용하게 사용됩니다.
Kubernetes를 사용하면 구성 파일에 관련 설정을 기술하여 간편하게 포드를 만들 수 있으며, 포드가 실행 중일 때 관련 정보를 쉽게 확인할 수 있습니다. 지금까지 배포에 필요한 포드를 만드는 방법을 배웠습니다.
작업 5. 포드와 상호작용
포드에는 기본적으로 비공개 IP 주소가 부여되며 클러스터 밖에서는 포드에 접근할 수 없습니다. kubectl port-forward
명령어를 사용하여 로컬 포트를 모놀리식 포드 안의 포트로 매핑합니다.
-
두 번째 Cloud Shell 터미널을 엽니다. 이제 터미널을 두 개 사용합니다. 하나에서는
kubectl port-forward
명령어를 실행하고 다른 하나에서는curl
명령어를 실행합니다. -
두 번째 터미널에서 다음 명령어를 사용하여 포트 전달을 설정합니다.
-
첫 번째 터미널에서
curl
을 사용하여 포드와 통신을 시작합니다.
성공입니다. 컨테이너가 친절하게도 'hello'라고 인사를 건넵니다.
- 이제
curl
명령어를 사용하여 보안이 설정된 엔드포인트에 접속하면 어떻게 되는지 살펴보겠습니다.
문제가 발생했습니다.
- 로그인하여 모놀리식에서 다시 인증 토큰을 받으세요.
- 로그인 프롬프트에서 비밀번호인
password
를 사용하여 로그인합니다.
로그인하여 JWT 토큰이 출력되었습니다.
- Cloud Shell은 긴 문자열을 제대로 복사하지 못하니 토큰을 저장할 환경 변수를 만듭니다.
-
호스트 비밀번호를 묻는 메시지가 나타나면 비밀번호
password
를 다시 입력합니다. -
다음 명령어를 사용하여 토큰을 복사하고, 이 토큰으로
curl
을 사용하여 보안이 설정된 엔드포인트에 접속합니다.
이제 애플리케이션으로부터 모두 제대로 작동한다는 응답이 전송될 것입니다.
-
kubectl logs
명령어를 사용하여monolith
포드의 로그를 확인합니다.
-
세 번째 터미널을 열고
-f
플래그를 사용하여 실시간 로그 스트림을 가져옵니다.
-
첫 번째 터미널에서
curl
을 사용하여 모놀리식과 상호작용하면 세 번째 터미널에서 로그가 업데이트되는 것을 확인할 수 있습니다.
-
kubectl exec
명령어를 사용하여 모놀리식 포드 내에서 대화형 셸을 실행합니다. 이는 컨테이너 내부에서 문제를 해결할 때 유용합니다.
- 예를 들어 모놀리식 컨테이너 내부에서 셸을 사용하면
ping
명령어를 사용하여 외부 연결을 테스트할 수 있습니다.
- 대화형 셸 사용을 완료한 후에는 반드시 로그아웃합니다.
이와 같이 포드와의 상호작용은 kubectl
명령어를 사용하는 것만큼이나 쉽습니다. 원격으로 컨테이너에 접속해야 하거나 로그인 셸이 필요한 경우에도 Kubernetes가 작업에 필요한 모든 것을 제공합니다.
작업 6. 서비스
포드는 영구적으로 지속되지 않습니다. 활성 또는 준비 상태 검사의 실패 등 다양한 이유로 중지되거나 시작될 수 있으며, 이로 인해 문제가 발생합니다.
포드 집합과 통신해야 하는 경우 어떻게 해야 할까요? 포드가 다시 시작되면 IP 주소가 바뀔 수도 있습니다.
이와 같은 상황에서는 서비스가 유용합니다. 서비스는 포드에 접속할 수 있는 안정적인 엔드포인트를 제공합니다.
서비스는 라벨을 사용하여 어떤 포드와 연동될지를 결정합니다. 포드에 라벨이 정확히 지정되어 있다면 서비스가 이를 자동으로 감지하고 노출시킵니다.
서비스가 포드 집합에 대해 어떤 수준의 액세스를 제공하는지는 서비스 유형에 따라 다릅니다. 현재는 3가지 유형이 있습니다.
-
ClusterIP
(내부): 기본 유형이며 이 서비스는 클러스터 내부에서만 볼 수 있습니다. -
NodePort
: 클러스터의 각 노드에 외부에서 액세스 가능한 IP 주소를 제공합니다. -
LoadBalancer
: 클라우드 제공업체의 부하 분산기를 추가하며 서비스에서 유입되는 트래픽을 내부에 있는 노드로 전달합니다.
이제 다음 작업을 실행하는 방법을 배워보겠습니다.
- 서비스 만들기
- 라벨 선택기를 사용하여 제한된 포드 집합을 외부에 노출하기
작업 7. 서비스 만들기
서비스를 만들기 전에 먼저 HTTPS 트래픽을 처리할 수 있는 보안이 설정된 포드를 만듭니다.
- 이전에 디렉터리를 변경했다면
~/orchestrate-with-kubernetes/kubernetes
디렉터리로 다시 돌아갑니다.
- 모놀리식 서비스 구성 파일을 살펴봅니다.
- 보안이 설정된 모놀리식 포드와 구성 데이터를 만듭니다.
보안이 설정된 포드를 만들었으므로 이제 보안이 설정된 모놀리식 포드를 외부로 노출시킵니다. 이를 위해 Kubernetes 서비스를 만듭니다.
- 모놀리식 서비스 구성 파일을 살펴봅니다.
(출력):
* `app: monolith` 및 `secure: enabled` 라벨이 지정된 포드를 자동으로 찾고 노출시키는 선택기가 있습니다.
* 이제 포트 31000에서 포트 443의 nginx로 외부 트래픽을 전달하기 위해 NodePort를 노출시켜야 합니다.
-
kubectl create
명령어를 사용하여 모놀리식 서비스 구성 파일로 모놀리식 서비스를 만듭니다.
(출력):
완료된 작업 테스트하기
아래의 내 진행 상황 확인하기를 클릭하여 실습 진행 상황을 확인하세요. 모놀리식 포드 및 서비스를 성공적으로 생성한 경우 평가 점수가 표시됩니다.
서비스를 노출하기 위해서는 포트를 사용합니다. 즉, 다른 앱이 서버 중 하나의 포트 31000과 연결을 시도하면 포트 충돌이 발생할 수 있습니다.
일반적으로 포트 할당은 Kubernetes가 처리합니다. 이 실습에서는 포트를 선택했기 때문에 추후 더 쉽게 상태 점검을 설정할 수 있습니다.
-
gcloud compute firewall-rules
명령어를 사용하여 노출된 NodePort의 모놀리식 서비스에 대한 트래픽을 허용합니다.
완료된 작업 테스트하기
아래의 내 진행 상황 확인하기를 클릭하여 실습 진행 상황을 확인하세요. 31000 포트에서 TCP 트래픽을 허용하는 방화벽 규칙을 성공적으로 만든 경우 평가 점수가 표시됩니다.
이제 설정이 모두 완료되었으니 포트 전달을 사용하지 않아도 클러스터 외부에서 보안이 설정된 모놀리식 서비스에 접속할 수 있습니다.
- 먼저 노드 1개의 외부 IP 주소를 가져옵니다.
- 이제
curl
을 사용하여 보안이 설정된 모놀리식 서비스에 접속해 봅니다.
문제가 발생했습니다. 시간 초과 오류입니다. 이유가 무엇일까요?
참고: 지금까지 배운 내용을 간단하게 확인해 보겠습니다.
다음 명령어를 사용하여 아래 질문에 답하세요.kubectl get services monolith
kubectl describe services monolith
질문:
힌트: 라벨에 관한 질문입니다. 다음 섹션에서 이 문제를 해결해 보겠습니다.
작업 8. 포드에 라벨 추가
현재 모놀리식 서비스에는 엔드포인트가 없습니다. 이 문제를 해결하는 방법 중 하나는 라벨 쿼리와 함께 kubectl get pods
명령어를 사용하는 것입니다
- 모놀리식 라벨이 지정된 상태로 실행되는 포드 몇 개가 있다는 사실을 확인할 수 있습니다.
- 그런데 'app=monolith'와 'secure=enabled' 라벨이 모두 지정된 포드는 몇 개나 있나요?
이 라벨 쿼리로는 결과가 출력되지 않습니다. 'secure=enabled' 라벨을 추가해야 할 것 같습니다.
-
kubectl label
명령어를 사용하여 보안이 설정된 모놀리식 포드에 누락된secure=enabled
라벨을 추가합니다. 그런 다음 라벨이 업데이트되었는지 확인합니다.
- 이제 포드에 정확한 라벨을 지정했으니 모놀리식 서비스의 엔드포인트 목록을 확인합니다.
엔드포인트가 하나 있습니다.
- 노드 중 하나에 접속하여 이 엔드포인트를 테스트합니다.
성공입니다. 접속이 되었습니다.
완료된 작업 테스트하기
아래의 내 진행 상황 확인하기를 클릭하여 실습 진행 상황을 확인하세요. 모놀리식 포드에 라벨을 성공적으로 추가한 경우 평가 점수가 표시됩니다.
작업 9. Kubernetes로 애플리케이션 배포
이 실습의 목표는 프로덕션 컨테이너를 확장하고 관리하는 법을 익히는 것입니다. 여기에는 배포가 유용합니다. 배포는 실행 중인 포드의 개수를 사용자가 지정한 포드 개수와 동일하게 만드는 선언적 방식입니다.
배포의 주요 이점은 포드 관리에 있어 낮은 수준의 세부정보를 추상화할 수 있다는 것입니다. 배포는 백그라운드에서 복제본 집합을 사용하여 포드의 시작 및 중지를 관리합니다. 포드를 업데이트하거나 확장해야 하는 경우 배포가 이를 처리합니다. 또한 어떤 이유로든 포드가 중지되었다면 이를 재시작하는 작업도 배포에서 처리합니다.
간단한 예시를 살펴보겠습니다.
포드는 생성 시에 기반이 된 노드의 수명과 연결되어 있습니다. 위 예시에서 Node3이 중단되면서 포드도 중단되었습니다. 사용자가 직접 새로운 포드를 만들고 이를 위한 노드를 찾을 필요가 없도록 배포가 새로운 포드를 만들고 Node2에서 이를 실행했습니다.
아주 편리한 방식입니다.
포드와 서비스에 관해 배운 모든 지식을 바탕으로, 이제 배포를 사용하여 모놀리식 애플리케이션을 작은 서비스로 분할해 보겠습니다.
작업 10. 배포 만들기
모놀리식 앱을 다음의 3가지 부분으로 나눕니다.
- 인증 - 인증된 사용자를 위한 JWT 토큰을 생성합니다.
- hello - 인증된 사용자에게 인사 메시지를 출력합니다.
- 프런트엔드 - 트래픽을 인증 및 hello 서비스로 라우팅합니다.
서비스당 하나씩 배포를 만들 준비가 되었습니다. 그런 다음 인증 및 hello 배포용 내부 서비스와 프런트엔드 배포용 외부 서비스를 정의하겠습니다. 이렇게 하면 모놀리식과 같은 방식으로 마이크로서비스와 상호작용하면서도 각 서비스를 독립적으로 확장하고 배포할 수 있습니다.
- 먼저 인증 배포 구성 파일을 살펴보겠습니다.
(출력)
배포가 복제본을 하나 만들며, 여기서는 인증 컨테이너 2.0.0 버전을 사용합니다.
kubectl create
명령어를 실행하여 인증 배포를 만들면 배포 매니페스트 데이터를 준수하는 포드 하나가 만들어집니다. 즉, '복제본' 필드의 숫자를 변경하여 포드 개수를 조정할 수 있습니다.
- 이제 배포 객체를 만듭니다.
- 또한 인증 배포용 서비스를 만듭니다.
kubectl create
명령어를 사용하여 인증 서비스를 만듭니다.
- hello 배포 만들기와 노출도 위와 동일하게 진행합니다.
- 한번 더 프런트엔드 배포를 만들고 노출합니다.
- 외부 IP를 가져온 다음 curl 명령어를 사용하여 프런트엔드와 상호작용합니다.
EXTERNAL-IP
열이 그러면 hello 응답을 받게 됩니다.
완료된 작업 테스트하기
아래의 내 진행 상황 확인하기를 클릭하여 실습 진행 상황을 확인하세요. 인증, Hello 및 프런트엔드 배포를 성공적으로 생성하면 평가 점수가 표시됩니다.
수고하셨습니다
수고하셨습니다. Kubernetes를 사용하여 다중 서비스 애플리케이션을 개발했습니다. 이 실습에서 배운 기술을 활용하면 Kubernetes에서 배포와 서비스 모음을 사용하여 복잡한 애플리케이션도 배포할 수 있습니다.
다음 단계/더 학습하기
- X 및 커뮤니티 블로그에서 Kubernetes 소식을 확인할 수 있습니다.
- Kubernetes는 GitHub에 호스팅된 오픈소스 프로젝트(http://kubernetes.io/)입니다. 여러분의 의견과 참여를 기다립니다.
Google Cloud 교육 및 자격증
Google Cloud 기술을 최대한 활용하는 데 도움이 됩니다. Google 강의에는 빠른 습득과 지속적인 학습을 지원하는 기술적인 지식과 권장사항이 포함되어 있습니다. 기초에서 고급까지 수준별 학습을 제공하며 바쁜 일정에 알맞은 주문형, 실시간, 가상 옵션이 포함되어 있습니다. 인증은 Google Cloud 기술에 대한 역량과 전문성을 검증하고 입증하는 데 도움이 됩니다.
설명서 최종 업데이트: 2024년 4월 29일
실습 최종 테스트: 2024년 4월 29일
Copyright 2024 Google LLC All rights reserved. Google 및 Google 로고는 Google LLC의 상표입니다. 기타 모든 회사명 및 제품명은 해당 업체의 상표일 수 있습니다.