Google Cloud Study Jam - Kubernetes 입문반 (Kubernetes를 통한 클라우드 조정)

ju_bro·2022년 8월 16일
0

Cloud Study

목록 보기
3/3
post-thumbnail

🌠 Kubernetes 란?

  • Kubernetes는 kubernetes.io에서 사용할 수 있는 오픈소스 프로젝트이며 노트북에서 고가용성 다중 노드 클러스터, 공용 클라우드에서 온프레미스 배포, 가상 머신에서 베어 메탈까지 다양한 환경에서 실행 가능합니다.

📌 핵심 : Kubernetes는 컨테이너를 쉽고 빠르게 배포/확장하고 관리를 자동화해주는 오픈소스 플랫폼입니다.


※ Kubernetes를 사용하는 이유 :

컨테이너화된 앱을 안정적으로 실행하기는 어려울 수 있는데, 여러 머신에 배포된 많은 컨테이너가 관련되기 때문입니다.

Kubernetes는 이 컨테이너를 예약하고 배포할 뿐만 아니라 원하는 상태로 크기 조정하고 수명 주기를 관리하는 방법을 제공합니다.

Kubernetes를 사용하여 서버의 확장성(scalability) 및 분야의 확장성(extensibility)이 있는 이식 가능한 방식으로 컨테이너 기반 애플리케이션을 구현할 수 있습니다.



🌠 개요

  • Kubernetes Engine을 사용하여 완전한 Kubernetes 클러스터를 프로비저닝합니다.

  • kubectl을 사용하여 Docker 컨테이너를 배포하고 관리합니다.

  • Kubernetes의 디플로이먼트 및 서비스를 사용하여 애플리케이션을 마이크로서비스로 분할합니다.


🌠 Google Kubernetes Engine을 사용한 클러스터 시작

Google Kubernetes Engine에 관한 자세한 내용은 아래 포스터를 참조해주세요❗

Google Cloud Study Jam - Kubernetes 입문반 (Kubernetes Engine: Qwik Start)


  • 다음 명령어를 실행하여 영역을 설정합니다.
gcloud config set compute/zone us-central1-b

  • 영역 설정 후 실습에 사용할 클러스터를 시작합니다.
gcloud container clusters create io

✔ 명령어 출력 결과



🌠 샘플 코드 가져오기

  • 다음 명령어를 통해 GitHub 저장소를 클론합니다.
gsutil cp -r gs://spls/gsp021/* .

  • 다음 명령어를 통해 실습에 필요한 디렉토리로 변경한 후 작업 중인 파일을 확인합니다.
cd orchestrate-with-kubernetes/kubernetes
ls

✔ 명령어 출력 결과



🌠 포드(Pod) 란?

  • 포드는 1개 이상의 컨테이너가 포함된 모음을 나타냅니다.

  • 일반적으로 상호 의존성이 높은 컨테이너가 여러 개 있으면 이를 하나의 포드에 패키징합니다.

※ ex )

위 예시에는 monolith 및 nginx 컨테이너가 포함된 포드(Pod)가 있습니다.

포드(Pod)에는 Volume 또한 포함되어 있습니다.

Volume : 포드(Pod)가 존재하는 한 계속해서 존재하는 데이터 디스크이며 포드(Pod)에 포함된 컨테이너에 의해 사용될 수 있다.

포드(Pod)는 콘텐츠에 공유된 네임스페이스를 제공합니다.

즉, 위 예시의 포드(Pod) 안에 있는 2개의 컨테이너는 서로 통신할 수 있으며 첨부된 볼륨도 공유합니다.

또한 포드(Pod)는 네트워크 네임스페이스도 공유합니다.

즉, 포드(Pod)는 IP 주소를 1개씩 갖고 있습니다.



🌠 간략한 Kubernetes 데모

  • Kubernetes를 시작하는 가장 쉬운 방법은 kubectl create 명령어를 사용하는 것입니다.

  • 다음 명령어를 통해 nginx 컨테이너의 단일 인스턴스를 실행합니다.
kubectl create deployment nginx --image=nginx:1.10.0

✔ 명령어 출력 결과

이로써 Kubernetes가 배포를 생성했습니다.

배포 덕분에 pod가 작동하고 있으며, pod가 실행하는 노드에 오류가 발생해도 계속해서 작동할 수 있습니다.


  • Kubernetes에서 모든 컨테이너는 포드에서 실행됩니다.

  • 다음 kubectl get pods 명령어를 사용하여 실행 중인 nginx 컨테이너를 확인합니다.
kubectl get pods

