Kubernetes Update
참고) 실습환경
[Master Node server]
OS = CentOS 7
리눅스 커널 버전 : Linux 3.10.0-1062.el7.x86_64
docker version : 1.13.1
docker api verison : 1.26
[Worker Node server]
OS = CentOS 7
리눅스 커널 버전 : Linux 3.10.0-1062.el7.x86_64
docker version : 1.13.1
docker api verison : 1.26
[Kubernetes version]
1.18
Kubernetes Update 방법은?
kubernetes를 사용하지 않는 기존의 운영 Server Update 방법은
일시적으로 운영을 중단시킨 뒤 Update를 진행한 후 다시 운영하는 방법을 사용했었음
이에 따라 무중단으로 Update 할 수 있는 방법이 필요했음
kubernetes에서는 다양한 무중단 Update 방법을 제공하여
운영 중인 Service 들은 항상 정상운영 상태를 유지시켜줌
대표적으로 Rolling Update, Blue/Green Update, Cannery Update 방법이 있음
Rolling Update( Deployment )
Rolling Update는 가장 많이 사용되는 Update 방법으로 Replication Controller에서 지원하다가
현재는 ReplicaSet의 등장으로 Replication Controller이 없어지고
ReplicaSet을 사용하는 Deployment Controller에서 지원되는 Update 방법임.
즉 실제 Update는 Deployment Controller가 아니라 Replication에 의해서 이루어짐.
전체 배포되어 있는 모든 Pod들을 동시에 중단/Update 하는 것이 아니라
일정 개수씩 순서대로 Update 하는 방법.
[장점]
서비스 중단 현상 없이 Update/Rollback 가능
[단점]
구버전과 새 버전이 공존하는 시간이 발생함.
kubernetes Deployment Controller 이용한 Update 과정 설명
Origin Deployment Controller 생성
[ 예제) rollingupdate.yaml 파일 ]
apiVersion: apps/v1 kind: Deployment metadata: name: iksoon-deployment labels: app: iksoon-tomcat spec: replicas: 10 minReadySeconds: 1 strategy: type: RollingUpdate rollingUpdate: maxSurge: 1 maxUnavailable: 0 selector: matchLabels: app: iksoon-pod template: metadata: labels: app: iksoon-pod spec: containers: - name: iksoon-tomcat image: peksoon/iksoon_tomcat:1.0.3 ports: - containerPort: 8080 |
[옵션 설명]
minReadySeconds:
Rolling Update 속도 설정
기본 값 : 0
Pod의 status 가 Ready가 될 때까지의 최소 대기 시간.
minReadySeconds로 설정된 시간 동안은 트래픽을 받지 않음
type : RollingUpate
설정하지 않으면 자동으로 RollingUpdate로 설정됨 (Default 값)
Update 시 Rolling Updaet를 사용
maxSurge:
Rolling Update 시 동시에 생성할 수 있는 Pod의 최대 개수 설정
- %로 설정 가능
- 수로 설정 가능
- 0보다 큰 수로 설정해야 함
기본값 :
- replicas 설정 값의 25%
해당 설정에 따라서 Update 시간을 단축할 수도 있으나
갑자기 Pod 리소스가 급증할 수도 있으니 주의해야 함
maxUnvailable:
Rolling Update 시 동시에 삭제할 수 있는 Pod의 최대 개수 설정
- %로 설정 가능
- 수로 설정 가능
- 0보다 큰 수로 설정해야 함
기본값 :
- replicas 설정 값의 25%
해당 설정에 따라서 Update 시간을 단축할 수도 있으나
갑자기 Pod 리소스가 급증할 수도 있으니 주의해야 함
peksoon/iksoon_tomcat:1.0.3
Container Image File version 1.0.3 사용 (구버전)
[상위 예제 deployment를 생성]
명령어 : kubectl apply -f rollingupdate.yaml
10개의 Pod가 Running 중이며
해당 Pod는 iksoon_tomcat:1.0.3 이미지를 사용 중
Update Deployment Controller 생성
상위 deployment와 동일하지만
images Version 만 1.0.4로 Update 함
spec: containers: - name: iksoon-tomcat image: peksoon/iksoon_tomcat:1.0.4 ports: - containerPort: 8080 |
상위 부분만 수정 후 다시
kubectl apply -f rollingupdate.yaml
명령 실행하면 Pod Version 이 갱신되는 것을 확인할 수 있음
먼저 image version 1.0.3을 사용하던 pod/iksoon-deployment-7cd487467c-rfv75 pod 가 삭제되고
image version 1.0.4를 사용하는 새로운 pod/iksoon-deployment-55ff99bd44-xpccv 가 생성되고
또 다른 pod가 삭제됨
이와 같이 maxSurge를 1로 설정해서 1개의 pod씩 Update 되는 것을 확인할 수 있음
Rolling update 참고 명령어
[Update 기록 확인]
kubectl rollout history [deployment 이름]
예) kubectl rollout history deployment.apps/iksoon-deployment
CHANGE-CAUSE 가 none인데 해당 부분에 값을 넣기 위해서는
annotations : kubernetes.io/change-cause에 값을 넣어줘야 함
[ 예제 yaml ]
apiVersion: apps/v1 kind: Deployment metadata: name: iksoon-deployment labels: app: iksoon-tomcat annotations: kubernetes.io/change-cause: "iksoon rolling update test version 1.0.3" spec: replicas: 10 minReadySeconds: 10 strategy: type: RollingUpdate rollingUpdate: maxSurge: 1 maxUnavailable: 0 selector: matchLabels: app: iksoon-pod template: metadata: labels: app: iksoon-pod spec: containers: - name: iksoon-tomcat image: peksoon/iksoon_tomcat:1.0.3 ports: - containerPort: 8080 |
[결과]
[ Update 일시 중지 ]
kubectl rollout pause [deployment 이름]
예) kubectl rollout pause deployment.apps/iksoon-deployment
[ 현재 상태 확인 ]
kubectl rollout status [deployment 이름]
예) kubectl rollout status deployment.apps/iksoon-deployment
Rolling update Rollback 방법
[마지막으로 했던 update를 취소]
명령어 : kubectl rollout undo [deployment 이름]
[특정 revision으로 rollback]
먼저 history 명령으로 revision 확인
명령어 : kubectl rollout history [deployment 이름]
rollback 진행
명령어 : kubectl rollout undo [deployment 이름] --to-revision=1
[ 예 ]
kubectl rollout undo deployment.apps/iksoon-deployment --to-revision=1
[ 결과 ]
이미지가 version 1.0.3으로 돌아온 것을 확인할 수 있음
history 확인 시 revision 1 이 없어지고 3이 생성됨을 확인할 수 있음
Blue/Green Update(Deployment)
Blue/Green은 기존에 띄워져 있는 Pod 개수와 동일한 개수만큼의 신규 Pod를 모두 띄운 다음에
신규 Pod가 이상 없이 정상적으로 떴는지 확인한 후
들어오는 트래픽을 LoadBalaner 설정을 변경하여 한번에 신규 Pod 쪽으로 옮기는 방법
즉 서버를 새 버전과 구버전으로 2세트를 마련하고, 이를 한꺼번에 교체하는 방법.
Amazon에서 10년이 넘는 기간 동안 이루어진 검증되는 배포 프로세스.
[ Blue 의미 ]
운영 중인 Application (Old Version)
[ Green 의미 ]
새로운 버전의 Application (New Version)
Unit Test, Smoke Test, 스트레스 Test 등 각종 Test를 수행
[ 진행 ]
테스트가 완료되고 이상이 없음을 확인하면
Blue Application으로 가던 트래픽을 Green Application으로 변경하여 Update를 완료함
이후에 지속적으로 Green을 모니터링하다가 버그/오류가 발생하면 다시 Blue로 변경하고
Green에서 장시간 정상 동작을 확인하면 Blue를 제거한 후 Green을 Blue로 사용함
[ 장점 ]
릴리즈와 관련된 모든 downtime을 줄이기 위한 Application Release 기술.
앱을 출시하기 전에 준비하는 매우 빠른 방법이며,
배포판의 Issue가 감지되었을 시 빠르게 Rollback을 할 수 있음
[ 단점 ]
한 번에 두배의 Pod를 실행해야 하기 때문에 클러스터의 리소스가 2배 이상 필요함.
kubernetes Deployment Controller 이용한 Update 과정 설명
Origin Deployment Controller 생성
[ 예제 blueDeployment.yaml 파일 ]
kubernetes Deployment Controller 이용
labels에 color: blue 설정을 함
image : version 1.0.2를 사용함
기존 운영 Application 역할 Blue Deployment 예제
apiVersion: apps/v1 kind: Deployment metadata: name: iksoon-deployment-blue labels: app: iksoon-tomcat spec: replicas: 2 selector: matchLabels: app: iksoon-pod template: metadata: labels: app: iksoon-pod color: blue spec: containers: - name: iksoon-tomcat image: peksoon/iksoon_tomcat:1.0.2 ports: - containerPort: 8080 |
Origin Blue를 바라보는 ClusterIP Service와 ingress Service 생성
Blue Deployment를 바라보는 Service 생성
[ ingress.yaml ]
위 부분이 ClusterIP Service 생성 (type 명시하지 않으면 defalut로 ClusterIP 임)
아래가 ingress 생성
apiVersion: v1 kind: Service metadata: name: iksoon-service spec: ports: - port: 8080 targetPort: 8080 selector: app: iksoon-pod color: blue --- apiVersion: extensions/v1beta1 kind: Ingress metadata: name: iksoon-ingress-nginx namespace: default annotations: nginx.ingress.kubernetes.io/rewrite-target: /$2 spec: rules: - host: iksoon.test.com http: paths: - path: /app1(/|$)(.*) backend: serviceName: iksoon-service servicePort: 8080 |
[ 결과 ]
service label 설정이 Color blue를 바라보고 있고
image version 이 1.0.2로 생성됨
[ Site 접속 상태 확인 ]
version 1.0.2의 site 가 출력됨
Update Green Deployment Controller 생성
기존 운영 Application 역할 Blue Deployment 예제
blueDeployment.yaml
labels에 color: green 설정을 함
image : version 1.0.4를 사용함
apiVersion: apps/v1 kind: Deployment metadata: name: iksoon-deployment-green labels: app: iksoon-tomcat spec: replicas: 2 selector: matchLabels: app: iksoon-pod template: metadata: labels: app: iksoon-pod color: green spec: containers: - name: iksoon-tomcat image: peksoon/iksoon_tomcat:1.0.4 ports: - containerPort: 8080 |
[ 생성 결과 ]
blue와 green 이 동시에 존재함
하지만 service는 label 이 color blue를 바라보고 있어서
아직 서비스는 blue로 제공됨
ClusterIP Service를 Update Green를 바라보게 함
기존에 사용하던 Service yaml파일 (ingress.yaml)을 수정
ClusterIP type Servie의 Label을 color: green으로 변경
apiVersion: v1 kind: Service metadata: name: iksoon-service spec: ports: - port: 8080 targetPort: 8080 selector: app: iksoon-pod color: green |
[ 결과 ]
service label 이 green을 바라보면서
site 접속 시 version 1.0.4 이미지의 site를 확인할 수 있음
Canary Update(Deployment)
신규 버전을 배포할 때 한꺼번에 앱의 전체를 교체하는 게 아니라
기존 버전을 유지한 채로 일부 버전만 신규 버전으로 올려서
신규 버전에 버그나 이상은 없는지를 사용자 반응은 어떤지 확인하는데 유용하게 사용하는 방법.
즉 새로운 버전의 Application을 Production 환경으로 보내어 어떻게 동작하는지 모니터링하는 도구로 사용
Kubernetes의 기본 Deployment로는 Deployment에 속한 Pod들을 하나씩이던 한꺼번에든
모두 교체하는 방식이기 때문에 이런 Canary 배포를 하기에는 어려움이 있음.
하지만 라벨을 이용하면 Kubernetes에서도 Canary 배포를 할 수 있음.
kubernetes Deployment Controller 이용한 Update 과정 설명
Origin Deployment Controller 생성
기존의 운영되고 있던 Application 역할
[ OriginDeployment.yaml 예제 ]
replicas가 3으로 설정되어 있음
image version 이 1.0.2로 사용되고 있음
apiVersion: apps/v1 kind: Deployment metadata: name: iksoon-deployment-origin labels: app: iksoon-tomcat version: origin spec: replicas: 3 selector: matchLabels: app: iksoon-pod template: metadata: labels: app: iksoon-pod version: originpod spec: containers: - name: iksoon-tomcat image: peksoon/iksoon_tomcat:1.0.2 ports: - containerPort: 8080 |
Origin을 바라보는 ClusterIP Service와 ingress Service 생성
origin Server에 접근하기 위한
[ ingress.yaml 예제 ]
apiVersion: v1 kind: Service metadata: name: iksoon-service spec: ports: - port: 8080 targetPort: 8080 selector: app: iksoon-pod --- apiVersion: extensions/v1beta1 kind: Ingress metadata: name: iksoon-ingress-nginx namespace: default annotations: nginx.ingress.kubernetes.io/rewrite-target: /$2 spec: rules: - host: iksoon.test.com http: paths: - path: /app1(/|$)(.*) backend: serviceName: iksoon-service servicePort: 8080 |
[ OriginDeployment.yaml과 ingress.yaml 생성 결과 ]
정상 동작 중
Update Deployment Controller 생성
기존에 정상적으로 운영되고 있던 deployment가 있는데
Test를 위해 추가 개발된 Application 역할을 하는 deployment를 추가
[ canayDeployment.yaml 예제 ]
replicas가 1로 설정되어 있음
images version 이 1.0.4로 올라감
apiVersion: apps/v1 kind: Deployment metadata: name: iksoon-deployment-canary labels: app: iksoon-tomcat version: canarytest spec: replicas: 1 selector: matchLabels: app: iksoon-pod template: metadata: labels: app: iksoon-pod version: canarypod spec: containers: - name: iksoon-tomcat image: peksoon/iksoon_tomcat:1.0.4 ports: - containerPort: 8080 |
[ 생성 결과 ]
해당 canary deployment를 추가한 후
site에 접속하면 일정 확률로
번갈아가면서 접속되는 것을 확인할 수 있음
ClusterIP Type의 Service Object를 확인하면
같은 labels 인 app: iksoon-pod를 가지고 있어서
번갈아가서 canary deployment에 접근하게 됨
이 이렇게 상대적으로 replicaset를 조절하면
접근하는 확률을 늘려가며 Test를 진행하다가
정상적으로 동작한다면 기존의 origin deployment를 삭제하며
test와 update를 진행함
제 글을 복사할 시 출처를 명시해주세요.
글에 오타, 오류가 있다면 댓글로 알려주세요! 바로 수정하겠습니다!
참고
https://jeongchul.tistory.com/576
https://zzsza.github.io/development/2019/01/20/kubernetes-engine-deployment/
https://joont92.github.io/kubernetes/%EB%B0%B0%ED%8F%AC-%EC%A0%84%EB%9E%B5/
https://box0830.tistory.com/288
https://arisu1000.tistory.com/27842
https://jason-lim.tistory.com/3
blue/green 배포
https://martinfowler.com/bliki/BlueGreenDeployment.html
'Kubernetes > Kubernetes 이론' 카테고리의 다른 글
Kubernetes Private Registry image 사용법 (0) | 2020.09.20 |
---|---|
Helm (0) | 2020.09.07 |
Kubernetes Secret (0) | 2020.08.17 |
Kubernetes ConfigMap (0) | 2020.08.17 |
Kubernetes Pod 더 자세히 알아보기 (2) | 2020.08.07 |