1.創建 Deployment
root@k8-deploy:~/k8s-yaml/controllers/deployments# vim nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
在該例中:
- 創建名為 nginx-deployment(由 .metadata.name 字段標明)的 Deployment。
- 該 Deployment 創建三個(由 replicas 字段標明)Pod 副本。
- selector 字段定義 Deployment 如何查找要管理的 Pods。 在這里,你選擇在 Pod 模板中定義的標簽(app: nginx), 在 API 版本 apps/v1 中,Deployment 標簽選擇算符在創建后是不可變的。
說明:
- spec.selector.matchLabels 字段是 {key,value} 鍵值對映射。 在 matchLabels 映射中的每個 {key,value} 映射等效於 matchExpressions 中的一個元素, 即其 key 字段是 “key”,operator 為 “In”,values 數組僅包含 “value”。 在 matchLabels 和 matchExpressions 中給出的所有條件都必須滿足才能匹配。
template 字段包含以下子字段:
- Pod 被使用 labels 字段打上 app: nginx 標簽。
- Pod 模板規約(即 .template.spec 字段)指示 Pods 運行一個 nginx 容器, 該容器運行版本為 1.14.2 的 nginx Docker Hub鏡像。
- 創建一個容器並使用 name 字段將其命名為 nginx。
通過運行以下命令創建 Deployment
root@k8-deploy:~/k8s-yaml/controllers/deployments# kubectl apply -f nginx-deployment.yaml
deployment.apps/nginx-deployment created
說明: 你可以設置 --record 標志將所執行的命令寫入資源注解中。 這對於以后的檢查是有用的。例如,要查看針對每個 Deployment 修訂版本所執行過的命令。
檢查 Deployment 是否已創建
root@k8-deploy:~/k8s-yaml/controllers/deployments# kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 0/3 3 0 9s
在檢查集群中的 Deployment 時,所顯示的字段有:
- NAME 列出了集群中 Deployment 的名稱。
- READY 顯示應用程序的可用的 副本 數。顯示的模式是“就緒個數/期望個數”。
- UP-TO-DATE 顯示為了達到期望狀態已經更新的副本數。
- AVAILABLE 顯示應用可供用戶使用的副本數。
- AGE 顯示應用程序運行的時間。
- 請注意期望副本數是根據 .spec.replicas 字段設置 3。
幾秒鍾后再次運行 kubectl get deployments
root@k8-deploy:~/k8s-yaml/controllers/deployments# kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 3/3 3 3 45s
要查看 Deployment 創建的 ReplicaSet(rs)
root@k8-deploy:~/k8s-yaml/controllers/deployments# kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deployment-66b6c48dd5 3 3 3 11m
ReplicaSet 輸出中包含以下字段:
NAME 列出名字空間中 ReplicaSet 的名稱;
- DESIRED 顯示應用的期望副本個數,即在創建 Deployment 時所定義的值。 此為期望狀態;
- CURRENT 顯示當前運行狀態中的副本個數;
- READY 顯示應用中有多少副本可以為用戶提供服務;
- AGE 顯示應用已經運行的時間長度。
- 注意 ReplicaSet 的名稱始終被格式化為[Deployment名稱]-[隨機字符串]。 其中的隨機字符串是使用 pod-template-hash 作為種子隨機生成的。
查看每個 Pod 自動生成的標簽
root@k8-deploy:~/k8s-yaml/controllers/deployments# kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-deployment-66b6c48dd5-hdxlg 1/1 Running 0 44m app=nginx,pod-template-hash=66b6c48dd5
nginx-deployment-66b6c48dd5-hnmgw 1/1 Running 0 44m app=nginx,pod-template-hash=66b6c48dd5
nginx-deployment-66b6c48dd5-p28z2 1/1 Running 0 44m app=nginx,pod-template-hash=66b6c48dd5
說明:
- 你必須在 Deployment 中指定適當的選擇算符和 Pod 模板標簽(在本例中為 app: nginx)。 標簽或者選擇算符不要與其他控制器(包括其他 Deployment 和 StatefulSet)重疊。 Kubernetes 不會阻止你這樣做,但是如果多個控制器具有重疊的選擇算符,它們可能會發生沖突 執行難以預料的操作。
- Deployment 控制器將 pod-template-hash 標簽添加到 Deployment 所創建或收留的 每個 ReplicaSet 。
此標簽可確保 Deployment 的子 ReplicaSets 不重疊。 標簽是通過對 ReplicaSet 的 PodTemplate 進行哈希處理。 所生成的哈希值被添加到 ReplicaSet 選擇算符、Pod 模板標簽,並存在於在 ReplicaSet 可能擁有的任何現有 Pod 中。
2.更新 Deployment
說明:
- 僅當 Deployment Pod 模板(即 .spec.template)發生改變時,例如模板的標簽或容器鏡像被更新, 才會觸發 Deployment 上線。 其他更新(如對 Deployment 執行擴縮容的操作)不會觸發上線動作。
更新nginx Pod的鏡像版本,比如從nginx:1.14.2升級到nginx:1.16.1
root@k8-deploy:~/k8s-yaml/controllers/deployments# kubectl set image deployment/nginx-deployment nginx=nginx:1.16.1 --record
deployment.apps/nginx-deployment image updated
監控更新過程
root@k8-deploy:~/k8s-yaml/controllers/deployments# kubectl rollout status deployment/nginx-deployment
Waiting for deployment "nginx-deployment" rollout to finish: 2 out of 3 new replicas have been updated...
Waiting for deployment "nginx-deployment" rollout to finish: 2 out of 3 new replicas have been updated...
Waiting for deployment "nginx-deployment" rollout to finish: 2 out of 3 new replicas have been updated...
Waiting for deployment "nginx-deployment" rollout to finish: 1 old replicas are pending termination...
Waiting for deployment "nginx-deployment" rollout to finish: 1 old replicas are pending termination...
deployment "nginx-deployment" successfully rolled out
在上線成功后,查看deployment
root@k8-deploy:~/k8s-yaml/controllers/deployments# kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 3/3 3 3 72m
查看 Deployment控制的ReplicaSet
可以看出Deployment通過創建新的 ReplicaSet 並將其擴容到 3 個副本並將舊 ReplicaSet 縮容到 0 個副本完成了 Pod 的更新操作
root@k8-deploy:~/k8s-yaml/controllers/deployments# kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deployment-559d658b74 3 3 3 5m
nginx-deployment-66b6c48dd5 0 0 0 74m
查看更新后的pod
root@k8-deploy:~/k8s-yaml/controllers/deployments# kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-deployment-559d658b74-4npbn 1/1 Running 0 6m29s app=nginx,pod-template-hash=559d658b74
nginx-deployment-559d658b74-4wqbp 1/1 Running 0 6m17s app=nginx,pod-template-hash=559d658b74
nginx-deployment-559d658b74-9wrpj 1/1 Running 0 6m41s app=nginx,pod-template-hash=559d658b74
說明:
- Deployment 可確保在更新時僅關閉一定數量的 Pod。默認情況下,它確保至少所需 Pods 75% 處於運行狀態(最大不可用比例為 25%)。
- Deployment 還確保僅所創建 Pod 數量只可能比期望 Pods 數高一點點。 默認情況下,它可確保啟動的 Pod 個數比期望個數最多多出 25%(最大峰值 25%)。
獲取 Deployment 的更多信息
root@k8-deploy:~/k8s-yaml/controllers/deployments# kubectl describe deployments
Name: nginx-deployment
Namespace: default
CreationTimestamp: Wed, 29 Sep 2021 16:01:55 +0800
Labels: app=nginx
Annotations: deployment.kubernetes.io/revision: 2
kubernetes.io/change-cause: kubectl set image deployment/nginx-deployment nginx=nginx:1.16.1 --record=true
Selector: app=nginx
Replicas: 3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=nginx
Containers:
nginx:
Image: nginx:1.16.1
Port: 80/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
OldReplicaSets: <none>
NewReplicaSet: nginx-deployment-559d658b74 (3/3 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 9m11s deployment-controller Scaled up replica set nginx-deployment-559d658b74 to 1
Normal ScalingReplicaSet 8m59s deployment-controller Scaled down replica set nginx-deployment-66b6c48dd5 to 2
Normal ScalingReplicaSet 8m59s deployment-controller Scaled up replica set nginx-deployment-559d658b74 to 2
Normal ScalingReplicaSet 8m47s deployment-controller Scaled down replica set nginx-deployment-66b6c48dd5 to 1
Normal ScalingReplicaSet 8m47s deployment-controller Scaled up replica set nginx-deployment-559d658b74 to 3
Normal ScalingReplicaSet 8m25s deployment-controller Scaled down replica set nginx-deployment-66b6c48dd5 to 0
3.回滾 Deployment
說明:
- Deployment 被觸發上線時,系統就會創建 Deployment 的新的修訂版本。 這意味着僅當 Deployment 的 Pod 模板(.spec.template)發生更改時,才會創建新修訂版本 -- 例如,模板的標簽或容器鏡像發生變化。 其他更新,如 Deployment 的擴縮容操作不會創建 Deployment 修訂版本。 這是為了方便同時執行手動縮放或自動縮放。 換言之,當你回滾到較早的修訂版本時,只有 Deployment 的 Pod 模板部分會被回滾。
查看更新的歷史記錄
root@k8-deploy:~/k8s-yaml/controllers/deployments# kubectl rollout history deployment.v1.apps/nginx-deployment
deployment.apps/nginx-deployment
REVISION CHANGE-CAUSE
1 <none>
2 kubectl set image deployment/nginx-deployment nginx=nginx:1.16.1 --record=true
查看某個版本的更詳細的更加記錄信息
root@k8-deploy:~/k8s-yaml/controllers/deployments# kubectl rollout history deployment.v1.apps/nginx-deployment --revision=2
deployment.apps/nginx-deployment with revision #2
Pod Template:
Labels: app=nginx
pod-template-hash=559d658b74
Annotations: kubernetes.io/change-cause: kubectl set image deployment/nginx-deployment nginx=nginx:1.16.1 --record=true
Containers:
nginx:
Image: nginx:1.16.1
Port: 80/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
回滾到之前的版本
kubectl rollout undo deployment.v1.apps/nginx-deployment --to-revision=1
deployment.apps/nginx-deployment rolled back
查看回滾后的deployment
root@k8-deploy:~/k8s-yaml/controllers/deployments# kubectl get deployment nginx-deployment
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 3/3 3 3 91m
查看deploymne的詳細信息
root@k8-deploy:~/k8s-yaml/controllers/deployments# kubectl describe deployment nginx-deployment
Name: nginx-deployment
Namespace: default
CreationTimestamp: Wed, 29 Sep 2021 16:01:55 +0800
Labels: app=nginx
Annotations: deployment.kubernetes.io/revision: 3
Selector: app=nginx
Replicas: 3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=nginx
Containers:
nginx:
Image: nginx:1.14.2
Port: 80/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
OldReplicaSets: <none>
NewReplicaSet: nginx-deployment-66b6c48dd5 (3/3 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 22m deployment-controller Scaled up replica set nginx-deployment-559d658b74 to 1
Normal ScalingReplicaSet 22m deployment-controller Scaled down replica set nginx-deployment-66b6c48dd5 to 2
Normal ScalingReplicaSet 22m deployment-controller Scaled up replica set nginx-deployment-559d658b74 to 2
Normal ScalingReplicaSet 21m deployment-controller Scaled down replica set nginx-deployment-66b6c48dd5 to 1
Normal ScalingReplicaSet 21m deployment-controller Scaled up replica set nginx-deployment-559d658b74 to 3
Normal ScalingReplicaSet 21m deployment-controller Scaled down replica set nginx-deployment-66b6c48dd5 to 0
Normal ScalingReplicaSet 17s deployment-controller Scaled up replica set nginx-deployment-66b6c48dd5 to 1
Normal ScalingReplicaSet 15s deployment-controller Scaled down replica set nginx-deployment-559d658b74 to 2
Normal ScalingReplicaSet 15s deployment-controller Scaled up replica set nginx-deployment-66b6c48dd5 to 2
Normal ScalingReplicaSet 13s (x2 over 91m) deployment-controller Scaled up replica set nginx-deployment-66b6c48dd5 to 3
Normal ScalingReplicaSet 13s deployment-controller Scaled down replica set nginx-deployment-559d658b74 to 1
Normal ScalingReplicaSet 11s deployment-controller Scaled down replica set nginx-deployment-559d658b74 to 0
4.擴縮容Deployment
root@k8-deploy:~# kubectl scale deployment.v1.apps/nginx-deployment --replicas=10
deployment.apps/nginx-deployment scaled
root@k8-deploy:~# kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 10/10 10 10 97m
root@k8-deploy:~# kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deployment-559d658b74 0 0 0 27m
nginx-deployment-66b6c48dd5 10 10 10 97m
root@k8-deploy:~# kubectl get pod -o wide --show-labels
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES LABELS
nginx-deployment-66b6c48dd5-7tl82 1/1 Running 0 6m33s 10.100.112.5 192.168.2.19 <none> <none> app=nginx,pod-template-hash=66b6c48dd5
nginx-deployment-66b6c48dd5-b8wvd 1/1 Running 0 69s 10.100.172.196 192.168.2.17 <none> <none> app=nginx,pod-template-hash=66b6c48dd5
nginx-deployment-66b6c48dd5-cqmzm 1/1 Running 0 6m31s 10.100.112.6 192.168.2.19 <none> <none> app=nginx,pod-template-hash=66b6c48dd5
nginx-deployment-66b6c48dd5-h9bhf 1/1 Running 0 69s 10.100.224.71 192.168.2.18 <none> <none> app=nginx,pod-template-hash=66b6c48dd5
nginx-deployment-66b6c48dd5-jzhkt 1/1 Running 0 69s 10.100.224.72 192.168.2.18 <none> <none> app=nginx,pod-template-hash=66b6c48dd5
nginx-deployment-66b6c48dd5-kdvss 1/1 Running 0 6m29s 10.100.112.7 192.168.2.19 <none> <none> app=nginx,pod-template-hash=66b6c48dd5
nginx-deployment-66b6c48dd5-kxsvq 1/1 Running 0 69s 10.100.172.197 192.168.2.17 <none> <none> app=nginx,pod-template-hash=66b6c48dd5
nginx-deployment-66b6c48dd5-tlckf 1/1 Running 0 69s 10.100.112.8 192.168.2.19 <none> <none> app=nginx,pod-template-hash=66b6c48dd5
nginx-deployment-66b6c48dd5-wfvmh 1/1 Running 0 69s 10.100.224.73 192.168.2.18 <none> <none> app=nginx,pod-template-hash=66b6c48dd5
nginx-deployment-66b6c48dd5-zmsfm 1/1 Running 0 69s 10.100.112.9 192.168.2.19 <none> <none> app=nginx,pod-template-hash=66b6c48dd5
暫停、恢復 Deployment
你可以在觸發一個或多個更新之前暫停 Deployment,然后再恢復其執行。
這樣做使得你能夠在暫停和恢復執行之間應用多個修補程序,而不會觸發不必要的上線操作。
查看現有的deplymnet集群 rs
root@k8-deploy:~# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 3/3 3 3 4s
root@k8-deploy:~# kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deployment-66b6c48dd5 3 3 3 7s
執行暫停
root@k8-deploy:~# kubectl rollout pause deployment.v1.apps/nginx-deployment
deployment.apps/nginx-deployment paused
對deploymnet執行多項修改中的一項,比如修改pod鏡像版本
root@k8-deploy:~# kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.17.10
deployment.apps/nginx-deployment image updated
在暫停期間對deploymnet的修改不會立即觸發更新
root@k8-deploy:~# kubectl rollout history deployment.v1.apps/nginx-deployment
deployment.apps/nginx-deployment
REVISION CHANGE-CAUSE
1 <none>
繼續對deploymnet鏡像修改,比如對pod使用的資源進行限制
root@k8-deploy:~# kubectl set resources deployment.v1.apps/nginx-deployment -c=nginx --limits=cpu=200m,memory=512Mi
deployment.apps/nginx-deployment resource requirements updated
# 此時deployment仍然不會觸發更新
root@k8-deploy:~# kubectl rollout history deployment.v1.apps/nginx-deployment
deployment.apps/nginx-deployment
REVISION CHANGE-CAUSE
1 <none
恢復 Deployment 執行
root@k8-deploy:~# kubectl rollout resume deployment.v1.apps/nginx-deployment
deployment.apps/nginx-deployment resumed
觀察新的 ReplicaSet 的創建過程,其中包含了所應用的所有更新
root@k8-deploy:~# kubectl get rs -w
NAME DESIRED CURRENT READY AGE
nginx-deployment-66b6c48dd5 2 2 2 6m26s
nginx-deployment-fcfbff66c 2 2 1 6s
nginx-deployment-fcfbff66c 2 2 2 16s
nginx-deployment-66b6c48dd5 1 2 2 6m36s
nginx-deployment-fcfbff66c 3 2 2 16s
nginx-deployment-66b6c48dd5 1 2 2 6m36s
nginx-deployment-fcfbff66c 3 2 2 16s
nginx-deployment-fcfbff66c 3 3 2 16s
nginx-deployment-66b6c48dd5 1 1 1 6m36s
nginx-deployment-fcfbff66c 3 3 3 28s
nginx-deployment-66b6c48dd5 0 1 1 6m48s
nginx-deployment-66b6c48dd5 0 1 1 6m48s
nginx-deployment-66b6c48dd5 0 0 0 6m48s
root@k8-deploy:~# kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deployment-66b6c48dd5 0 0 0 7m55s
nginx-deployment-fcfbff66c 3 3 3 95s
root@k8-deploy:~# kubectl rollout history deployment.v1.apps/nginx-deployment
deployment.apps/nginx-deployment
REVISION CHANGE-CAUSE
1 <none>
2 <none>