이 포스팅은 Google Cloud에서 제공하는 'Kubernetes in Google Cloud' 교육을 기반으로 실습하고 내용을 작성하였습니다.
이 실습에서는 다음 작업 과정을 학습했습니다.
- Kubernetes Engine을 사용하여 완전한 Kubernetes 클러스터를 프로비저닝
- kubectl을 사용하여 Docker 컨테이너를 배포하고 관리
- Kubernetes의 디플로이먼트 및 서비스를 사용하여 애플리케이션을 마이크로서비스로 분할
Step1. 샘플 코드 가져오기
이 실습 부분에서는 예제 애플리케이션을 사용하기 때문에 GitHub에서 가져오는 과정을 거쳐야 합니다!
1. GitHub 저장소 클론
gsutil cp -r gs://spls/gsp021/* .
2. 실습에 필요한 디렉토리로 변경
cd orchestrate-with-kubernetes/kubernetes
<샘플 레이아웃>
deployments/ /* 디플로이먼트 매니페스트 */
...
nginx/ /* nginx 구성 파일 */
...
pods/ /* 포드 매니페스트 */
...
services/ /* 서비스 매니페스트 */
...
tls/ /* TLS 인증서 */
...
cleanup.sh /* 정리 스크립트 */content_copy
Step2. Kubernetes 데모 실행해보기
1. kubectl create로 nginx 컨테이너의 단일 인스턴스를 실행
kubectl create deployment nginx --image=nginx:1.10.0
Kubernetes가 배포를 생성했습니다.
배포를 생성함에 따라 pod가 작동하고 있으며, pod가 실행하는 노드에 오류가 발생해도 계속해서 작동하게 됩니다.
- pod란? 1개 이상의 컨테이너가 포함된 모음
- Volume이란? volume은 pod에 포함되어 있습니다. 볼륨은 포드가 존재하는 한 계속해서 존재하는 데이터 디스크이며 포드에 포함된 컨테이너에 의해 사용됩니다. 포드는 콘텐츠에 공유된 네임스페이스를 제공합니다.
- 아래 이미지의 pod 안에 있는 2개의 컨테이너는 서로 통신하며 volume도 공유합니다.
2. kubectl get pods 명령어로 실행 중인 nginx 컨테이너 확인
kubectl get pods
3. kubectl expose 명령어로 Kubernetes 외부로 노출
kubectl expose deployment nginx --port 80 --type LoadBalancer
Kubernetes가 백그라운드에서 공개 IP 주소가 첨부된 외부 Load Balancer를 만들었습니다.
이 공개 IP 주소를 조회하는 모든 클라이언트는 서비스 백그라운드에 있는 pod로 라우팅됩니다.
이 경우에는 nginx 포드로 라우팅됩니다!
4. kubectl get services 명령어로 서비스를 나열
kubectl get services
external IP를 확인합니다.
5. 원격으로 Nginx 컨테이너를 조회
curl http://<External IP>:80
Step1~2를 통해 Kubernetes 클러스터를 완성하고 Nginx 컨테이너를 배포해보았습니다!
Step3. Pod 생성
1. 모놀리식 포드 생성
kubectl create -f pods/monolith.yaml
Step4. Pod와 상호작용
Pod에는 기본적으로 비공개 IP 주소가 부여되어 클러스터 밖에서는 접근할 수 없습니다.
kubectl port-forward 명령어를 사용하여 local 포트를 모놀리식 포드 안의 포트로 매핑하는 작업이 필요합니다!
1. 두 번째 터미널에서 pod 전달 설정
kubectl port-forward monolith 10080:80
2. 첫 번째 터미널에서 curl을 사용하여 pod와 통신 시작
curl http://127.0.0.1:10080
3. 모놀리식에서 인증 토큰을 얻기 위해 로그인 시도
curl -u user http://127.0.0.1:10080/login
로그인하여 JWT 토큰이 출력됩니다!
이제, Shell은 긴 문자열을 제대로 복사하지 못하니 토큰을 위한 환경 변수를 만들어야 합니다.
4. 토큰 환경 변수 만들기
TOKEN=$(curl http://127.0.0.1:10080/login -u user|jq -r '.token')
5. 토큰 복사 및 보안이 설정된 엔드포인트 조회
curl -H "Authorization: Bearer $TOKEN" http://127.0.0.1:10080/secure
6. pod의 로그를 확인
kubectl logs monolith
7. 세 번째 터미널을 열고 실시간 로그 스트림 가져옴
kubectl logs -f monolith
8. 세 번째 터미널에서 로그가업데이트 확인
curl http://127.0.0.1:10080
9. pod의 대화형 셸을 실행
kubectl exec monolith --stdin --tty -c monolith /bin/sh
이는 컨테이너 내부에서 문제를 해결할 때 유용합니다!
- 예를 들어, ping 명령어를 사용하여 외부 연결을 테스트할 수 있습니다.
ping -c 3 google.com
10. 로그아웃
exit
* 대화형 셸 사용을 완료한 후에는 반드시 로그아웃합니다! *
이와 같이 원격으로 컨테이너를 조회하거나 로그인 셸이 필요한 경우 Kubernetes가 작업에 필요한 모든 것을 제공한다는 것을 알 수 있습니다!
Step5. 서비스 생성
pod는 영구적이지 않기 때문에 안정적인 엔드포인트를 생성해주는 서비스를 만들어봅시다.
1. 보안이 설정된 모놀리식 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
이제 보안이 설정된 포드가 있으니 이를 외부로 노출시켜 봅시다.
이렇게 하기 위해 Kubernetes 서비스를 만듭니다!
2. 모놀리식 서비스 구성 파일에서 모놀리식 서비스를 만듭니다.
kubectl create -f services/monolith.yaml
3. 트래픽을 노출된 NodePort의 모놀리식 서비스로 보내기
gcloud compute firewall-rules create allow-monolith-nodeport \
--allow=tcp:31000
Step6. pod에 라벨 추가
보안이 설정된 모놀리식 포드에 누락된 secure=enabled 라벨을 추가합니다.
kubectl label pods secure-monolith 'secure=enabled'
kubectl get pods secure-monolith --show-labels
Step7. Kubernetes로 애플리케이션 배포
1. 디플로이먼트 개체 생성
kubectl create -f deployments/auth.yaml
content_copy
2. 추가로, auth 디플로이먼트용 서비스 생성
kubectl create -f services/auth.yaml
3. hello 디플로이먼트도 동일하게 진행
kubectl create -f deployments/hello.yaml
kubectl create -f services/hello.yaml
4. frontend 디플로이먼트 또한 동일하게 진행
kubectl create configmap nginx-frontend-conf --from-file=nginx/frontend.conf
kubectl create -f deployments/frontend.yaml
kubectl create -f services/frontend.yaml
5. 외부 IP 주소를 확보하고 frontend와 상호작용
kubectl get services frontend
curl -k https://<EXTERNAL-IP>
'Cloud' 카테고리의 다른 글
[GCP/Kubernetes] Kubernetes Engine에 컨테이너 애플리케이션 배포하기 (0) | 2023.05.11 |
---|---|
[GCP/Kubernetes] Docker 컨테이너 생성하기 (0) | 2023.05.11 |