✔ 명령어 출력 결과


  • nginx 컨테이너가 실행되면 다음 kubectl expose 명령어를 사용하여 Kubernetes 외부로 노출시킵니다.
kubectl expose deployment nginx --port 80 --type LoadBalancer

✔ 명령어 출력 결과

이로써 Kubernetes가 백그라운드에서 공개 IP 주소가 첨부된 외부 부하 분산기를 만들었습니다.

이 공개 IP 주소를 조회하는 모든 클라이언트는 서비스 백그라운드에 있는 포드로 라우팅됩니다.

이 경우에는 nginx 포드로 라우팅됩니다.


  • 다음 kubectl get services 명령어를 사용하여 서비스를 나열합니다.
kubectl get services

✔ 명령어 출력 결과


  • 원격으로 Nginx 컨테이너를 조회하려면 다음 명령어에 외부 IP를 추가합니다.
curl http://<External IP>:80

✔ 원격 조회 결과


📌 핵심 : Kubernetes는 kubectl 실행 및 노출 명령어로 바로 사용할 수 있는 간편한 워크플로를 지원합니다.



🌠 포드(Pod) 만들기

  • 포드(Pod)는 포드 구성 파일을 사용하여 만들 수 있습니다.

  • 다음 명령어를 실행하여 monolith 포드 구성 파일을 살펴봅니다.
cat pods/monolith.yaml

✔ 명령어 출력 결과

열린 구성 파일이 출력됩니다.

📌 핵심 내용 :

  1. 포드(pod)가 1개의 컨테이너(monolith)로 구성되어 있습니다.
  1. 시작할 때 컨테이너로 몇 가지 인수가 전달됩니다.
  1. HTTP 트래픽용 port 80이 개방됩니다.

  • 다음 kubectl 명령어를 사용하여 monolith 포드를 만듭니다.
kubectl create -f pods/monolith.yaml

✔ 명령어 출력 결과


  • 다음 kubectl get pods 명령어를 사용하여 기본 네임스페이스에서 실행 중인 모든 포드(pod)를 나열합니다.
kubectl get pods

✔ 명령어 출력 결과


  • 포드(pod)가 실행되면 다음 kubectl describe 명령어를 사용하여 monolith 포드에 관해 자세히 알아봅니다.
kubectl describe pods monolith

✔ 명령어 출력 결과

포드 IP 주소 및 이벤트 로그를 포함한 monolith 포드에 관한 여러 정보가 표시됩니다.

이 정보는 문제해결 시 유용하게 사용됩니다.


📌 핵심 : Kubernetes를 사용하면 포드 구성 파일에서 포드(pod)에 관해 기술하여 간편하게 포드(pod)를 만들 수 있으며, 포드(pod)가 실행 중일 때 정보를 쉽게 확인할 수 있습니다.



🌠 포드(pod)와 상호작용하기

※ 포드(pod)에는 기본적으로 비공개 IP 주소가 부여되며 클러스터 밖에서는 접근할 수 없습니다.


  • 이를 해결하기 위해 아래와 같은 과정을 거칩니다.

1. 두 번째 터미널에서 다음 kubectl port-forward 명령어를 사용하여 로컬 포트를 monolith 포드 안의 포트로 매핑합니다.
- 포드(pod) 전달 설정

kubectl port-forward monolith 10080:80

2. 첫 번째 터미널에서 curl을 사용하여 pod와 통신을 시작합니다.

curl http://127.0.0.1:10080

✔ 통신 결과


3. 다음 curl 명령어를 사용하여 보안이 설정된 엔드포인트를 조회해봅니다.

curl http://127.0.0.1:10080/secure

✔ 조회 결과

문제가 발생했습니다.


4. monolith에서 다시 인증 토큰을 얻기 위해 다음 명령어를 사용하여 로그인을 시도합니다.

curl -u user http://127.0.0.1:10080/login

로그인 메시지에서 일급 비밀번호인 'password'를 사용하여 로그인합니다.

✔ 로그인 결과

로그인하여 JWT 토큰이 출력되었습니다.


5. Cloud Shell은 긴 문자열을 제대로 복사하지 못하니 다음 명령어를 통해 토큰을 위한 환경 변수를 만듭니다.

