【云原生】Deployment控制器详细

Deployment

一、Deployment

1.1、什么是Deployment

  • Deployment同样也是Kubernetes系统的一个核心概念,主要职责和RC、RS一样都是保证Pod的数量和健康,通过定义一个Deployment控制器会创建一个新的ReplicaSet控制器,通过ReplicaSet创建Pod,删除Deployment控制器,也会删除Deployment控制器下对应的ReplicaSet控制器和Pod资源。二则大部分功能都是完全一致的,我们可以看成是一个升级版的RC、RS控制器

1.2、Deployment功能

  • 声明式更新:用户可以声明所需的应用状态,Deployment控制器负责将当前逐步更为所需状态。
  • 自动滚动更新:Deployment支持在更新应用时执行更新。使得应用的可用性持续,该过程会逐步替换旧版本的Pod,确保在更新过程中不会有或极少有downtime。
  • 回滚功能:如果新的应用版本出现问题,Deployment允许用户快速回滚到先前的稳定版本。
  • 管理副本:Deployment控制器恶意维护指定数量的Pod副本,确保系统在任何时刻都有足够的副本在运行。
  • 自愈能力:Deployment会监控Pod的状态,并自动重启失败的Pod,以保持设定的副本数。
  • 版本控制:Deployment使用标签选择器来管理Pod,这使得用户可以很容器地跟踪和管理不同版本的应用。

1.3、Deployment用例场景

  • 创建Deployment以将ReplicaSet上线。ReplicaSet在后台创建Pod。检查ReplicaSet的上线状态,查看其是否成功。
  • 通过更新Deployment的PodTemplateSpec,声明Pod的新状态。新的ReplicaSet会被创建,Deployment以受控速率将Pod从旧ReplicaSet迁移到新ReplicaSet。每个新的ReplicaSet都会更新Deployment的修订版本。
  • 如果Deployment的当前状态不稳定,回滚到较早的Deployment版本。每次回滚都会更新Deployment的修订版本。
  • 扩大Deployment规模以承担更多负载。
  • 暂停Deployment的上线以应用对PodTemplateSpec所作的多项修改,然后恢复其执行以启动新的上线版本。
  • 使用Deployment状态来判断上线过程是否出现停滞。
  • 清理较久的不再需要的ReplicaSet。

二、Deployment示例

2.1、示例

  • 下面的Deployment示例,其中创建了一个ReplicaSet,这个ReplicaSet负责启动三个nginxPod:
[root@master ~]# 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:
      restartPolicy: Always
      containers:
      - name: nginx
        image: nginx:1.14.2
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
  • 在该例中:
    • 创建名为nginx-deployment(由.metadata.name字段标明)的Deployment。该名称将成为后续创建ReplicaSet和Pod的名称基础
    • 该Deployment创建一个ReplicaSet,它创建三个(由.spec.replicas字段标明)Pod副本。
    • .spec.selector字段定义所创建的ReplicaSet如果查找要管理的Pod。在这里,你选择在Pod模板中定义的标签(app:nginx)。不过,更复杂的选择规则是也可能的,只要Pod模板本身满足所给规则即可。
  • template字段包含以下子字段:
    • Pod被使用.metadata.labels字段打上app:nginx标签。
    • Pod模板规约(即.template.spec字段)指示Pod运行一个nginx容器,该容器运行版本为1.14.2的nginxDocker Hub镜像。
    • 创建一个容器并使用.spec.template.spec.containers.name字段将其命名为nginx
  • 开始之前,请确保你的Kubernetes集群已经正常运行。按照以下步骤创建上述Deployment
[root@master ~]# kubectl apply -f nginx-deployment.yaml
  • 运行kubectl get deployment检查Deployment是否已经创建。如果仍在创建Deployment,则输出类似于:
[root@master ~]# kubectl get deployment
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   0/3     3            0           25s


# 在检查集群中的Deployment时,所显示的字段有:
NAME:列出了名称空间中Deployment的名称
READY:显示应用程序的可用“副本”数。显示的模式是“就绪个数/期望个数”
UP-TO-DATE:显示为了达到期望状态已经更新的副本数
AVAILABLE:显示应用可供用户使用的副本数
AGE:显示应用程序运行的时间
  • 请注意期望数副本数是根据.spec.replicas字段设置3

