본문 바로가기
Cloud/구글 스터디 잼 | K8s

[StudyJam][#3] Kubernetes로 클라우드 Orchestrating 하기

by HelloJudy 2022. 7. 21.
본 포스팅은 구글 스터디 잼에 참가하여 유료 플랫폼인 '퀵랩'을 무료로 제공받아 학습한 내용을 정리한 글입니다.

 

📚 오늘 공부할 내용

  • Kubernetes Engine을 사용하여 완전한 Kubernetes 클러스터를 프로비저닝
  • kubectl을 사용하여 Docker 컨테이너를 배포하고 관리
  • Kubernetes의 디플로이먼트 및 서비스를 사용하여 애플리케이션을 마이크로서비스로 분할

 


✔️ 프로젝트 설정

$ gcloud config set project $PROJECT_ID

 

✔️ 컴퓨팅 리전 설정: 리전 내에 대략적으로 클러스터와 리소스가 존재하는 위치

$ gcloud config set compute/zone us-central1-b

 

한국 리전을 사용할 때는 다음 리전을 사용할 수 있다.

 

compute/zone asia-southeast1-c

 

 

실습에 사용할 클러스터를 시작하자!

 

$ gcloud container clusters create io

 

 

1. 샘플 코드 가져오기

 

GitHub 저장소를 클론해온다.

 

$ gsutil cp -r gs://spls/gsp021/* .

 

여기서 gsutil Google Cloud CLI의 일부로 명령줄에서 Cloud Storage에 액세스 하는 데 사용할 수 있는 Python 애플리케이션이다. gsutil로 다음과 같은 광범위한 버킷 및 객체 관리 작업을 수행할 수 있다.

 

📎gsutil공식문서

 

클론 해온 폴더로 이동한다.

 

$ cd orchestrate-with-kubernetes/kubernetes

 

  • 샘플 코드의 레이아웃
deployments/  /* 디플로이먼트 매니페스트  */
  ...
nginx/        /* nginx 구성 파일 */
  ...
pods/         /* 포드 매니페스트 */
  ...
services/     /* 서비스 매니페스트 */
  ...
tls/          /* TLS 인증서 */
  ...
cleanup.sh    /* 정리 스크립트 */

 

 

2. Kubernetes 데모

 

  • nginx 컨테이너의 단일 인스턴스를 실행
$ kubectl create deployment nginx --image=nginx:1.10.0

 

kubectl create 명령어로 배포를 생성했고 Pod가 작동하고 있다.

 

쿠버네티스(Kubernetes)에서는 모든 컨테이너가 클러스터 내 Pod라는 API 최소 단위를 통해서 동작시킨다.

또한, Pod에는 하나 또는 여러 개의 컨테이너가 포함될 수 있다.

 

출처='유튜브 TTABAE-LEARN 채널의 따베쿠 강의'

 

 

  • 실행 중인 컨테이너 확인
$ kubectl get pods

 

명령어를 확인하면 앞에서 배포한 nginx 컨테이너를 확인할 수 있다.

 

 

  • 외부로 노출
$ kubectl expose deployment nginx --port 80 --type LoadBalancer

 

해당 명령어를 통해 외부 환경으로 배포할 수 있다.

Kubernetes가 백그라운드에 External Ip를 할당하여 해당 ip로 조회하는 모든 클라이언트는 서비스 백그라운드에 있는 포드로 라우팅 된다.

 

 

  • 배포한 서비스 확인
$ kubectl get services

 

 

  • 원격으로 Nginx 컨테이너를 조회
$ curl http://<External IP>:80

 

 

3. Pod

앞서 설명했듯이  Pod에는 하나 또는 여러 개의 컨테이너가 포함될 수 있다.

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

 

또한 Pod에는 서로 통신할 수 있으며 Pod 내의 볼륨도 공유한다.

즉, Pod는 IP 주소를 1개씩 갖고 있다.

 


 

포드 구성 파일로 포드를 생성해보자.

 

$ cat pods/monolith.yaml

 

 

 

[ pods/monolith.yaml 설명 ]

  • 포드가 1개의 컨테이너(모놀리식)로 구성되어 있다.
  • 시작할 때 컨테이너로 몇 가지 인수가 전달된다.
  • HTTP 트래픽용 포드 80이 개방된다.

 

이제 kubectl을 사용하여 모놀리식 포드를 만들자.

kubectl create -f pods/monolith.yaml

 

 

기본 네임스페이스에서 실행 중인 모든 포드를 확인해보자.

kubectl get pods

 

 

위에서 생성한 nginx 포드와 모놀리식 포드가 작동하고 있다.

 

근데 잠깐..! monolith가 뭘까?

 

kubectl describe 명령어로 모놀리식 포드에 대해서 알 수 있다.

kubectl describe pods monolith

 

포드 IP 주소 및 이벤트 로그를 포함한 모놀리식 포드에 관한 여러 정보가 표시된다. 이 정보는 문제해결 시 유용하게 사용된다.

Kubernetes를 사용하면 구성 파일에 포드에 관해 설명하여 간편하게 포드를 만들 수 있으며, 포드가 실행 중일 때 정보를 쉽게 확인할 수 있다. 이제 디플로이먼트에 필요한 모든 포드를 만들 수 있다.

 

 

 

4. 포드와 상호작용하기

 

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

kubectl port-forward 명령어를 사용하여 로컬 포트를 모놀리식 포드 안의 포트로 매핑한다.

 

Cloud Shell 터미널 2개를 연다.

 

두 번째 터미널: 포드 전달을 설정

kubectl port-forward monolith 10080:80

첫 번째 터미널: curl을 사용하여 pod와 통신을 시작

curl http://127.0.0.1:10080

 

다음과 같이 메세지가 나오고 성공한 것을 알 수 있다.

 

 

[ 보안이 설정된 엔드포인트 ]

 

curl http://127.0.0.1:10080/secure

 

 

1. 인증 토큰을 얻기 (로그인)

 

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

 

 

 

2. 토큰을 복사, curl을 사용하여 보안이 설정된 엔드포인트를 조회

 

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

 

  • 로그 확인
kubectl logs monolith

 

 

3. -f 플래그를 사용하여 실시간 로그 스트림

 

kubectl logs -f monolith

 

 

 

컨테이너 내부에서 문제를 해결할 때 kubectl exec 명령어를 사용하여 모놀리식 포드의 대화형 셸을 실행한다.

kubectl exec monolith --stdin --tty -c monolith /bin/sh

 

(이 방식은 Docker에서 exec 명령어로 컨테이너에 접근하여 명령어를 사용하는 방법과 같다.)

 

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

ping -c 3 google.com

 

대화형 셸 사용을 완료한 후에는 반드시 로그아웃한다.

exit

 

 

 

5. 서비스

포드는 영구적으로 지속되지 않는다.

포드가 다시 시작되면 IP 주소가 바뀔 수도 있다. 그래서 이러한 상황에서 서비스가 유용하다.

 

  • 서비스 
    • 파드 집합에서 실행중인 애플리케이션을 네트워크 서비스로 노출하는 추상화 방법이다.
    • 파드를 위해 안정적인 엔드포인트를 제공한다.

[ 포드 집합에 대한 액세스 수준 ]

  • ClusterIP(내부) -- 기본 유형이며 이 서비스는 클러스터 안에서만 볼 수 있다.
  • NodePort 클러스터의 각 노드에 외부에서 액세스 가능한 IP 주소를 제공.
  • LoadBalancer는 클라우드 제공업체로부터 부하 분산기를 추가하며 서비스에서 유입되는 트래픽을 내부에 있는 노드로 전달.

 

 

 

6. 서비스 만들기

 

  • 모놀리식 서비스 구성 파일
cat pods/secure-monolith.yaml

 

 

보안이 설정된 모놀리식 포드와 구성 데이터를 만든다.

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

 

Kubernetes 서비스를 만들어 보안이 설정된 포드를 외부로 노출시킨다.

 

 

 

  • 모놀리식 서비스 구성 파일에서 모놀리식 서비스 생성
kubectl create -f services/monolith.yaml

 

 

 

  • 트래픽을 노출된 NodePort의 모놀리식 서비스로 보냄
gcloud compute firewall-rules create allow-monolith-nodeport \
  --allow=tcp:31000

 

 

7. 포드에 라벨 추가하기

 

[ 'secure=enabled' 라벨을 추가 ]

 

kubectl label 명령어를 사용

kubectl label pods secure-monolith 'secure=enabled'
kubectl get pods secure-monolith --show-labels

 

 

 

 

8. Kubernetes로 애플리케이션 배포하기

 

디플로이먼트

: 디플로이먼트는 실행 중인 포드의 개수가 사용자가 명시한 포드 개수와 동일하게 만드는 선언적 방식이다.

  • Pod를 업데이트하거나 확장해야 하는 경우 배포가 이를 처리한다.
  • 또한 디플로이먼트는 어떤 이유로든 포드가 중지되면 재시작을 담당하여 처리한다.

 

9. 디플로이먼트 만들기

 

모놀리식 앱을 다음의 3가지 부분으로 나눕니다.

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

 

  • auth 디플로이먼트 구성 파일

 

 

  • 디플로이먼트 개체 생성
kubectl create -f deployments/auth.yaml

 

  • auth 디플로이먼트용 서비스 생성
kubectl create -f services/auth.yaml

 

hello, frontend도 동일하게 생성한다.

 

외부 IP 주소를 확보하고 curl 명령어를 사용하여 frontend와 상호작용한다.

kubectl get services frontend

 


📌 Reference

  • 구글 클라우드 스킬 부스트 (퀵랩)
반응형

댓글