220530 Today I Learned
일지
특이 사항 없음
오늘의 할일
- 220530 TIL 작성
- Kubernetes udemy 강좌 수강
- Side Project 진행
주요 키워드
- S/W 배포/테스트 전략
- K8s
- Deployment
수업 정리
소프트웨어 배포 전략/테스트 전략
배포 전략
- 재생성
- 현재 동작중인 인스턴스들을 모두 중지하고 새로운 인스턴스를 생성하여 배포
- 기존 동작중인 어플리케이션이 모두 중지되므로, 다운타임 발생
- 가장 단순한 배포방식
- 순차 배포
- 기존 어플리케이션과 새로운 버전의 어플리케이션을 함께 구동
- 재성성 배포 방식과 달리 서비스의 다운타임의 없게 하거나 최소화 할 수 있음
- 기존 어플리케이션과 신규 어플리케이션의 호환성을 고려
- 블루/그린 배포
- 기존 어플리케이션과 신규 어플리케이션의 리소스를 동시에 생성
- 기존 어플리케이션에서 신규 어플리케이션으로 한번에 이전 가능, 다운타임 없음
- 비용의 문제 고려가 필요 (동시에 기존/신규 어플리케이션 인프라 필요)
테스트 전략
- 카나리 테스트 : 새로운 어플리케이션을 테스트하기 위하여 테스트용 리소스를 일부만 배포하여 테스트
- A/B: 같은 요청에 대하여 A와 B로 나누어진 요청 처리를 하도록하여 정상 처리 여부 등을 확인
- 섀도우 테스트: 기존 서비스의 요청을 미러링 하여 테스트 리소스로 전달
디플로이먼트(Deployment)
- 컨트롤러의 유형 중 하나
- 레플리카셋의 상위 리소스 처럼 동작
디플로이먼트 - 레플리카셋 - 파드 - 업데이트 기능을 제공
레플리케이션 컨트롤러를 사용한 롤링업데이트(순차업데이트)
-
롤링업데이트를 위한 RC리소스 및 서비스 리소스 생성
apiVersion: v1 kind: ReplicationController metadata: name: rolling-update-rc spec: replicas: 3 selector: app: myapp template: metadata: labels: app: myapp spec: containers: - name: rolling-update-container image: misayo/myapp:1 ports: - containerPort: 80 protocol: TCP
apiVersion: v1 kind: Service metadata: name: rolling-update-service spec: selector: app: myapp ports: - targetPort: 80 port: 80
-
테스트 리소스 생성 후, 서비스를 통해 출력되는 http응답 및 파드 상태를 모니터링
watch -n 1 curl <서비스IP> watch -n 1 kubectl get pod서비스IP> -
레플리케이션 컨트롤러의 롤링업데이트 기능을 사용한 업데이트 수행 kubectl rolling-update <현재RC> <새로운RC> --image=misayo/myapp:2 (현재 1.21.12 버전에서는 더이상 rolling-update 서브커맨드 지원하지 않음)새로운RC>현재RC>
레플리케이션 컨트롤러의 롤링업데이트의 문제점
- 명령어에 의한 직접적인 업데이트 수행: 업데이트 중지 등의 문제가 발생할 수 있음. 명령의 오류 발생시 업데이트 불가
- 레이블 정보를 임의로 추가: 사용자에 의한 추가가 아닌 업데이트 작업에 의한 임의의 수정이 발생하여 문제가 될 수도 있음. (deployment 레이블 생성)
디플로이먼트 리소스
- 명령어의 지속적인 실행상태에 의한 업데이트가 아닌 리소스 차원의 업데이트 수행
- 리소스의 임의 변경 등이 필요하지 않음
디플로이먼트 리소스 테스트
-
디플로이먼트 리소스 생성
apiVersion: apps/v1 kind: Deployment metadata: name: rolling-update-deployment spec: selector: matchLabels: app: myapp template: metadata: labels: app: myapp spec: containers: - name: rolling-update-container image: misayo/myapp:1 ports: - containerPort: 80 protocol: TCP
apiVersion: v1 kind: Service metadata: name: rolling-update-service spec: selector: app: myapp ports: - targetPort: 80 port: 80
-
테스트 리소스 생성 후 확인
kubectl get deployments.apps rolling-update-deployment -o yamlspec: ... strategy: rollingUpdate: maxSurge: 25% maxUnavailable: 25% type: RollingUpdate ...
type: RollingUpdate / Recreate
-
기존 Deployment 리소스 삭제 후 재 생성
kubectl delete -f deployment.yaml
kubectl create -f deployment.yaml –record
kubectl rollout status deployment rolling-update-deployment
kubectl history status deployment rolling-update-deployment -
디플로이먼트 리소스에 대한 업데이트 수행
kubectl set image deployment rolling-update-deployment rolling-update-container=misayo/myapp:2
kubectl set image deployment <디플로이먼트이름> <컨테이너명>=<이미지>이미지>컨테이너명>디플로이먼트이름> -
업데이트 실행 후 상태 확인
kubectl rollout status deployment rolling-update-deployment
kubectl history status deployment rolling-update-deployment -
v2 → v3 업데이트 수행 (–record 포함)
kubectl set image deployment rolling-update-deployment rolling-update-container=misayo/myapp:3 –record -
업데이트 롤백 (undo)
kubectl rollout undo deployment rolling-update-deployment –to-revision=2
kubectl rollout undo deployment <디플로이먼트이름> --to-revision=<리비전번호>리비전번호>디플로이먼트이름> -
오브젝트 파일을 사용하여 리소스 업데이트
apiVersion: apps/v1 kind: Deployment metadata: name: rolling-update-deployment annotations: kubernetes.io/change-cause: Container Image set to misayo/myapp:3 spec: replicas: 3 selector: matchLabels: app: myapp template: metadata: labels: app: myapp spec: containers: - name: rolling-update-container image: misayo/myapp:3 ports: - containerPort: 80 protocol: TCP
Leave a comment