Kubernetes Deployment 之擴縮容與滾動更新
Deployment 擴縮容
擴縮容非常簡單,我們可以直接調整 replica 副本數目,然后 kubectl apply
指定進行動態更新。下面將nginx-deployment
動態改為 1 個 Pod 和 3 個 Pod 的操作
apiVersion: apps/v1
kind: Deployment
metadata:name: deployment-nginxnamespace: defaultlabels:app: deployment-nginx
spec:replicas: 2 # 將此處動態改為 1 或者 3selector:matchLabels:app: pod-nginxtemplate:metadata:labels:app: pod-nginxspec:containers:- name: nginximage: docker.io/k8s-test:v1.0imagePullPolicy: IfNotPresentports:- containerPort: 80
root@k8s-master1:~# kubectl apply -f deploy-nginx.yaml
deployment.apps/deployment-nginx configured
root@k8s-master1:~# kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
deployment-nginx 1/1 1 1 17h
root@k8s-master1:~# kubectl apply -f deploy-nginx.yaml
deployment.apps/deployment-nginx configured
root@k8s-master1:~# kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
deployment-nginx 3/3 3 3 17h# 它也會識別原來的 Pod 有沒有被更新,如果沒有被更新,它仍然會繼續被保留運行
root@k8s-master1:~# kubectl get pods -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
deployment-nginx-6977747dd9-knx9r 1/1 Running 0 31s 10.244.194.126 k8s-worker1 <none> <none>
deployment-nginx-6977747dd9-nqxgd 1/1 Running 0 31s 10.244.194.125 k8s-worker1 <none> <none>
deployment-nginx-6977747dd9-sz42q 1/1 Running 1 (34m ago) 17h 10.244.126.24 k8s-worker2 <none> <none>
Deployment 滾動更新策略
Deployment 更新策略分為兩種,分別為Recreate
和RollingUpdate
。Recreate
是將所有 Pod 全部殺死,然后啟動新版本,這是一個極其危險的行為,幾乎不被使用。滾動更新是指,新增一定數量的 Pod 后,再殺死一定的數量的 Pod。Deployment 默認使用滾動更新策略。
實現滾動更新需要設置MaxSurge
最大 Pod 新增數量和MaxUnavailable
最大 Pod 不可用數據數目。它們可以設置成整數或者百分比,且兩者不能同時為0,不然無法根本更新。以副本數 3 為例,如果我們 MaxSurge
設置為 10%,那么我們新增個數為 0.3,這里需要向上取整,即個數為1;同理我們 MaxUnavailable
設置為 10%,這里我們允許不可用的個數也為 0.3,這里要向下取整為 0;最終我們的更新策略是要等到 4 個 Pod 完全在運行狀態,滾動更新才回去殺死 1 個老 Pod。
Deployment 滾動更新使用
-
我們先將
k8s-test:v1.0
鏡像標記為k8s-test:v1.1
root@k8s-worker1:~# ctr -n k8s.io image tag docker.io/library/k8s-test:v1.0 docker.io/library/k8s-test:v1.1 docker.io/library/k8s-test:v1.1 root@k8s-worker2:~# ctr -n k8s.io image tag docker.io/library/k8s-test:v1.0 docker.io/library/k8s-test:v1.1 docker.io/library/k8s-test:v1.1
-
修改
yaml
鏡像版本號和更新策略apiVersion: apps/v1 kind: Deployment metadata:name: deployment-nginxnamespace: defaultlabels:app: deployment-nginx spec:strategy:rollingUpdate:maxSurge: 10%maxUnavailable: 10%replicas: 2selector:matchLabels:app: pod-nginxtemplate:metadata:labels:app: pod-nginxspec:containers:- name: nginximage: docker.io/k8s-test:v1.1imagePullPolicy: IfNotPresentports:- containerPort: 80
-
執行如下指令開啟 Pods 監聽
kubectl get pods -owide -w
-
更新過程如下,舊的 Pod 會先被標記,但不是真的被終止
root@k8s-master1:~# kubectl get pods -owide -w NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES deployment-nginx-6977747dd9-knx9r 1/1 Running 0 30m 10.244.194.126 k8s-worker1 <none> <none> deployment-nginx-6977747dd9-nqxgd 1/1 Running 0 30m 10.244.194.125 k8s-worker1 <none> <none> deployment-nginx-6977747dd9-sz42q 1/1 Running 1 (63m ago) 17h 10.244.126.24 k8s-worker2 <none> <none> deployment-nginx-6977747dd9-nqxgd 1/1 Terminating 0 35m 10.244.194.125 k8s-worker1 <none> <none> deployment-nginx-6c94d644bd-ft9s6 0/1 Pending 0 0s <none> <none> <none> <none> deployment-nginx-6c94d644bd-ft9s6 0/1 Pending 0 0s <none> k8s-worker2 <none> <none> deployment-nginx-6c94d644bd-ft9s6 0/1 ContainerCreating 0 0s <none> k8s-worker2 <none> <none> deployment-nginx-6977747dd9-nqxgd 1/1 Terminating 0 35m 10.244.194.125 k8s-worker1 <none> <none> deployment-nginx-6977747dd9-nqxgd 0/1 Terminating 0 35m <none> k8s-worker1 <none> <none> deployment-nginx-6c94d644bd-ft9s6 0/1 ContainerCreating 0 0s <none> k8s-worker2 <none> <none> deployment-nginx-6977747dd9-nqxgd 0/1 Terminating 0 35m 10.244.194.125 k8s-worker1 <none> <none> deployment-nginx-6c94d644bd-ft9s6 1/1 Running 0 1s 10.244.126.26 k8s-worker2 <none> <none> deployment-nginx-6977747dd9-nqxgd 0/1 Terminating 0 35m 10.244.194.125 k8s-worker1 <none> <none> deployment-nginx-6977747dd9-nqxgd 0/1 Terminating 0 35m 10.244.194.125 k8s-worker1 <none> <none> deployment-nginx-6977747dd9-sz42q 1/1 Terminating 1 (69m ago) 17h 10.244.126.24 k8s-worker2 <none> <none> deployment-nginx-6c94d644bd-sj4hv 0/1 Pending 0 0s <none> <none> <none> <none> deployment-nginx-6c94d644bd-sj4hv 0/1 Pending 0 0s <none> k8s-worker1 <none> <none> deployment-nginx-6c94d644bd-sj4hv 0/1 ContainerCreating 0 0s <none> k8s-worker1 <none> <none> deployment-nginx-6977747dd9-sz42q 1/1 Terminating 1 (69m ago) 17h 10.244.126.24 k8s-worker2 <none> <none> deployment-nginx-6977747dd9-sz42q 0/1 Terminating 1 (69m ago) 17h <none> k8s-worker2 <none> <none> deployment-nginx-6c94d644bd-sj4hv 0/1 ContainerCreating 0 0s <none> k8s-worker1 <none> <none> deployment-nginx-6c94d644bd-sj4hv 1/1 Running 0 1s 10.244.194.127 k8s-worker1 <none> <none> deployment-nginx-6977747dd9-sz42q 0/1 Terminating 1 (69m ago) 17h 10.244.126.24 k8s-worker2 <none> <none> deployment-nginx-6977747dd9-knx9r 1/1 Terminating 0 35m 10.244.194.126 k8s-worker1 <none> <none> deployment-nginx-6977747dd9-sz42q 0/1 Terminating 1 (69m ago) 17h 10.244.126.24 k8s-worker2 <none> <none> deployment-nginx-6977747dd9-sz42q 0/1 Terminating 1 (69m ago) 17h 10.244.126.24 k8s-worker2 <none> <none> deployment-nginx-6977747dd9-knx9r 1/1 Terminating 0 35m 10.244.194.126 k8s-worker1 <none> <none> deployment-nginx-6977747dd9-knx9r 0/1 Terminating 0 35m <none> k8s-worker1 <none> <none> deployment-nginx-6977747dd9-knx9r 0/1 Terminating 0 35m 10.244.194.126 k8s-worker1 <none> <none> deployment-nginx-6977747dd9-knx9r 0/1 Terminating 0 35m 10.244.194.126 k8s-worker1 <none> <none> deployment-nginx-6977747dd9-knx9r 0/1 Terminating 0 35m 10.244.194.126 k8s-worker1 <none> <none>
-
查看更新后的結果
root@k8s-master1:~# kubectl get pods -owide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES deployment-nginx-6c94d644bd-ft9s6 1/1 Running 0 4m55s 10.244.126.26 k8s-worker2 <none> <none> deployment-nginx-6c94d644bd-sj4hv 1/1 Running 0 4m54s 10.244.194.127 k8s-worker1 <none> <none> root@k8s-master1:~# kubectl get deploy NAME READY UP-TO-DATE AVAILABLE AGE deployment-nginx 2/2 2 2 17h root@k8s-master1:~# kubectl get rs NAME DESIRED CURRENT READY AGE deployment-nginx-6977747dd9 0 0 0 17h deployment-nginx-6c94d644bd 2 2 2 6m1s