解析Kubernetes部署及更新Deployment

1 本人基础环境

2 目的

通过更新 Deployment 的 PodTemplateSpec,声明 Pod 的新状态 。 新的 ReplicaSet 会被创建,Deployment 以受控速率将 Pod 从旧 ReplicaSet 迁移到新 ReplicaSet。 每个新的 ReplicaSet 都会更新 Deployment 的修订版本。

3 创建Deployment

为了解析更新Deployment,先创建一个Deployment

3.1 Deployment示例

下面是一个 Deployment 示例。其中创建了一个 ReplicaSet,负责启动三个 nginx Pod:

# controllers/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

针对该yaml的解析可以参考Yaml创建Deployment解析
建议阅读过Yaml创建Deployment解析该文章后再看此文章会有更好的理解

3.2 创建Deployment

执行下面命令创建Deployment

# 这里采用的是远端的nginx-deployment.yaml,也可改成本地的文件
kubectl apply -f https://k8s.io/examples/controllers/nginx-deployment.yaml

3.3 查看Deployment

执行下面命令查看Deployment

kubectl get deployments

在这里插入图片描述

3.4 查看上线状态

执行下面命令查看上线状态

kubectl rollout status deployment/nginx-deployment

在这里插入图片描述

4 更新 Deployment

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

4.1 更新Development

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

kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.16.1

或者使用下面命令

kubectl set image deployment/nginx-deployment nginx=nginx:1.16.1

在这里,deployment/nginx-deployment 表明 Deployment 的名称,nginx 表明需要进行更新的容器, 而 nginx:1.16.1 则表示镜像的新版本以及它的标签
在这里插入图片描述
或者,可以对 Deployment 执行 edit 操作并将.spec.template.spec.containers[0].image 从 nginx:1.14.2 更改至 nginx:1.16.1

kubectl edit deployment/nginx-deployment

输出类似于:

deployment.apps/nginx-deployment edited

4.2 查看上线状态

kubectl rollout status deployment/nginx-deployment

在这里插入图片描述

deployment “nginx-deployment” successfully rolled out
表示已上线成功

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

Deployment的变化情况

kubectl get deployments --show-labels

在这里插入图片描述
ReplicaSet的变化情况
运行 kubectl get rs 以查看 Deployment 通过创建新的 ReplicaSet 并将其扩容到 3 个副本并将旧 ReplicaSet 缩容到 0 个副本完成了 Pod 的更新操作

kubectl get rs --show-labels

在这里插入图片描述
下次要更新这些 Pod 时,只需再次更新 Deployment Pod 模板即可。

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

Deployment 还确保仅所创建 Pod 数量只可能比期望 Pod 数高一点点。 默认情况下,它可确保启动的 Pod 个数比期望个数最多多出 125%(最大峰值 25%)。

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

Pod的变化情况

kubectl get pods --show-labels

在这里插入图片描述

4.4 获取 Deployment 的描述信息

kubectl describe deployments

输出:(仅截取nginx-deployment部分)

Name:                   nginx-deployment
Namespace:              default
CreationTimestamp:      Wed, 06 Nov 2024 21:00:14 +0800
Labels:                 app=nginx
Annotations:            deployment.kubernetes.io/revision: 2
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>
  Node-Selectors:  <none>
  Tolerations:     <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable
OldReplicaSets:  nginx-deployment-d556bf558 (0/0 replicas created)
NewReplicaSet:   nginx-deployment-7dbfbc79cf (3/3 replicas created)
Events:
  Type    Reason             Age   From                   Message
  ----    ------             ----  ----                   -------
  Normal  ScalingReplicaSet  30m   deployment-controller  Scaled up replica set nginx-deployment-7dbfbc79cf to 1
  Normal  ScalingReplicaSet  29m   deployment-controller  Scaled down replica set nginx-deployment-d556bf558 to 2 from 3
  Normal  ScalingReplicaSet  29m   deployment-controller  Scaled up replica set nginx-deployment-7dbfbc79cf to 2 from 1
  Normal  ScalingReplicaSet  29m   deployment-controller  Scaled down replica set nginx-deployment-d556bf558 to 1 from 2
  Normal  ScalingReplicaSet  29m   deployment-controller  Scaled up replica set nginx-deployment-7dbfbc79cf to 3 from 2
  Normal  ScalingReplicaSet  29m   deployment-controller  Scaled down replica set nginx-deployment-d556bf558 to 0 from 1

