Kubernetes部署执行滚动更新教程介绍滚动更新是现代应用程序生命周期的重要组成部分,用户不断期待新功能和零停机时间。虽然 Kubernetes 过去使用复制控制器来启用此功能,但较新的版本建议使用部署。
Kubernetes如何部署执行滚动更新?本教程向你展示如何使用 Kubernetes 部署执行滚动更新。此方法可让你快速更新应用程序并实现零停机时间,同时确保支持回滚。
先决条件
- 一个 Kubernetes 集群
- 访问终端窗口
- 该kubectl 命令行工具
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.2ports:
- 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。
为了解决这个问题,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.0ports:
- 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 在其他地方运行。
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 中部署类型的知识,请阅读如何在 Kubernetes 上进行 Canary 部署。
推荐阅读
- Apache Storm与Spark比较(它们有哪些区别())
- 如何创建Spark DataFrame(分步操作详细指南)
- Kubernetes集群管理( 如何使用Rancher BMC集成())
- Terraform与Kubernetes有什么区别(哪个更好?)
- 如何更新Kali Linux(详细操作分步指南)
- Android_程序未处理异常的捕获与处理
- POJ 2486 Apple Tree
- Android6.0机型上调用系统相机拍照返回的resultCode值始终等于0的问题
- Android开发分享功能实现步骤