要想查看Deployment上线状态,运行kubectl rollout status deployment nginx-deployment

[root@master ~]# kubectl rollout status deployment nginx-deployment
deployment "nginx-deployment" successfully rolled out

几秒种过再次运行kubectl get deployment输出类似于:

[root@master ~]# kubectl get deployment
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3            3           71m

要查看Deployment创建的ReplicaSet(rs),运行kubectl get rs。输出类似于

[root@master ~]# kubectl get rs
NAME                         DESIRED   CURRENT   READY   AGE
nginx-deployment-9456bbbf9   3         3         3       73m


# ReplicaSet输出中包含以下字段:
NAME:列出名称空间中ReplicaSet的名称
DESIRED:显示应用的期望副本个数,即在创建Deployment时所定义的值。此为期望状态
CURRENT:显示当前运行状态中的副本个数
READY:显示应用中有多少副本可以为用户提供服务
AGE:显示应用已经运行的时间长度
# 注意:ReplicaSet的名称格式始终为[Deployment 名称]-[哈希]。该名称将成为所创建的Pod的名称基础。其中的 哈希字符串与ReplicaSet上的pod-template-hash标签一致


# Deployment的名字
[root@master ~]# kubectl get deployment
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3            3           77m


# rs的名字
[root@master ~]# kubectl get rs
NAME                         DESIRED   CURRENT   READY   AGE
nginx-deployment-9456bbbf9   3         3         3       77m

要查看每个Pod自动生成的标签,运行kubectl get pod --show-labels。输出类似于

[root@master ~]# kubectl get pod --show-labels
NAME                               READY   STATUS    RESTARTS   AGE   LABELS
nginx-deployment-9456bbbf9-j855n   1/1     Running   0          78m   app=nginx,pod-template-hash=9456bbbf9
nginx-deployment-9456bbbf9-kzxkw   1/1     Running   0          78m   app=nginx,pod-template-hash=9456bbbf9
nginx-deployment-9456bbbf9-twsbk   1/1     Running   0          78m   app=nginx,pod-template-hash=9456bbbf9

2.2、说明

你必须在Deployment中指定适当的选择算符和Pod模板标签(在本例中为app:nginx)。标签或者选择算符不要与其他控制器(包括其他Deployment和StatefulSet)重叠。Kubernetes不会组织你这样做,但是如果多个控制器具有重叠的选择算符,它们可能会发生冲突执行难以预料的操作。

2.3、Pod-template-hash标签

注意:不要更改此标签

Deployment控制器将pod-template-hash标签添加到Deployment所创建或收留的每个ReplicaSet

此标签可确保Deployment的子ReplicaSet不重叠。标签是通过对ReplicaSet的podTemplate进行哈希处理。所生成的哈希值被添加到ReplicaSet选择算符、Pod模板标签,并存在于ReplicaSet可能拥有的任何现有Pod中

三、更新Deployment

说明:仅当Deployment Pod模板(即.spec.template)发生该表时,例如模板的标签或容器镜像被更新,才会触发Deployment上线。其他更新(如对Deployment执行扩缩容的操作)不会指出上线动作。

3.1、更新Nginx版本

再执行以下操作之前,可以先查看目前的nginx版本

[root@master ~]# kubectl exec -it nginx-deployment-9456bbbf9-j855n -- nginx -v
nginx version: nginx/1.14.2

先来更新nginx Pod以使用nginx:1.16.1镜像,而不是nginx:1.14.2镜像

[root@master ~]# kubectl set image deployment nginx-deployment nginx=nginx:1.16.1

在这里,deployment nginx-deployment表明Deployment的名称,nginx表明需要进行更新的容器,而nginx:1.16.1则表示镜像的心版本

输出类似于:

deployment.apps/nginx-deployment image updated

或者,可以对Deployment执行edit操作并将.spec.template.spec.containers.imagenginx:1.14.2更改值nginx:latest最新版本

[root@master ~]# kubectl edit deployment nginx-deployment
spec:
      containers:
      - image: nginx:latest
        imagePullPolicy: IfNotPresent
        name: nginx
