kubernetes Deployment 學習
kubernetes-Deployment 學習
雖然ReplicaSet可以確保在任何給定時間執行的Pod副本達到指定的數量,但是Deployment(部署)是一個更高階的概念,它管理ReplicaSet併為Pod和ReplicaSet提供宣告性更新以及許多其他有用的功能,所以建議在實際使用中,使用Deployment代替ReplicaSet。
如果在Deployment物件中描述了所需的狀態,Deployment控制器就會以可控制的速率將實際狀態更改為期望狀態。也可以在Deployment中建立新的ReplicaSet,或者刪除現有的Deployment並使用新的Deployment部署所用的資源。
建立Deployment
建立一個Deployment檔案,並命名為dc-nginx.yaml,用於部署三個Nginx Pod
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 ports: - containerPort: 80Copy to clipboardErrorCopied
示例解析:
- nginx-deployment:Deployment的名稱。
- replicas: 建立Pod的副本數。
- selector:定義Deployment如何找到要管理的Pod,與template的label(標籤)對應。
- template欄位包含以下欄位:
- app: nginx使用label(標籤)標記Pod
- spec:表示Pod執行一個名字為nginx的容器。
- image:執行此Pod使用的映象
- Port:容器用於傳送和接收流量的埠
使用kubectl create建立此Deployment
[root@instance-gvpb80ao yaml]# kubectl create -f deployment.yaml deployment.apps/nginx-deployment createdCopy to clipboardErrorCopied
檢視Deployment
[root@instance-gvpb80ao yaml]# kubectl get -f deployment.yaml
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 1/3 3 1 6sCopy to clipboardErrorCopied
檢視部署資訊
[root@instance-gvpb80ao yaml]# kubectl describe deployments.apps nginx-deployment
Name: nginx-deployment
Namespace: default
CreationTimestamp: Fri, 18 Sep 2020 23:04:12 +0800
Labels: app=nginx
Annotations: deployment.kubernetes.io/revision: 1
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
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-7848d4b86f (3/3 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 2m2s deployment-controller Scaled up replica set nginx-deployment-7848d4b86f to 3 Copy to clipboardErrorCopied
檢視Deployment建立的ReplicaSet
[root@instance-gvpb80ao yaml]# kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deployment-7848d4b86f 3 3 3 4m7sCopy to clipboardErrorCopied
更新
一般對應用程序升級或者版本迭代時,會通過Deployment對Pod進行滾動更新。
設定映象
[root@instance-gvpb80ao yaml]# kubectl set image deployment nginx-deployment nginx=nginx:1.18.0
deployment.apps/nginx-deployment image updatedCopy to clipboardErrorCopied
修改映象
[root@instance-gvpb80ao yaml]# kubectl edit deployments.apps nginx-deployment
deployment.apps/nginx-deployment editedCopy to clipboardErrorCopied
檢視更新狀態
[root@instance-gvpb80ao yaml]# kubectl set image deployment nginx-deployment nginx=nginx:1.16.0
deployment.apps/nginx-deployment image updated
[root@instance-gvpb80ao yaml]# kubectl rollout status deployment nginx-deployment
Waiting for deployment "nginx-deployment" rollout to finish: 1 out of 3 new replicas have been updated...
Waiting for deployment "nginx-deployment" rollout to finish: 1 out of 3 new replicas have been updated...
Waiting for deployment "nginx-deployment" rollout to finish: 1 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: 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 outCopy to clipboardErrorCopied
檢視Replication
[root@instance-gvpb80ao yaml]# kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deployment-55d6b67f5b 0 0 0 2m42s
nginx-deployment-6b658bf589 0 0 0 5m12s
nginx-deployment-7848d4b86f 0 0 0 12m
nginx-deployment-dc8c8775 3 3 3 83sCopy to clipboardErrorCopied
檢視Deployment部署狀態
[root@instance-gvpb80ao yaml]# kubectl describe deployments.apps
Name: nginx-deployment
Namespace: default
CreationTimestamp: Fri, 18 Sep 2020 23:04:12 +0800
Labels: app=nginx
Annotations: deployment.kubernetes.io/revision: 4
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.0
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-dc8c8775 (3/3 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 15m deployment-controller Scaled up replica set nginx-deployment-7848d4b86f to 3
Normal ScalingReplicaSet 8m22s deployment-controller Scaled up replica set nginx-deployment-6b658bf589 to 1
Normal ScalingReplicaSet 8m2s deployment-controller Scaled down replica set nginx-deployment-7848d4b86f to 2
Normal ScalingReplicaSet 8m2s deployment-controller Scaled up replica set nginx-deployment-6b658bf589 to 2
Normal ScalingReplicaSet 7m59s deployment-controller Scaled down replica set nginx-deployment-7848d4b86f to 1
Normal ScalingReplicaSet 7m59s deployment-controller Scaled up replica set nginx-deployment-6b658bf589 to 3
Normal ScalingReplicaSet 7m53s deployment-controller Scaled down replica set nginx-deployment-7848d4b86f to 0
Normal ScalingReplicaSet 5m52s deployment-controller Scaled up replica set nginx-deployment-55d6b67f5b to 1
Normal ScalingReplicaSet 5m19s deployment-controller Scaled down replica set nginx-deployment-6b658bf589 to 2
Normal ScalingReplicaSet 3m49s (x10 over 5m19s) deployment-controller (combined from similar events): Scaled down replica set nginx-deployment-55d6b67f5b to 0
Name: test
Namespace: default
CreationTimestamp: Wed, 16 Sep 2020 16:43:01 +0800
Labels: <none>
Annotations: deployment.kubernetes.io/revision: 1
Selector: app=test
Replicas: 2 desired | 2 updated | 2 total | 2 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=test
Containers:
nginx:
Image: nginx
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Progressing True NewReplicaSetAvailable
Available True MinimumReplicasAvailable
OldReplicaSets: <none>
NewReplicaSet: test-5f6778868d (2/2 replicas created)
Events: <none>Copy to clipboardErrorCopied
在describe中可以看出,第一次建立時,它建立了一個名為nginx-deployment-7848d4b86f的ReplicaSet,並直接將其擴充套件為3個副本。更新部署時,它建立了一個新的ReplicaSet,命名為nginx-deployment-6b658bf589,並將其副本數擴充套件為1,然後將舊的ReplicaSet縮小為2,這樣至少可以有2個Pod可用,最多建立了4個Pod。以此類推,使用相同的滾動更新策略向上和向下擴充套件新舊ReplicaSet,最終新的ReplicaSet可以擁有3個副本,並將舊的ReplicaSet縮小為0。
回滾
當新版本不穩定時,可以對其進行回滾操作,預設情況下,所有Deployment的rollout歷史都保留在系統中,可以隨時回滾。
構建歷史
[root@instance-gvpb80ao yaml]# kubectl rollout history deployment nginx-deployment
deployment.apps/nginx-deployment
REVISION CHANGE-CAUSE
1 <none>
2 <none>
3 <none>
4 <none>
5 kubectl set image deployment nginx-deployment nginx=alvinos/django:v1 --record=true
6 kubectl set image deployment nginx-deployment nginx=alvinos/django:v2 --record=trueCopy to clipboardErrorCopied
--record
:將部署命令記錄到歷史。
回滾上一個版本
[root@instance-gvpb80ao yaml]# kubectl rollout undo deployment nginx-deployment
deployment.apps/nginx-deployment rolled back
[root@instance-gvpb80ao yaml]# kubectl describe deployments.apps nginx-deployment
Name: nginx-deployment
Namespace: default
CreationTimestamp: Fri, 18 Sep 2020 23:04:12 +0800
Labels: app=nginx
Annotations: deployment.kubernetes.io/revision: 7
kubernetes.io/change-cause: kubectl set image deployment nginx-deployment nginx=alvinos/django:v1 --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: alvinos/django:v1
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-6fff65f5cb (3/3 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 27m deployment-controller Scaled up replica set nginx-deployment-7848d4b86f to 3
Normal ScalingReplicaSet 19m deployment-controller Scaled up replica set nginx-deployment-6b658bf589 to 1
Normal ScalingReplicaSet 19m deployment-controller Scaled down replica set nginx-deployment-7848d4b86f to 2
Normal ScalingReplicaSet 19m deployment-controller Scaled up replica set nginx-deployment-6b658bf589 to 2
Normal ScalingReplicaSet 19m deployment-controller Scaled down replica set nginx-deployment-7848d4b86f to 1
Normal ScalingReplicaSet 19m deployment-controller Scaled up replica set nginx-deployment-6b658bf589 to 3
Normal ScalingReplicaSet 19m deployment-controller Scaled down replica set nginx-deployment-7848d4b86f to 0
Normal ScalingReplicaSet 17m deployment-controller Scaled up replica set nginx-deployment-55d6b67f5b to 1
Normal ScalingReplicaSet 16m deployment-controller Scaled down replica set nginx-deployment-6b658bf589 to 2
Normal ScalingReplicaSet 5m38s (x19 over 16m) deployment-controller (combined from similar events): Scaled up replica set nginx-deployment-8bb5777df to 3
Normal ScalingReplicaSet 47s deployment-controller Scaled up replica set nginx-deployment-6fff65f5cb to 1Copy to clipboardErrorCopied
我們可以看到回滾到了上一個版本。
回滾指定版本
[root@instance-gvpb80ao yaml]# kubectl rollout undo deployment nginx-deployment --to-revision=3
deployment.apps/nginx-deployment rolled backCopy to clipboardErrorCopied
使用--to-revision
引數回到指定版本。
擴容
當公司訪問量變大,三個Pod已無法支撐業務時,可以對其進行擴充套件。
[root@instance-gvpb80ao yaml]# kubectl scale deployment nginx-deployment --replicas=5
deployment.apps/nginx-deployment scaled
[root@instance-gvpb80ao yaml]# kubectl get -f deployment.yaml
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 4/5 5 4 31m