根据事件可以看到,当第一次创建 Deployment 时,它创建了一个 ReplicaSet(nginx-deployment-d556bf558) 并将其直接扩容至 3 个副本。更新 Deployment 时,它创建了一个新的 ReplicaSet (nginx-deployment-7dbfbc79cf),并将其扩容为 1,等待其就绪;然后将旧 ReplicaSet 缩容到 2, 将新的 ReplicaSet 扩容到 2 以便至少有 3 个 Pod 可用且最多创建 4 个 Pod。 然后,它使用相同的滚动更新策略继续对新的 ReplicaSet 扩容并对旧的 ReplicaSet 缩容。 最后,你将有 3 个可用的副本在新的 ReplicaSet 中,旧 ReplicaSet 将缩容到 0

说明:
Kubernetes 在计算 availableReplicas 数值(可用的副本)时不考虑终止过程中的 Pod, availableReplicas 的值一定介于 replicas - maxUnavailable(最大不可用) 和 replicas + maxSurge(最大期望) 之间。 因此,你可能在上线期间看到 Pod 个数比预期的多,Deployment 所消耗的总的资源也大于 replicas + maxSurge 个 Pod 所用的资源,直到被终止的 Pod 所设置的 terminationGracePeriodSeconds(终止宽限期) 到期为止。

5 翻转(多 Deployment 动态更新)

Deployment 控制器每次注意到新的 Deployment 时,都会创建一个 ReplicaSet 以启动所需的 Pod。 如果更新了 Deployment,则控制标签匹配 .spec.selector 但模板不匹配.spec.template的 Pod 的现有 ReplicaSet 被缩容。 最终,新的 ReplicaSet 缩放为 .spec.replicas 个副本, 所有旧 ReplicaSet 缩放为 0 个副本。

当 Deployment 正在上线时被更新,Deployment 会针对更新创建一个新的 ReplicaSet 并开始对其扩容,之前正在被扩容的 ReplicaSet 会被翻转,添加到旧 ReplicaSet 列表 并开始缩容。

例如,假定你在创建一个 Deployment 以生成 nginx:1.14.2 的 5 个副本,但接下来 更新 Deployment 以创建 5 个 nginx:1.16.1 的副本,而此时只有 3 个 nginx:1.14.2 副本已创建。在这种情况下,Deployment 会立即开始杀死 3 个 nginx:1.14.2 Pod, 并开始创建 nginx:1.16.1 Pod。它不会等待 nginx:1.14.2 的 5 个副本都创建完成后才开始执行变更动作。

6 更改标签选择算符

通常不鼓励更新标签选择算符。建议你提前规划选择算符。 在任何情况下,如果需要更新标签选择算符,请格外小心, 并确保自己了解这背后可能发生的所有事情。

说明:
在 API 版本 apps/v1 中,Deployment 标签选择算符在创建后是不可变的。

  • 添加选择算符时要求使用新标签更新 Deployment 规约中的 Pod 模板标签,否则将返回验证错误。 此更改是非重叠的,也就是说新的选择算符不会选择使用旧选择算符所创建的 ReplicaSet 和 Pod, 这会导致创建新的 ReplicaSet 时所有旧 ReplicaSet 都会被孤立。
  • 选择算符的更新如果更改了某个算符的键名,这会导致与添加算符时相同的行为。
  • 删除选择算符的操作会删除从 Deployment 选择算符中删除现有算符。 此操作不需要更改 Pod 模板标签。现有 ReplicaSet 不会被孤立,也不会因此创建新的 ReplicaSet, 但请注意已删除的标签仍然存在于现有的 Pod 和 ReplicaSet 中
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值