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
posted @ 2020-09-22 10:34  JoJoblog  阅读(335)  评论(0)    收藏  举报