컨테이너 오케스트레이션

Devops Day 53 (5.19) 컨테이너 오케스트레이션_Sprint 새 버전이 망가졌어요

Jackykim 2023. 5. 20. 03:40

빈 문자열을 입력받은 경우, 빈 객체를 리턴해야 합니다새 버전이 망가졌어요! 스프린트는, 버그가 있는 새 버전을 쿠버네티스를 이용해 롤링 업데이트를 시도하고, 구버전으로 롤백하는 과정을 담은 스프린트입니다.

 

시나리오
여기 CozServer라는 간단한 WAS가 있습니다. 버전 1.0은 정상적으로 잘 작동하는 애플리케이션입니다. 여기에 디플로이먼트 명세를 적용해서 파드의 레플리카를 배포할 것입니다. 이후에 2.0 버전을 만들고, 디플로이먼트를 이용해 업데이트를 적용합니다. 여기까지는 전혀 문제가 없습니다.

그러나 여기서 우리는 3.0 버전에 의도적으로 버그를 만들 것입니다. 3.0 버전에 문제가 발생하면, 2.0 버전으로 롤백해야 합니다.

목표 :
- 파드 명세를 작성할 수 있다.

- 디플로이먼트 명세를 작성할 수 있다.

- 서비스를 이용해 파드를 노출할 수 있다.

- kubectl apply 명령을 이용해 리소스를 생성할 수 있다.

- 디플로이먼트 명세를 수정(또는 재작성)하여 새로운 버전을 배포할 수 있다.

- kubectl rollout 명령을 이용해 롤링 배포 현황을 확인할 수 있다.

- 새로운 버전에 문제가 발생했을 때 롤백할 수 있다.

 

Bare Minimum Requirement
- 개별 STEP 마다 총 다섯 번의 커밋 기록이 있어야 합니다.

- 작성해서 제출해야 하는 파일은 다음과 같습니다.

- cozserver-deployment-v1.yaml

- cozserver-deployment-v2.yaml

- cozserver-deployment-v3.yaml

- cozserver-service.yaml

- rollback-log.txt (롤백 터미널 로그)

 

Step 0 : 복습
Docker Hub에 sebcontents/cozserver:1.0이라는 이름의 파드가 존재합니다.
docker run -p 80:8080 sebcontents/cozserver:1.0

 

Step 1 : sebcontents/cozserver:1.0 이미지를 바탕으로 파드를 만들어봅시다.

🏁 cozserver-pod.yaml 에 파드 명세를 적고, 파드가 kubectl에 의해 실행되어야 합니다.
기본 cozsever-pod.yaml 파일 작성

kubectl apply -f cozserver-pod.yaml 하였지만 “The connection to the server localhost:8080 was refused - did you specify the right host or port?” Error 발생

해결 :
1. Minikube start으로 container 실행
2. kubectl apply -f cozserver-pod.yaml 파일 실행
3. kubectl get pods 으로 잘 작동 되고 있는지 확인
단 Status에 “InvalidImageName” Yaml 코드 수정 cozserver:1:0 -> cozserver:1.0
4. kubectl logs cozserver-deployment -c sebcontents-cozserver cmd로 확인
Example app listening at http://localhost:8080

 

Step 2 : 디플로이먼트를 이용한 1.0 배포
cozserver-deployment-v1.yaml 에 디플로이먼트 명세를 적고, kubectl에 의해 실행되어야 합니다.

이슈 : The Deployment "cozserver-deployment-v1" is invalid: spec.template.metadata.labels: Invalid value: map[string]string{"app":"cozserver"}: `selector` does not match template `labels` error
해결 : Template 에 Version : v1 추가

Step 3 : 서비스
서비스 리소스를 만들어서 파드를 외부로 노출시켜줘야 합니다.

이때 서비스 리소스의 타입은 LoadBalancer를 사용할 것입니다.

앞서 안내한 대로, 컨테이너 포트는 8080을 사용합니다.

🏁 cozserver-service.yaml 에 서비스 명세를 적고, kubectl에 의해 실행되어야 합니다.
로컬 환경에서 테스트하기 위해서는 터널이 필요합니다. minikube tunnel 명령을 이용해 터널을 뚫어줍시다.

kubectl apply -f cozserver-service.yaml -> 로컬 환경에서 테스트 하기 위해 minikube tunnel 명령

Step 4 : 2.0 배포, 롤아웃
기존의 cozserver-deployment-v1.yaml를 그대로 복사해서 cozserver-deployment-v2.yaml라는 이름으로 새로 생성합시다.
이제, 1.0 대신 새로운 파일을 이용해 기존의 CozServer 1.0 버전이 아닌, 2.0 버전을 롤링 업데이트를 통해 배포할 것입니다.

🏁 cozserver-deployment-v2.yaml 에 2.0 버전을 이용한 디플로이먼트 명세를 적고, kubectl에 의해 적용되어야 합니다. 배포 전략은 RollingUpdate를 사용할 것입니다.

sebcontents/cozserver:2.0 이미지를 사용합니다.

kubectl get all 명령어를 통해 적용할 때, 배포되는 과정을 꼭 확인해 보세요.

kubectl apply -f cozserver-deployment-v2.yaml –record -> kubectl get all 명령어를 통해 적용할 때, 배포되는 과정을 꼭 확인

Cozserver-deployment-v2 배포 후 localhost 내용이 변경 된걸 확인 할 수 있습니다.

Step 5 : 3.0 배포와 2.0으로의 롤백
3.0
배포를 위해서 cozserver-deployment-v3.yaml 에 3.0 버전을 이용한 디플로이먼트 명세를 적고, kubectl을 통해 배포를 시도합시다.

그러나, 요청을 여러 번(정확히는 파드 당 다섯 번) 이상 보내면 파드에서 HTTP 500 에러를 내뱉습니다.

현업에서도 비슷한 경우가 매우 많습니다. 배포를 하고 나면, 처음에는 그럴싸하게 잘 된 것 같아 보이지만, 사용하다 보면 버그로 인해 internal 에러를 마주치게 되는 경우가 허다합니다.

 

RollBack log을 확인 할 수 있습니다.

 

Minkube Stop 명령 할 경우 하단 사진처럼 Error Message가 나옵니다 (minikube tunnel 진행중)

참고 https://kubernetes.io/ko/docs/concepts/workloads/controllers/deployment/#%EB%94%94%ED%94%8C%EB%A1%9C%EC%9D%B4%EB%A8%BC%ED%8A%B8-%EB%A1%A4%EB%B0%B1

 

쿠버네티스 치트 시트
kubectl 명령어는 쉽고 직관적으로 구성되어 있습니다. 따라서 몇 가지 패턴만 알아두어도 쉽게 생성, 조회, 삭제 등이 가능합니다.

 

리소스 YAML 적용

kubectl apply -f <파일이름>


리소스 조회

1 kubectl get <리소스종류>                    # 목록 조회

2 kubectl get all                  # 현재 네임스페이스에서 모든 리소스 조회

3 kubectl describe <리소스종류> <리소스이름>     # 상세 조회

 

리소스 삭제

kubectl delete <리소스종류> <리소스이름>

kubectl delete -f <파일이름>


파드 로그 조회

kubectl logs <파드이름>


클러스터 삭제 후 다시 생성

클러스터에 문제가 생겼거나, 초기화하고 처음부터 다시 시작하고 싶을 때 이용합니다.

minikube delete # 삭제

minikube start # 다시 생성

 

참고:  https://kubernetes.io/ko/docs/reference/kubectl/cheatsheet/