디플로이먼트
디플로이먼트(Deployment) 는 파드와 레플리카셋(ReplicaSet)에 대한 선언적 업데이트를 제공한다.
디플로이먼트에서 의도하는 상태 를 설명하고, 디플로이먼트 컨트롤러(Controller)는 현재 상태에서 의도하는 상태로 비율을 조정하며 변경한다. 새 레플리카셋을 생성하는 디플로이먼트를 정의하거나 기존 디플로이먼트를 제거하고, 모든 리소스를 새 디플로이먼트에 적용할 수 있다.
Deployment -> Replicaset -> Pod
디플로이먼트 롤링 업데이트
디플로이먼트는 .spec.strategy.type==RollingUpdate 이면 파드를 롤링 업데이트 방식으로 업데이트 한다. maxUnavailable 와 maxSurge 를 명시해서 롤링 업데이트 프로세스를 제어할 수 있다.
최대 불가(Max Unavailable)
.spec.strategy.rollingUpdate.maxUnavailable 은 업데이트 프로세스 중에 사용할 수 없는 최대 파드의 수를 지정하는 선택적 필드이다. 이 값은 절대 숫자(예: 5) 또는 의도한 파드 비율(예: 10%)이 될 수 있다. 절대 값은 내림해서 백분율로 계산한다. 만약 .spec.strategy.rollingUpdate.maxSurge 가 0이면 값이 0이 될 수 없다. 기본 값은 25% 이다.
예를 들어 이 값을 30%로 설정하면 롤링업데이트 시작시 즉각 이전 레플리카셋의 크기를 의도한 파드 중 70%를 스케일 다운할 수 있다. 새 파드가 준비되면 기존 레플리카셋을 스케일 다운할 수 있으며, 업데이트 중에 항상 사용 가능한 전체 파드의 수는 의도한 파드의 수의 70% 이상이 되도록 새 레플리카셋을 스케일 업할 수 있다.
최대 서지(Max Surge)
.spec.strategy.rollingUpdate.maxSurge 는 의도한 파드의 수에 대해 생성할 수 있는 최대 파드의 수를 지정하는 선택적 필드이다. 이 값은 절대 숫자(예: 5) 또는 의도한 파드 비율(예: 10%)이 될 수 있다. MaxUnavailable 값이 0이면 이 값은 0이 될 수 없다. 절대 값은 올림해서 백분율로 계산한다. 기본 값은 25% 이다.
예를 들어 이 값을 30%로 설정하면 롤링업데이트 시작시 새 레플리카셋의 크기를 즉시 조정해서 기존 및 새 파드의 전체 갯수를 의도한 파드의 130%를 넘지 않도록 한다. 기존 파드가 죽으면 새로운 래플리카셋은 스케일 업할 수 있으며, 업데이트하는 동안 항상 실행하는 총 파드의 수는 최대 의도한 파드의 수의 130%가 되도록 보장한다
Deployment 설정
# deployment 생성 YAML을 작성
jinsu@jinsu:~$ cat deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: mynginx-deploy
spec:
replicas: 5
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 25%
maxSurge: 25%
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
jinsu@jinsu:~$
# deployment 생성
jinsu@jinsu:~$ kubectl apply -f deployment.yaml
deployment.apps/mynginx-deploy created
jinsu@jinsu:~$
# deployment 상태 및 pod 상태 확인
jinsu@jinsu:~$ kubectl get pod
NAME READY STATUS RESTARTS AGE
mynginx-deploy-55fbd9fd6d-jfm8k 0/1 ContainerCreating 0 15s
mynginx-deploy-55fbd9fd6d-f2pzv 0/1 ContainerCreating 0 15s
mynginx-deploy-55fbd9fd6d-kwf4k 0/1 ContainerCreating 0 15s
mynginx-deploy-55fbd9fd6d-dwljg 0/1 ContainerCreating 0 15s
mynginx-deploy-55fbd9fd6d-p75wx 1/1 Running 0 15s
jinsu@jinsu:~$ kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
mynginx-deploy 1/5 5 1 17s
jinsu@jinsu:~$
# deployment 설정값 확인
jinsu@jinsu:~$ kubectl get deployment mynginx-deploy -oyaml
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "1"
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{},"name":"mynginx-deploy","namespace":"default"},"spec":{"replicas":5,"selector":{"matchLabels":{"app":"nginx"}},"strategy":{"rollingUpdate":{"maxSurge":"25%","maxUnavailable":"25%"},"type":"RollingUpdate"},"template":{"metadata":{"labels":{"app":"nginx"}},"spec":{"containers":[{"image":"nginx:1.7.9","name":"nginx"}]}}}}
creationTimestamp: "2022-08-14T08:24:38Z"
generation: 1
name: mynginx-deploy
namespace: default
resourceVersion: "16065"
selfLink: /apis/apps/v1/namespaces/default/deployments/mynginx-deploy
uid: 8262ede4-69af-499f-9f93-cba18f9b31c1
spec:
progressDeadlineSeconds: 600
replicas: 5
revisionHistoryLimit: 10
selector:
matchLabels:
app: nginx
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
app: nginx
spec:
containers:
- image: nginx:1.7.9
imagePullPolicy: IfNotPresent
name: nginx
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
status:
availableReplicas: 5
conditions:
- lastTransitionTime: "2022-08-14T08:25:02Z"
lastUpdateTime: "2022-08-14T08:25:02Z"
message: Deployment has minimum availability.
reason: MinimumReplicasAvailable
status: "True"
type: Available
- lastTransitionTime: "2022-08-14T08:24:38Z"
lastUpdateTime: "2022-08-14T08:25:06Z"
message: ReplicaSet "mynginx-deploy-55fbd9fd6d" has successfully progressed.
reason: NewReplicaSetAvailable
status: "True"
type: Progressing
observedGeneration: 1
readyReplicas: 5
replicas: 5
updatedReplicas: 5
jinsu@jinsu:~$
# deployment로 생성한 레플리카셋 확인
jinsu@jinsu:~$ kubectl get rs
NAME DESIRED CURRENT READY AGE
mynginx-deploy-55fbd9fd6d 5 5 5 5m44s
jinsu@jinsu:~$
deployment 배포시 image 에러가 발생
# 존재하지 않는 이미지로 이미지를 업데이트 하였을 때
jinsu@jinsu:~$ kubectl set image deployment mynginx-deploy nginx=nginx:1.9.30 --record
deployment.apps/mynginx-deploy image updated
jinsu@jinsu:~$
# deploy 하였을 때 maxUnavailabel을 25% 설정
jinsu@jinsu:~$ kubectl get deploy mynginx-deploy -oyaml
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "3"
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{},"name":"mynginx-deploy","namespace":"default"},"spec":{"replicas":5,"selector":{"matchLabels":{"app":"nginx"}},"strategy":{"rollingUpdate":{"maxSurge":"25%","maxUnavailable":"25%"},"type":"RollingUpdate"},"template":{"metadata":{"labels":{"app":"nginx"}},"spec":{"containers":[{"image":"nginx:1.7.9","name":"nginx"}]}}}}
kubernetes.io/change-cause: kubectl set image deployment mynginx-deploy nginx=nginx:1.9.30
--record=true
creationTimestamp: "2022-08-14T08:24:38Z"
generation: 3
name: mynginx-deploy
namespace: default
resourceVersion: "16969"
selfLink: /apis/apps/v1/namespaces/default/deployments/mynginx-deploy
uid: 8262ede4-69af-499f-9f93-cba18f9b31c1
spec:
progressDeadlineSeconds: 600
replicas: 5
revisionHistoryLimit: 10
selector:
matchLabels:
app: nginx
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
# pod에 에러가 발생하여도 전부 변경되지 않음
jinsu@jinsu:~$ kubectl get pod
NAME READY STATUS RESTARTS AGE
mynginx-deploy-7f9686c8fd-fbtxv 1/1 Running 0 9m20s
mynginx-deploy-7f9686c8fd-h7pms 1/1 Running 0 9m7s
mynginx-deploy-7f9686c8fd-4q92b 1/1 Running 0 9m5s
mynginx-deploy-7f9686c8fd-vq8lt 1/1 Running 0 9m20s
mynginx-deploy-69d67779d8-zq7bz 0/1 ErrImagePull 0 45s
mynginx-deploy-69d67779d8-lxkhm 0/1 ErrImagePull 0 45s
mynginx-deploy-69d67779d8-jhvcm 0/1 ErrImagePull 0 45s
jinsu@jinsu:~$
Deployment 명령어
# 이미지 변경
kubectl set image
jinsu@jinsu:~$ kubectl set image deployment mynginx-deploy nginx=nginx:1.9.1 --record
deployment.apps/mynginx-deploy image updated
jinsu@jinsu:~$
jinsu@jinsu:~$ kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
mynginx-deploy 4/5 3 4 9m9s
jinsu@jinsu:~$
# 이미지가 변경된 것을 확인
jinsu@jinsu:~$ kubectl get pod mynginx-deploy-7f9686c8fd-vq8lt -oyaml | grep image
- image: nginx:1.9.1
imagePullPolicy: IfNotPresent
image: nginx:1.9.1
imageID: docker-pullable://nginx@sha256:2f68b99bc0d6d25d0c56876b924ec20418544ff28e1fb89a4c27679a40da811b
jinsu@jinsu:~$
# 업데이트 상태 확인
kubectl rollout status deployment mynginx-deploy
jinsu@jinsu:~$ kubectl rollout status deployment mynginx-deploy
deployment "mynginx-deploy" successfully rolled out
jinsu@jinsu:~$
# 업데이트 히스토리 확인
kubectl rollout history deployment mynginx-deploy
jinsu@jinsu:~$ kubectl rollout history deployment mynginx-deploy
deployment.apps/mynginx-deploy
REVISION CHANGE-CAUSE
1 <none>
2 kubectl set image deployment mynginx-deploy nginx=nginx:1.9.1 --record=true
jinsu@jinsu:~$
# deployment 세부정보 가져오기
jinsu@jinsu:~$ kubectl describe deployment mynginx-deploy
Name: mynginx-deploy
Namespace: default
CreationTimestamp: Sun, 14 Aug 2022 08:24:38 +0000
Labels: <none>
Annotations: deployment.kubernetes.io/revision: 2
kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{},"name":"mynginx-deploy","namespace":"default"},"spec":{"replicas"...
kubernetes.io/change-cause: kubectl set image deployment mynginx-deploy nginx=nginx:1.9.1 --record=true
Selector: app=nginx
Replicas: 5 desired | 5 updated | 5 total | 5 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=nginx
Containers:
nginx:
Image: nginx:1.9.1
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
OldReplicaSets: <none>
NewReplicaSet: mynginx-deploy-7f9686c8fd (5/5 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 14m deployment-controller Scaled up replica set mynginx-deploy-55fbd9fd6d to 5
Normal ScalingReplicaSet 5m43s deployment-controller Scaled up replica set mynginx-deploy-7f9686c8fd to 2
Normal ScalingReplicaSet 5m43s deployment-controller Scaled down replica set mynginx-deploy-55fbd9fd6d to 4
Normal ScalingReplicaSet 5m43s deployment-controller Scaled up replica set mynginx-deploy-7f9686c8fd to 3
Normal ScalingReplicaSet 5m30s deployment-controller Scaled down replica set mynginx-deploy-55fbd9fd6d to 3
Normal ScalingReplicaSet 5m30s deployment-controller Scaled up replica set mynginx-deploy-7f9686c8fd to 4
Normal ScalingReplicaSet 5m28s deployment-controller Scaled down replica set mynginx-deploy-55fbd9fd6d to 2
Normal ScalingReplicaSet 5m28s deployment-controller Scaled up replica set mynginx-deploy-7f9686c8fd to 5
Normal ScalingReplicaSet 5m26s deployment-controller Scaled down replica set mynginx-deploy-55fbd9fd6d to 1
Normal ScalingReplicaSet 5m26s deployment-controller (combined from similar events): Scaled down replica set mynginx-deploy-55fbd9fd6d to 0
jinsu@jinsu:~$
# 롤백 기능
kubectl rollout undo deployment mynginx-deploy
# 해당 상태에서
jinsu@jinsu:~$ kubectl get pod
NAME READY STATUS RESTARTS AGE
mynginx-deploy-7f9686c8fd-fbtxv 1/1 Running 0 9m20s
mynginx-deploy-7f9686c8fd-h7pms 1/1 Running 0 9m7s
mynginx-deploy-7f9686c8fd-4q92b 1/1 Running 0 9m5s
mynginx-deploy-7f9686c8fd-vq8lt 1/1 Running 0 9m20s
mynginx-deploy-69d67779d8-zq7bz 0/1 ErrImagePull 0 45s
mynginx-deploy-69d67779d8-lxkhm 0/1 ErrImagePull 0 45s
mynginx-deploy-69d67779d8-jhvcm 0/1 ErrImagePull 0 45s
jinsu@jinsu:~$
# 롤백
jinsu@jinsu:~$ kubectl rollout undo deployment mynginx-deploy
deployment.apps/mynginx-deploy rolled back
jinsu@jinsu:~$
jinsu@jinsu:~$ kubectl get pod
NAME READY STATUS RESTARTS AGE
mynginx-deploy-7f9686c8fd-fbtxv 1/1 Running 0 13m
mynginx-deploy-7f9686c8fd-h7pms 1/1 Running 0 13m
mynginx-deploy-7f9686c8fd-4q92b 1/1 Running 0 13m
mynginx-deploy-7f9686c8fd-vq8lt 1/1 Running 0 13m
mynginx-deploy-7f9686c8fd-vn2gf 1/1 Running 0 13s
jinsu@jinsu:~$
# scaling 기능
kubectl scale deployment mynginx-deploy --replicas=5 --record
jinsu@jinsu:~$ kubectl scale deployment mynginx-deploy --replicas=10 --record
deployment.apps/mynginx-deploy scaled
jinsu@jinsu:~$
# pod가 10개로 생성
jinsu@jinsu:~$ kubectl get pod
NAME READY STATUS RESTARTS AGE
mynginx-deploy-7f9686c8fd-fbtxv 1/1 Running 0 15m
mynginx-deploy-7f9686c8fd-h7pms 1/1 Running 0 15m
mynginx-deploy-7f9686c8fd-4q92b 1/1 Running 0 15m
mynginx-deploy-7f9686c8fd-vq8lt 1/1 Running 0 15m
mynginx-deploy-7f9686c8fd-vn2gf 1/1 Running 0 2m11s
mynginx-deploy-7f9686c8fd-jxjrc 1/1 Running 0 15s
mynginx-deploy-7f9686c8fd-xv69q 1/1 Running 0 15s
mynginx-deploy-7f9686c8fd-r2dzt 1/1 Running 0 15s
mynginx-deploy-7f9686c8fd-vvvfp 1/1 Running 0 15s
mynginx-deploy-7f9686c8fd-576xz 1/1 Running 0 15s
jinsu@jinsu:~$
# 레플리카셋 확인
jinsu@jinsu:~$ kubectl get rs
NAME DESIRED CURRENT READY AGE
mynginx-deploy-55fbd9fd6d 0 0 0 25m
mynginx-deploy-69d67779d8 0 0 0 7m27s
mynginx-deploy-7f9686c8fd 10 10 10 16m
jinsu@jinsu:~$
deployment 삭제
# 현재 동작중인 deployment
jinsu@jinsu:~$ kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
mynginx-deploy 5/5 5 4 25s
jinsu@jinsu:~$
# deployment 삭제
jinsu@jinsu:~$ kubectl delete deploy mynginx-deploy
deployment.apps "mynginx-deploy" deleted
jinsu@jinsu:~$
# 삭제되는 pod들
jinsu@jinsu:~$ kubectl get pod
NAME READY STATUS RESTARTS AGE
mynginx-deploy-7f9686c8fd-jxjrc 1/1 Terminating 0 2m23s
mynginx-deploy-7f9686c8fd-vq8lt 1/1 Terminating 0 17m
mynginx-deploy-7f9686c8fd-576xz 1/1 Terminating 0 2m23s
mynginx-deploy-7f9686c8fd-xv69q 1/1 Terminating 0 2m23s
mynginx-deploy-7f9686c8fd-vvvfp 1/1 Terminating 0 2m23s
jinsu@jinsu:~$
한번에 원하는 이미지로 deployment 생성
# 원하는 정보를 한번에 생성
kubectl create deployment httpd-frontend --image=httpd:2.4-alpine --replicas=3
참고자료
https://kubernetes.io/ko/docs/concepts/workloads/controllers/deployment/
'Kubernetes' 카테고리의 다른 글
[K8S] 쿠버네티스 - 잡(Job) 기능 (0) | 2022.08.14 |
---|---|
[K8S] 쿠버네티스 - 데몬셋(DaemonSet) 기능 (0) | 2022.08.14 |
[K8S] 쿠버네티스 - 레플리카셋(replicaset) 기능 (0) | 2022.08.14 |
[K8S] 쿠버네티스 - 서비스(Service) 기능 (0) | 2022.08.14 |
[K8S] 쿠버네티스 - Health Check 기능 (0) | 2022.08.14 |