1. 程式人生 > 實用技巧 >kubernetes Deployment 學習

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