...

3.2、查看上线状态

要查看上线状态,运行:

[root@master ~]# kubectl rollout status deployment nginx-deployment

输出类似于

Waiting for deployment "nginx-deployment" rollout to finish: 1 out of 3 new replicas have been updated...

或者

deployment "nginx-deployment" successfully rolled out

获取关于已更新的Deployment的更多信息

  • 在上线成功后,可以通过运行kubectl get deployment来查看Deployment:输出类似于:
[root@master ~]# kubectl get deployment
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3            3           110m
  • 运行kubectl get rs以查看Deployment通过创建新的ReplicaSet并将其扩容到3个副本并将旧ReplicaSet缩容到0个副本完成了Pod的更新操作:
[root@master ~]# kubectl get rs
NAME                         DESIRED   CURRENT   READY   AGE
nginx-deployment-67dffbbbb   3         3         3       2m52s
nginx-deployment-9456bbbf9   0         0         0       111m
  • 现在运行kubectl get pod应该显示新的Pod:
[root@master ~]# kubectl get pod
NAME                               READY   STATUS    RESTARTS   AGE
nginx-deployment-67dffbbbb-2dgln   1/1     Running   0          3m54s
nginx-deployment-67dffbbbb-kmsbr   1/1     Running   0          3m55s
nginx-deployment-67dffbbbb-sg672   1/1     Running   0          3m56s

下次要更新这些Pod时,只需要再次更新Deployment模板即可。

Deployment可确保在更新时关闭一定数量的Pod。默认情况下,它确保至少所需Pod的75%处于运行状态(最大不可用比例为25%)。

例如,如果仔细查看上述Deployment,将看到它首先创建了一个新的Pod,然后删除旧的Pod,并创建了新的Pod。它不会杀死旧Pod,直到足够数量的新Pod已经出现。在足够数量的旧Pod被杀死前并没有创建新的Pod。它确保至少3个Pod可用,同时最多总共4个Pod可用。当Deployment设置为4个副本时,Pod的个数会介于3和5之前。

  • 获取Deployment的更多信息
[root@master ~]# kubectl describe deployment

输出类似于

Name:                   nginx-deployment
Namespace:              default
CreationTimestamp:      Fri, 26 Jul 2024 15:42:14 +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:latest
    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-67dffbbbb (3/3 replicas created)
Events:
  Type    Reason             Age    From                   Message
  ----    ------             ----   ----                   -------
  Normal  ScalingReplicaSet  22m    deployment-controller  Scaled up replica set nginx-deployment-ff6655784 to 1
  Normal  ScalingReplicaSet  7m43s  deployment-controller  Scaled down replica set nginx-deployment-ff6655784 to 0
  Normal  ScalingReplicaSet  7m43s  deployment-controller  Scaled up replica set nginx-deployment-67dffbbbb to 1
  Normal  ScalingReplicaSet  7m42s  deployment-controller  Scaled down replica set nginx-deployment-9456bbbf9 to 2
  Normal  ScalingReplicaSet  7m42s  deployment-controller  Scaled up replica set nginx-deployment-67dffbbbb to 2
  Normal  ScalingReplicaSet  7m41s  deployment-controller  Scaled down replica set nginx-deployment-9456bbbf9 to 1
  Normal  ScalingReplicaSet  7m41s  deployment-controller  Scaled up replica set nginx-deployment-67dffbbbb to 3
  Normal  ScalingReplicaSet  7m39s  deployment-controller  Scaled down replica set nginx-deployment-9456bbbf9 to 0

四、回滚Deployment

4.1、回滚前操作

有时,你可能想要回滚Deployment;例如,当Deployment不稳定时(例如进入反复崩溃状态)。默认情况下,Deployment的所有上线记录都保留在系统中,以便可以随时回滚(你可以通过修改修订历史限制来更新这一越苏)

说明:Deployment被触发上线时,系统就会创建Deployment的新的修订版本。这意味着仅当Deployment的Pod模板(.spec.template)发生更改时,才会创建新的修订版本–例如,模板的标签或容器镜像发生变化。其他更新,如Deployment的扩缩容器操作不会创建Deployment修订版本。这是为了方便同时执行手动缩放或自动缩放,换言之,当你回滚到较早的修订版本时,只有Deployment的Pod模板部署会被回滚。

  • 假设你在更新Deployment时犯了一个拼写错误,将镜像名称命名设置为nginx:1.161而不是nginx:1.16.1
