目录
1 本人基础环境
- 操作系统:CentOSStream9 CPU - 2核 内存 - 4GB 硬盘 - 60G
- 安装了docker及k8s(CentOS9安装docker及k8s)
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 中