Kubernetes部署执行滚动更新教程介绍
滚动更新是现代应用程序生命周期的重要组成部分,用户不断期待新功能和零停机时间。虽然 Kubernetes 过去使用复制控制器来启用此功能,但较新的版本建议使用部署。
Kubernetes如何部署执行滚动更新?本教程向你展示如何使用 Kubernetes 部署执行滚动更新。此方法可让你快速更新应用程序并实现零停机时间,同时确保支持回滚。
先决条件
- 一个 Kubernetes 集群
- 访问终端窗口
- 该kubectl 命令行工具
启用滚动更新
如何使用Kubernetes部署执行滚动更新?Kubernetes 部署充当 ReplicaSet 的包装器,ReplicaSet 是负责 pod 管理的 Kubernetes 控制器。部署为 ReplicaSet 提供了额外的功能——它们执行健康检查、滚动更新和回滚。
1. 首先,使用文本编辑器创建一个带有部署规范的yaml文件,例如Nano:
nano nginx-test.yaml
下面的示例文件包含 Kubernetes 部署所需的基本声明:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 4
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
2. 保存并退出文件。
3. 然后,使用你刚刚创建的kubectl create
命令和yaml文件创建部署:
kubectl create -f nginx-test.yaml
4. 检查部署:
kubectl get deployment
输出应确认部署已准备就绪:
4. 接下来,通过运行以下命令检查 ReplicaSets:
kubectl get rs
示例文件指定了四个副本,它们都显示为就绪:
5. 最后,检查 Pod 是否已启动:
kubectl get pod
输出显示 Pod 已准备就绪并正在运行:
确保零停机时间
如何使用Kubernetes部署执行滚动更新?要配置零停机滚动更新,你需要指定更新策略。
1.在部署yaml文件的spec
category下添加如下声明:
minReadySeconds: 5
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
minReadySeconds
告诉 Kubernetes 在创建下一个 Pod 之前应该等待多长时间。此属性可确保所有应用程序 Pod 在更新期间都处于就绪状态。maxSurge
指定超过指定副本数的最大 Pod 数(或百分比)。在上面的示例中,由于yaml文件中指定了4 个副本,因此 pod 的最大数量将为5。maxUnavailable
声明更新期间不可用 Pod 的最大数量(或百分比)。如果maxSurge
设置为0,则该字段不能为0。
将上述规范添加到部署yaml文件中就足以开始执行 Kubernetes 滚动更新。但是,它并不能保证零停机时间。Kubernetes 无法判断新 Pod 何时准备就绪 - 一旦创建新 Pod,它就会消除旧 Pod。此问题会导致停机,直到新 pod 能够接受请求。
为了解决这个问题,Kubernetes 引入了Readiness Probes的概念。探测器会检查 Pod 的状态,并且仅当 Pod 中的所有容器都准备就绪时才允许进行滚动更新。当就绪探测成功且经过 中指定的时间后,Pod 被视为就绪minReadySeconds
。
2. 要设置就绪探针,请将以下几行添加到spec.template.spec
部署文件的类别中:
readinessProbe:
httpGet:
path: /
port: 8080
initialDelaySeconds: 5
periodSeconds: 5
successThreshold: 1
initialDelaySeconds
指定探测器在容器启动后必须等待多长时间才能启动。periodSeconds
是两次探测之间的时间。默认值为10秒,最小值为1秒。successThreshold
是在一次失败后连续成功探测的最小数量,整个过程被认为是成功的。默认值和最小值都是1。
为滚动更新正确配置的整个部署文件应如下所示:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 4
selector:
matchLabels:
app: nginx
minReadySeconds: 5
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.0
ports:
- containerPort: 80
readinessProbe:
httpGet:
path: /
port: 8080
initialDelaySeconds: 5
periodSeconds: 5
successThreshold: 1
3. 保存文件并退出。
4. 然后,使用kubectl apply
应用更改:
kubectl apply -f nginx-text.yaml --record
该--record
标志将在回滚过程中发挥作用。
输出显示部署已成功配置。
执行滚动更新
如何使用Kubernetes部署执行滚动更新?共有三种执行滚动更新的方法。
例如,要更改应用程序图像:
选项 1:你可以使用kubectl set
在命令行上执行操作:
kubectl set image deployment nginx-deployment nginx=nginx:1.14.2 --record
选项 2:或者,spec.templates.spec.containers
在yaml文件部分修改镜像版本。然后,使用kubectl replace
来执行更新:
kubectl replace -f nginx-test.yaml
选项 3:你也可以使用kubectl edit
直接编辑部署:
kubectl edit deployment nginx-deployment --record
在打开的编辑器中进行必要的更改:
关闭编辑器时会应用更改。
检查推出状态
Kubernetes如何部署执行滚动更新?使用以下语法检查部署的推出状态:
kubectl rollout status deployment nginx-deployment
输出确认成功部署:
Kubernetes部署执行滚动更新教程?暂停和恢复滚动更新
使用相应的kubectl rollout
命令暂停和恢复滚动更新。
要暂停更新,请运行:
kubectl rollout pause deployment nginx-deployment
要恢复更新,请运行:
kubectl rollout resume deployment nginx-deployment
安排 Pod 进行部署
使用关联性和反关联性属性来控制 Kubernetes 在你的部署中安排特定 pod 的节点。
Pod Affinity
Kubernetes 目前有两种类型的Affinity:
requiredDuringSchedulingIgnoredDuringExecution
告诉 Kubernetes 仅在满足特定条件(例如特定处理器类型)的节点上运行 pod。preferredDuringSchedulingIgnoredDuringExecution
当且仅当没有节点满足给定条件时,允许 pod 在其他地方运行。
这些属性列在PodSpec文件中。例如,一个 pod 可以指定如下:
apiVersion: v1
kind: Pod
metadata:
name: affinity-test
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/test-name
operator: In
values:
- test1
- test2
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: example-node-label-key
operator: In
values:
- example-node-label-value
containers:
- name: affinity-test
image: k8s.gcr.io/pause:2.0
上面的文件告诉 Kubernetes 仅在具有标签的节点上运行 pod,该节点的键为kubernetes.io/test-name
,其值为test1
或test2
。此外,Kubernetes 会优先选择键为example-node-label-key
,example-node-label-value
值为 的节点。
Pod Anti-Affinity
如何使用Kubernetes部署执行滚动更新?如果你不希望所有 Pod 都在同一个节点上运行,则Pod Anti-Affinity很有用。它的功能类似于亲缘关系,具有相同的两种类型 -requiredDuringSchedulingIgnoredDuringExecution
和preferredDuringSchedulingIgnoredDuringExecution
.
以下示例指定了一个反关联性规则,该规则告诉 Kubernetes 最好避免将“测试”应用程序 Pod 调度到已经拥有“测试”Pod 的节点:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- test
topologyKey: Kubernetes.io/hostname
回滚更改
Kubernetes如何部署执行滚动更新?如果更新过程出现问题,你可以回滚更改并恢复到应用程序的先前版本。为此,请使用以下kubectl rollout
命令:
kubectl rollout history deployment nginx-deployment
输出列出了通过--record
在执行更新时添加标志创建的可用修订:
选择所需的修订并键入以下命令以回滚更改:
kubectl rollout undo deployment nginx-deployment --to-revision=1
上面的命令回滚到修订版 1 并产生以下输出:
Kubernetes部署执行滚动更新教程结论
如何使用Kubernetes部署执行滚动更新?阅读本教程后,你应该能够使用 Kubernetes 部署执行零停机滚动更新。
如果你希望扩展有关 Kubernetes 中部署类型的知识,请阅读如何在 Kubernetes 上进行 Canary 部署。