[root@master ~]# kubectl set image deployment nginx-deployment nginx=nginx:1.161

输出类似于:

deployment.apps/nginx-deployment image updated
  • 此上线进程会出现停滞,你可以通过检查上线状态来验证:
[root@master ~]# kubectl rollout status deployment nginx-deployment

输出类似于

Waiting for deployment "nginx-deployment" rollout to finish: 1 out of 3 new replicas have been updated...
  • Ctrl-C停止上述上线状态观察

  • 你可以看到旧的副本有3个,新的副本有1个

[root@master ~]# kubectl get rs
NAME                          DESIRED   CURRENT   READY   AGE
nginx-deployment-5b4685b9bd   1         1         0       3m56s
nginx-deployment-67dffbbbb    3         3         3       20m
nginx-deployment-9456bbbf9    0         0         0       128m
  • 查看所创建的Pod,你会注意到新ReplicaSet所创建的1个Pod卡顿在镜像拉取循环中
[root@master ~]# kubectl get pod

输出类似于:

NAME                                READY   STATUS             RESTARTS   AGE
nginx-deployment-5b4685b9bd-lm4jj   0/1     ImagePullBackOff   0          5m21s
nginx-deployment-67dffbbbb-2dgln    1/1     Running            0          21m
nginx-deployment-67dffbbbb-kmsbr    1/1     Running            0          21m
nginx-deployment-67dffbbbb-sg672    1/1     Running            0          21m

说明:Deployment控制器自动停止有问题的上线过程,并停止对新的ReplicaSet扩容。这行为取决于所指定的rollingUpdate参数(具体为maxUnavailable)。默认情况下,Kubernetes将此值设置为25%

  • 获取Deployment描述信息:
[root@master ~]# kubectl describe deployment

输出类似于:

Name:                   nginx-deployment
Namespace:              default
CreationTimestamp:      Fri, 26 Jul 2024 15:42:14 +0800
Labels:                 app=nginx
Annotations:            deployment.kubernetes.io/revision: 4
Selector:               app=nginx
Replicas:               3 desired | 1 updated | 4 total | 3 available | 1 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  app=nginx
  Containers:
   nginx:
    Image:        nginx:1.161
    Port:         80/TCP
    Host Port:    0/TCP
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    ReplicaSetUpdated
OldReplicaSets:  nginx-deployment-67dffbbbb (3/3 replicas created)
NewReplicaSet:   nginx-deployment-5b4685b9bd (1/1 replicas created)
Events:
  Type    Reason             Age    From                   Message
  ----    ------             ----   ----                   -------
  Normal  ScalingReplicaSet  39m    deployment-controller  Scaled up replica set nginx-deployment-ff6655784 to 1
  Normal  ScalingReplicaSet  24m    deployment-controller  Scaled down replica set nginx-deployment-ff6655784 to 0
  Normal  ScalingReplicaSet  24m    deployment-controller  Scaled up replica set nginx-deployment-67dffbbbb to 1
  Normal  ScalingReplicaSet  24m    deployment-controller  Scaled down replica set nginx-deployment-9456bbbf9 to 2
  Normal  ScalingReplicaSet  24m    deployment-controller  Scaled up replica set nginx-deployment-67dffbbbb to 2
  Normal  ScalingReplicaSet  24m    deployment-controller  Scaled down replica set nginx-deployment-9456bbbf9 to 1
  Normal  ScalingReplicaSet  24m    deployment-controller  Scaled up replica set nginx-deployment-67dffbbbb to 3
  Normal  ScalingReplicaSet  24m    deployment-controller  Scaled down replica set nginx-deployment-9456bbbf9 to 0
  Normal  ScalingReplicaSet  7m44s  deployment-controller  Scaled up replica set nginx-deployment-5b4685b9bd to 1

要解决此问题,需要回滚到以前稳定的Deployment版本

4.2、检查Deployment上线历史

