디플로미너트의 파드 템플릿
.spec.template
이 변경된 경우에만 디플로이먼트의 롤아웃이 트리거됩니다.
예를 들면 템플릿의 레이블이나 컨테이너 이미지가 업데이트된 경우입니다. 디플로이먼트의 스케일링과 같은 다른 업데이트는 롤아웃을 트리거하지 말아야합니다.
현재 실행중인 deployment.apps/nginx-deployment
를 업데이트할려합니다.
kubectl
명령어로 조작하는 방법$ kubectl --record deployment.apps/nginx-deployment set image deployment.v1.apps/nginx-deployment nginx=nginx:1.16.1
$ kubectl set image deployment/nginx-deployment nginx=nginx:1.16.1 --record
#result
deployment.apps/nginx-deployment edited
# 위 두 명령어는 nginx 이미지의 버전 1.14.1을 1.16.1로 업데이트 시켜주는 명령입니다.
$ kubectl edit deployment.v1.apps/nginx-deployment
# editting
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "2"
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{},"labels":{"app":"nginx"},"name":"nginx-deployment","namespace":"ingress-nginx"},"spec":{"replicas":3,"selector":{"matchLabels":{"app":"nginx"}},"template":{"metadata":{"labels":{"app":"nginx"}},"spec":{"containers":[{"image":"nginx:1.14.2","name":"nginx","ports":[{"containerPort":80}]}]}}}}
kubernetes.io/change-cause: kubectl deployment.apps/nginx-deployment set image
deployment.v1.apps/nginx-deployment nginx=nginx:1.16.1 --record=true
creationTimestamp: "2021-11-07T15:14:18Z"
generation: 2
labels:
app: nginx
name: nginx-deployment
namespace: ingress-nginx
resourceVersion: "409043"
uid: 9fc0a70a-3e19-46da-af4c-031cf22f1290
spec:
progressDeadlineSeconds: 600
replicas: 3
revisionHistoryLimit: 10
selector:
matchLabels:
.
.
.
# 이렇게 나오는 명세를 조작하여 업데이트할 수 있습니다.
# result
deployment.apps/nginx-deployment edited
롤 아웃 상태를 보려면
kubectl rollout status deployment.v1.apps/nginx-deployment
명령어를 이용하여 상태를 볼 수 있습니다.
deployment "nginx-deployment" successfully rolled out
라는 결과가 나옵니다.
업데이트된 디플로이먼트에 대해 자세한 정보를 보기 위해서는
kubectl get deployments
를 이용하면 아래와 같은 정보가 출력이 됩니다.NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 3/3 3 3 23h
kubect get rs
NAME DESIRED CURRENT READY AGE
nginx-deployment-559d658b74 3 3 3 23h
nginx-deployment-66b6c48dd5 0 0 0 23h
디플로이먼트는 업데이트 되는 동안 일정한 수의 파드만 중단되도록 보장합니다. 기본적으로 적어도 의도한 파드 수의 75% 이상이 동작하도록 보장합니다 ( 최대 25% 불가)
또한 디플로이먼트는 의도한 파드 수보다 더 많이 생성되는 파드의 수를 제한합니다. 기본적으로 의도한 파드의 수 기준 최대 125%까지만 추가 파드가 동작할 수 있도록 제한합니다(25%까지)
디플로이먼트 컨트롤러는 각 시간마다 새로운 디플로이먼트에서 레플리카셋이 의도한 파드를 생성하고 띄우는 것을 주시합니다. 만약 디플로이먼트가 업데이트되면, 기존 레플리카셋에서 .spec.selector
레이블과 일치하는 파드를 컨트롤 하지만, 템플릿과 .spec.template
이 불일치하면 스케일 다운이 됩니다. 결국 새로운 레플리카셋은 .spec.replicas
로 스케일이 되고 모든 기존 레플리카셋은 0개로 스케일됩니다.
만약 기존 롤아웃이 진행되는 중에 디플리먼트를 업데이트하는 경우 디플로이먼트가 업데이트에 따라 새레플리카셋을 생성하고 스케일 업하기 시작합니다 그리고 이전에 스케일 업하던 레플리카셋을 롤 오버합니다.
예를 들어 디플로이먼트로 nginx:1.14.2 레플리카를 5개 생성을 한다. 하지만 nginx:1.14.2 레플리카 3개가 생성되었을 때 디플로이먼트를 업데이트해서 nginx:1.16.1 레플리카 5개를 생성성하도록 업데이트를 한다고 가정한다. 이 경우 디플로이먼트는 즉시 생성된 3개의 nginx:1.14.2 파드 3개를 죽이기 시작하고 nginx:1.16.1 파드를 생성하기 시작한다. 이것은 과정이 변경되기 전 nginx:1.14.2 레플리카 5개가 생성되는 것을 기다리지 않는다.
일반적으로 레이블 셀렉터를 업데이트하는 것을 권장하지 않으며 셀럭터를 미리 계획하는 것을 권장합니다.
어떤 경우든 레이블 셀렉터의 업데이트를 해야하는 경우 매우 주의하고,모든 영향을 파악했는지 확인해야합니다.
참고: API 버전 apps/v1 에서 디플로이먼트의 레이블 셀렉터는 생성 이후에는 변경할 수 없다.
spec
에 있는 파드 템플릿 레이블도 새 레이블로 업데이트 해야합니다. 그렇지 않으면 유효성 검사 오류가 반환됩니다. 이 변경은 겹치지 않는 변경으로 새 셀렉터가 이전 셀렉터로 만든 레플리카셋과 파드를 선택하지 않게 되고, 그 결과로 모든 기존 레플리카셋은 고아가 되며, 새로운 레플리카셋을 생성하게 됩니다.--> .spec.selector
업데이트시 .spec.template.labels
를 업데이트 해야한단 말입니다.
셀럭터 업데이트는 기존 셀렉터 키 값을 변경하며, 결과적으로 추가와 동일한 동작을 합니다.
셀렉터 삭제는 디플로이먼트 셀렉터의 기존 키를 삭제하며 파드 템플릿 레이블의 변경을 필요로 하지 않습니다. 기존 레플리카셋은 고아가 아니고, 새 레플리카셋은 생성되지 않습니다. 그러나 제거된 레이블은 기존 파드와 레플리카셋에 여젼히 존재한다는 점을 생각해야합니다.