TOKEN=$(curl http://127.0.0.1:10080/login -u user|jq -r '.token')

6. 다음 명령어를 사용하여 토큰을 복사하고, 이 토큰으로 curl을 사용하여 보안이 설정된 엔드포인트를 조회합니다.

curl -H "Authorization: Bearer $TOKEN" http://127.0.0.1:10080/secure

✔ 조회 결과

애플리케이션으로부터 모두 제대로 작동한다는 응답을 전송받았습니다.


7. 다음 kubectl logs 명령어를 사용하여 monolith 포드의 로그를 확인합니다.

kubectl logs monolith

✔ 명령어 출력 결과


8. 세 번째 터미널을 열고 -f 플래그를 사용하여 실시간 로그 스트림을 가져옵니다.

kubectl logs -f monolith

✔ 명령어 출력 결과


9. 첫 번째 터미널에서 다음 curl을 사용하여 monolith pod와 상호작용합니다.

curl http://127.0.0.1:10080

✔ 세 번째 터미널 실시간 로그 스트림 결과

세 번째 터미널에서 로그가 업데이트되는 것을 확인할 수 있습니다.


번외. 대화형 셸

  • 다음 kubectl exec 명령어를 사용하여 monolith 포드의 대화형 셸을 실행합니다.
kubectl exec monolith --stdin --tty -c monolith /bin/sh

📌 이는 컨테이너 내부에서 문제를 해결할 때 유용합니다.

예를 들어 monolith 컨테이너에 셸이 있으면 ping 명령어를 사용하여 외부 연결을 테스트할 수 있습니다.

ping -c 3 google.com

✔ 명령어 출력 결과

대화형 셸 사용을 완료한 후에는 exit 명령어를 사용해 반드시 로그아웃합니다.


  • 이와 같이 포드와의 상호작용은 kubectl 명령을 사용하는 것만큼 쉽습니다.

  • 원격으로 컨테이너를 조회하거나 로그인 셸이 필요한 경우 Kubernetes가 작업에 필요한 모든 것을 제공합니다.


🌠 서비스(service)

서비스는 Kubernetes 외부 또는 내부에서 Pod에 접근할 때 사용하는 기능입니다.

서비스를 사용하는 이유는 포드(pod)가 서버와 달리 영구적으로 지속되지 않기 때문입니다.

포드(pod)는 활성 여부 또는 준비 상태 검사 오류와 같은 다양한 이유로 중지되거나 시작될 수 있습니다.

서버의 경우 문제가 생기면 서버를 재시작하지만 포드(pod)는 문제가 생기면 문제가 생긴 포드(pod)를 삭제한 뒤 새로운 포드(pod)를 생성하기 때문에 포드(pod)가 다시 시작되면 IP 주소가 바뀔 수도 있습니다.

서비스는 포드(pod)를 위해 안정적인 엔드포인트를 제공함으로써 이러한 문제를 해결해 줍니다.


  • 서비스는 라벨을 사용하여 어떤 포드에서 작동할지 결정합니다.

  • 포드에 라벨이 정확히 지정되어 있다면 서비스가 이를 자동으로 감지하고 노출시킵니다.


  • 서비스가 제공하는 포드 집합에 대한 액세스 수준은 서비스 유형에 따라 다릅니다. 현재 3가지 유형이 있습니다.

ClusterIP(내부) : 기본 유형이며 이 서비스는 클러스터 안에서만 볼 수 있습니다.

NodePort : 클러스터의 각 노드에 외부에서 액세스 가능한 IP 주소를 제공합니다.

LoadBalancer : 클라우드 제공업체로부터 부하 분산기를 추가하며 서비스에서 유입되는 트래픽을 내부에 있는 노드로 전달합니다.



🌠 서비스(service) 만들기

  • 다음 명령어를 통해 https 트래픽을 처리할 수 있는 보안이 설정된 monolith 포드(pod)와 구성 데이터를 만듭니다.
kubectl create secret generic tls-certs --from-file tls/
kubectl create configmap nginx-proxy-conf --from-file nginx/proxy.conf
kubectl create -f pods/secure-monolith.yaml

  • 다음 명령어를 통해 monolith 서비스 구성 파일을 살펴봅니다.
cat services/monolith.yaml

✔ 명령어 출력 결과

  1. app: monolith 및 secure: enabled 라벨이 지정된 포드를 자동으로 찾고 노출시키는 선택기가 있습니다.

  2. 외부 트래픽을 포트 31000에서 포트 443의 nginx로 전달하기 위해 NodePort를 노출시켜야 합니다.

  • 다음 kubectl create 명령어를 사용하여 monolith 서비스 구성 파일에서 monolith 서비스를 만듭니다.
kubectl create -f services/monolith.yaml

✔ 명령어 출력 결과


  • gcloud compute firewall-rules 명령어를 사용하여 트래픽을 노출된 NodePort의 monolith 서비스로 보냅니다.
gcloud compute firewall-rules create allow-monolith-nodeport \
  --allow=tcp:31000

✔ 명령어 출력 결과



🌠 포드(pod)에 라벨 추가하기

  • 현재 monolith 서비스에는 엔드포인트가 없습니다.

  • 이와 같은 문제를 해결하는 방법 중 하나는 다음과 같이 라벨 쿼리와 함께 kubectl get pods 명령어를 사용하는 것입니다.
kubectl get pods -l "app=monolith"

✔ 명령어 출력 결과

monolith 라벨이 지정되어 실행되는 포드(pod)가 몇 개 있다는 사실을 확인할 수 있습니다.


  • 다음 kubectl label 명령어를 사용하여 보안이 설정된 모놀리식 포드에 누락된 secure=enabled 라벨을 추가합니다.
    그런 다음 라벨이 업데이트되었는지 확인합니다.
kubectl label pods secure-monolith 'secure=enabled'
kubectl get pods secure-monolith --show-labels

✔ 명령어 출력 결과


  • 이제 포드에 정확한 라벨을 지정했으니 다음 명령어를 통해 monolith 서비스의 엔드포인트 목록을 확인합니다.
kubectl describe services monolith | grep Endpoints

✔ 명령어 출력 결과

엔드포인트가 하나 있는 것을 확인할 수 있습니다.


  • 다음 명령어를 통해 노드 중 하나를 조회하여 이 엔드포인트를 테스트해 봅니다.
gcloud compute instances list
curl -k https://<EXTERNAL_IP>:31000

✔ 명령어 출력 결과



🌠 Kubernetes로 애플리케이션 배포하기 (Deployments)

1. Deployments 란?

Deployment는 실행 중인 포드의 개수가 사용자가 명시한 포드 개수와 동일하게 만드는 선언적 방식입니다.

또한 Deployment는 어떤 이유로든 포드(pod)가 중지되면 재시작을 담당하여 처리합니다.


2. Deployments 만들기

먼저 monolith 앱을 다음의 3가지 부분으로 나눕니다.

  • auth - 인증된 사용자를 위한 JWT 토큰을 생성합니다.
  • hello - 인증된 사용자를 안내합니다.
  • frontend - 트래픽을 auth 및 hello 서비스로 전달합니다.

이후 monolith와 같은 방식으로 마이크로서비스와 상호작용하고, 각 서비스를 독립적으로 확장 및 배포하기 위해 auth 및 hello Deployment용 내부 서비스와 frontend Deployment용 외부 서비스를 정의합니다.


  • 다음 명령어를 통해 auth 디플로이먼트 구성 파일을 검토합니다.
cat deployments/auth.yaml

✔ 명령어 출력 결과

Deployment가 복제본 1개를 만들며, 여기서는 auth 컨테이너 2.0.0 버전을 사용합니다.


  • 다음 kubectl create 명령어를 실행하여 auth Deployment 개체를 만듭니다.
kubectl create -f deployments/auth.yaml

✔ 명령어 출력 결과

이로써 Deployment 매니페스트 데이터를 준수하는 포드가 만들어집니다.
즉, 복제본 필드에 명시된 숫자를 변경하여 포드 숫자를 조정할 수 있습니다.


  • 다음 kubectl create 명령어를 실행하여 auth Deployment용 서비스를 만듭니다.
kubectl create -f services/auth.yaml

✔ 명령어 출력 결과


  • hello Deployment와 서비스도 위와 동일하게 진행합니다.
kubectl create -f deployments/hello.yaml
kubectl create -f services/hello.yaml

✔ 명령어 출력 결과


  • frontend Deployment와 서비스도 위와 동일하게 진행합니다.
kubectl create configmap nginx-frontend-conf --from-file=nginx/frontend.conf
kubectl create -f deployments/frontend.yaml
kubectl create -f services/frontend.yaml

(frontend를 만들기 위해 컨테이너에 구성 데이터를 보관해야 하기 때문에 추가 단계를 진행합니다.)

✔ 명령어 출력 결과


  • 다음 명령어를 사용하여 외부 IP 주소를 확보하고 frontend와 상호작용합니다.
kubectl get services frontend
curl -k https://<EXTERNAL-IP>

✔ 명령어 출력 결과

정상적으로 hello 응답을 받는 것을 확인할 수 있습니다.



🌠 정리

  • Kubernetes를 사용하여 다중 서비스 애플리케이션을 개발

  • Kubernetes에서 Deployment 및 서비스 컬렉션을 사용하여 애플리케이션을 배포

🎉 평가 완료 인증 🎉



이 글은 "Google Cloud Study Jam"의 [Kubernetes 입문반] 강좌 실습 후 개인적으로 학습하기 위해 정리한 글입니다. 🙂

https://www.cloudskillsboost.google/quests/29

profile
Inha University

0개의 댓글