4.2.1、查看修订历史
[root@master ~]# kubectl rollout history deployment nginx-deployment

输出类似于:

deployment.apps/nginx-deployment 
REVISION  CHANGE-CAUSE
1         <none>
2         <none>
3         <none>
4         <none>

CHANGE-CAUSE的内容是从Deployment的kubernetes.io/change-cause注解复制过来的。复制动作发生在修订版本创建时。

4.2.2、查看修订历史的详细信息
  • 以下命令将查看修订版本2的详细信息
[root@master ~]# kubectl rollout history deployment nginx-deployment --revision=2

输出类似于:

deployment.apps/nginx-deployment with revision #2
Pod Template:
  Labels:	app=nginx
	pod-template-hash=ff6655784
  Containers:
   nginx:
    Image:	nginx:1.16.1
    Port:	80/TCP
    Host Port:	0/TCP
    Environment:	<none>
    Mounts:	<none>
  Volumes:	<none>
4.2.3、回滚到之前的修订版本

按照下面给出的步骤将Deployment从当前版本回滚到以前的版本(即版本2)

  • 假定现在你已经决定撤销当前上线版本回滚到之前的修订版本:
[root@master ~]# kubectl rollout undo deployment nginx-deployment --to-revision=2

输出类似于:

deployment.apps/nginx-deployment rolled back
  • 检查回滚是否成功以及Deployment是否正在运行
[root@master ~]# kubectl get deployment nginx-deployment

输出类似于:

NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3            3           3h43m
  • 获取Deployment描述信息:
[root@master ~]# kubectl describe deployment nginx-deployment

输出类似于:

Name:                   nginx-deployment
Namespace:              default
CreationTimestamp:      Fri, 26 Jul 2024 15:42:14 +0800
Labels:                 app=nginx
Annotations:            deployment.kubernetes.io/revision: 5
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-ff6655784 (3/3 replicas created)
Events:
  Type    Reason             Age    From                   Message
  ----    ------             ----   ----                   -------
  Normal  ScalingReplicaSet  131m   deployment-controller  Scaled up replica set nginx-deployment-ff6655784 to 1
  Normal  ScalingReplicaSet  115m   deployment-controller  Scaled down replica set nginx-deployment-ff6655784 to 0
  Normal  ScalingReplicaSet  115m   deployment-controller  Scaled up replica set nginx-deployment-67dffbbbb to 1
  Normal  ScalingReplicaSet  115m   deployment-controller  Scaled down replica set nginx-deployment-9456bbbf9 to 2
  Normal  ScalingReplicaSet  115m   deployment-controller  Scaled up replica set nginx-deployment-67dffbbbb to 2
  Normal  ScalingReplicaSet  115m   deployment-controller  Scaled down replica set nginx-deployment-9456bbbf9 to 1
  Normal  ScalingReplicaSet  115m   deployment-controller  Scaled up replica set nginx-deployment-67dffbbbb to 3
  Normal  ScalingReplicaSet  115m   deployment-controller  Scaled down replica set nginx-deployment-9456bbbf9 to 0
  Normal  ScalingReplicaSet  99m    deployment-controller  Scaled up replica set nginx-deployment-5b4685b9bd to 1
  Normal  ScalingReplicaSet  3m55s  deployment-controller  Scaled down replica set nginx-deployment-5b4685b9bd to 0
  Normal  ScalingReplicaSet  3m55s  deployment-controller  Scaled up replica set nginx-deployment-ff6655784 to 1
  Normal  ScalingReplicaSet  3m10s  deployment-controller  Scaled down replica set nginx-deployment-67dffbbbb to 2
  Normal  ScalingReplicaSet  3m10s  deployment-controller  Scaled up replica set nginx-deployment-ff6655784 to 2
  Normal  ScalingReplicaSet  2m30s  deployment-controller  Scaled down replica set nginx-deployment-67dffbbbb to 1
  Normal  ScalingReplicaSet  2m30s  deployment-controller  Scaled up replica set nginx-deployment-ff6655784 to 3
  Normal  ScalingReplicaSet  2m28s  deployment-controller  Scaled down replica set nginx-deployment-67dffbbbb to 0
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值