이쿠의 슬기로운 개발생활

함께 성장하기 위한 보안 개발자 EverNote 내용 공유

클라우드/Kubernetes

12. Kubernetes Update ( Deployment )

이쿠우우 2020. 8. 23. 14:23
반응형

Kubernetes  Update ( Deployment )

 

 

참고) 실습환경

 

[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: blue
    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' 카테고리의 다른 글

14. Kubernetes 인증 ( Basic Authentication )  (0) 2020.08.23
13. Kubernetes 인증(Authentication) 이론  (0) 2020.08.23
11. Kubernetes Secret  (0) 2020.08.17
10. Kubernetes ConfigMap  (0) 2020.08.17
09. Kubernetes Volume 개념  (0) 2020.08.17