본 포스팅은 구글 스터디 잼에 참가하여 유료 플랫폼인 '퀵랩'을 무료로 제공받아 학습한 내용을 정리한 글입니다.
📚 오늘 공부할 내용
- 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로 다음과 같은 광범위한 버킷 및 객체 관리 작업을 수행할 수 있다.
클론 해온 폴더로 이동한다.
$ 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에는 하나 또는 여러 개의 컨테이너가 포함될 수 있다.
- 실행 중인 컨테이너 확인
$ 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
- 구글 클라우드 스킬 부스트 (퀵랩)
'Cloud > 구글 스터디 잼 | K8s' 카테고리의 다른 글
[StudyJam][#2]Kubernetes Engine: Qwik Start (0) | 2022.07.20 |
---|---|
[StudyJam][#1] Docker 소개 (0) | 2022.07.20 |
[StudyJam][#0] '클라우드 스터디 잼 쿠버네티스 입문' 시작! (0) | 2022.07.20 |
댓글