K8s进阶之Deployment的更新&回滚
更新概述更新指的是对 Deployment 所管理应用的设置、镜像版本等进行修改并应用到集群中的过程。通过更新 Deployment,你能够实现应用功能的升级、修复毛病、调整资源分配等操作。
更新触发条件
[*]镜像版本变更:当需要更新应用的功能或修复已知题目时,通常会使用新的镜像版本。例如,从 nginx:1.14.2 更新到nginx:1.16.1。
[*]设置参数修改:调整应用的环境变量、资源请求与限制等设置信息。好比,增加容器的内存限制。
[*]Pod 模板变更:对 Pod 模板中的标签、注解等元数据进行修改。
Deployment的更新策略
滚动更新(RollingUpdate)
这是 Deployment 的默认更新策略,能够实现零停机更新。它通过逐步替换 Pod 来完成更新,始终保持一定数量的 Pod 在运行,从而确保服务在整个更新过程中都可用。
RollingUpdate工作原理
[*]创建新的 ReplicaSet,使用新的 Pod 模板。
[*]逐步减少旧 ReplicaSet 的 Pod 数量,同时增加新 ReplicaSet 的 Pod 数量。
[*]每个新 Pod 创建后,只有通过康健检查(Readiness Probe)后,才会将旧 Pod 终止。
实现方式
通过界说strategy字段来实现,而strategy字段下有两个核心字段:
[*]maxUnavailable:界说在更新过程中,允许不可用的 Pod 的最大数量或百分比。默认值为 25%。
[*]maxSurge:界说在更新过程中,允许创建的超过期望副本数的 Pod 的最大数量或百分比。默认值为 25%。
重新创建(Recreate)
这种策略会先删除所有旧的 Pod,然后一次性创建所有新的 Pod。更新期间服务会有短暂不可用,因此适用于开辟环境或可以容忍短暂中断的场景
Deployment之滚动更新(RollingUpdate)实现
这是 Deployment 的默认更新策略,能够实现零停机更新。它通过逐步替换 Pod 来完成更新,始终保持一定数量的 Pod 在运行,从而确保服务在整个更新过程中都可用。
界说一个旧版本应用
起首创建一个Depoyment,界说Pod的镜像为nginx:1.14.1,然后将nginx的镜像版本升级为nginx:1.16.1
## 定义资源文件
# cat deploy-nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-nginx
namespace: default
spec:
# 定义更新策略
strategy:
# 指定类型为RollingUpdate(滚动更新)
type: RollingUpdate
# 当更新策略类型为RollingUpdate时,才会定义该字段,否则会报错
rollingUpdate:
# 定义创建的超过期望副本数的 Pod 的最大数量,这里设置为3,表示最大会创建13个Pod数量
maxSurge: 3
# 定义允许不可用的 Pod 的最大数量,这里设置为2,表示最大不可用的Pod数量为2
maxUnavailable: 2
replicas: 10
selector:
matchLabels:
app: nginx
template:
metadata:
name: pod-nginx
labels:
app: nginx
spec:
containers:
- name: container-nginx
image: nginx:1.14.1
restartPolicy: Always
# 创建deploy
# kubectl apply -f deploy-nginx.yaml
deployment.apps/deployment-nginx created
# 查看对应的资源创建情况
# kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
deployment-nginx 10/10 10 10 6s
# kubectl get rs
NAME DESIRED CURRENT READY AGE
deployment-nginx-6d84458cd8 10 10 10 11s
# kubectl get po | grep deploy
deployment-nginx-6d84458cd8-2km57 1/1 Running 0 18s
deployment-nginx-6d84458cd8-dqtsf 1/1 Running 0 18s
deployment-nginx-6d84458cd8-dtsx7 1/1 Running 0 18s
deployment-nginx-6d84458cd8-fr5zg 1/1 Running 0 18s
deployment-nginx-6d84458cd8-hcxz4 1/1 Running 0 18s
deployment-nginx-6d84458cd8-jm68h 1/1 Running 0 18s
deployment-nginx-6d84458cd8-nt8zw 1/1 Running 0 18s
deployment-nginx-6d84458cd8-pjkmd 1/1 Running 0 18s
deployment-nginx-6d84458cd8-tvxxh 1/1 Running 0 18s
deployment-nginx-6d84458cd8-x7vls 1/1 Running 0 18s更新至新版本应用
触发更新Deployment有两种方式:
[*]通过kubectl set来触发(不推荐)
语法:
kubectl set image <type-name> <container-name>=<image:tag>
参数说明:
type-name:指定类型的名称,对应的metadata中的name字段,例如deployment/deploy-nginx
container-name:容器名称,对应的是containers的name字段,例如nginx
image:tag:表示要更新的镜像及版本示例:
kubectl set image deployment/deploy-nginx container-nginx=nginx:1.16.1
[*]通过修改资源设置文件来触发(推荐)
我们这里修改其资源设置文件来触发
# 修改配置文件
# cat deploy-nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-nginx
namespace: default
spec:
# 定义更新策略
strategy:
# 指定类型为RollingUpdate(滚动更新)
type: RollingUpdate
# 当更新策略类型为RollingUpdate时,才会定义该字段,否则会报错
rollingUpdate:
# 定义创建的超过期望副本数的 Pod 的最大数量,这里设置为3,表示最大会创建13个Pod数量
maxSurge: 3
# 定义允许不可用的 Pod 的最大数量,这里设置为2,表示最大不可用的Pod数量为2
maxUnavailable: 2
replicas: 10
selector:
matchLabels:
app: nginx
template:
metadata:
name: pod-nginx
labels:
app: nginx
spec:
containers:
- name: container-nginx
# 更新镜像版本为1.16.1
image: nginx:1.16.1
restartPolicy: Always
# 重新应用它
# kubectl apply -f deploy-nginx.yaml
deployment.apps/deployment-nginx configured查看一下Pod及ReplicaSet的变化
查看Pod的变化
# 第一次查看Pod,发现一共有13个Pod。
# 其中超出预期值为3个,我们定义的副本数量为10,maxSurge的值为3
# 其中可用的Pod数量为8个(也就是不可用的Pod数量为2个,对应的maxUnavailable设置)
# 通过AGE字段发现,旧版本的Pod依旧存在
# kubectl get po | grep deploy
NAME READY STATUS RESTARTS AGE
deployment-nginx-6d84458cd8-2km57 1/1 Running 0 17m
deployment-nginx-6d84458cd8-dqtsf 1/1 Running 0 17m
deployment-nginx-6d84458cd8-fr5zg 1/1 Running 0 17m
deployment-nginx-6d84458cd8-hcxz4 1/1 Running 0 17m
deployment-nginx-6d84458cd8-jm68h 1/1 Running 0 17m
deployment-nginx-6d84458cd8-pjkmd 1/1 Running 0 17m
deployment-nginx-6d84458cd8-tvxxh 1/1 Running 0 17m
deployment-nginx-6d84458cd8-x7vls 1/1 Running 0 17m
deployment-nginx-d8898b99d-5pxt8 0/1 ContainerCreating 0 7s
deployment-nginx-d8898b99d-7z4pf 0/1 ContainerCreating 0 7s
deployment-nginx-d8898b99d-gttz8 0/1 ContainerCreating 0 7s
deployment-nginx-d8898b99d-j55fp 0/1 ContainerCreating 0 7s
deployment-nginx-d8898b99d-jfpdt 0/1 ContainerCreating 0 7s
# 最终查看Pod,发现Pod的最终数量为10,且全部更新成功(通过AGE字段查看)
# kubectl get po | grep deploy
NAME READY STATUS RESTARTS AGE
deployment-nginx-d8898b99d-2szcx 1/1 Running 0 18s
deployment-nginx-d8898b99d-5pxt8 1/1 Running 0 37s
deployment-nginx-d8898b99d-7k44g 1/1 Running 0 17s
deployment-nginx-d8898b99d-7z4pf 1/1 Running 0 37s
deployment-nginx-d8898b99d-gttz8 1/1 Running 0 37s
deployment-nginx-d8898b99d-j55fp 1/1 Running 0 37s
deployment-nginx-d8898b99d-jfpdt 1/1 Running 0 37s
deployment-nginx-d8898b99d-kdf7x 1/1 Running 0 16s
deployment-nginx-d8898b99d-lvpsw 1/1 Running 0 19s
deployment-nginx-d8898b99d-zfxkf 1/1 Running 0 15s查看ReplicaSet的变化:
# 发现有两个rs资源,其中deployment-nginx-6d84458cd8是旧版本的rs,它的副本数量为0
# deployment-nginx-d8898b99d是新版本的rs,它的副本数量为10,就这可以验证deploy滚动更新是基于rs来实现的
# kubectl get rs
NAME DESIRED CURRENT READY AGE
deployment-nginx-6d84458cd8 0 0 0 25m
deployment-nginx-d8898b99d 10 10 10 8m46sDeployment之重新创建(Recreate)实现
这种策略会先删除所有旧的 Pod,然后一次性创建所有新的 Pod。更新期间服务会有短暂不可用,因此适用于开辟环境或可以容忍短暂中断的场景
界说一个旧版本应用
起首创建一个Depoyment,界说Pod的镜像为tomcat:8.0,然后将tomcat的镜像版本升级为tomcat:9.0
## 定义资源文件
# cat deploy-tomcat.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-tomcat
namespace: default
spec:
# 定义更新策略
strategy:
# 指定类型为Recreate(重新创建)
type: Recreate
replicas: 10
selector:
matchLabels:
app: tomcat
template:
metadata:
name: pod-tomcat
labels:
app: tomcat
spec:
containers:
- name: container-tomcat
image: tomcat:8.0
restartPolicy: Always
# 应用它:
# kubectl apply -f deploy-tomcat.yaml
deployment.apps/deployment-tomcat created查看pod
# kubectl get po
NAME READY STATUS RESTARTS AGE
deployment-tomcat-85c65466c5-7vsms 1/1 Running 0 84s
deployment-tomcat-85c65466c5-bh9v9 1/1 Running 0 84s
deployment-tomcat-85c65466c5-bvhs9 1/1 Running 0 84s
deployment-tomcat-85c65466c5-czdsb 1/1 Running 0 84s
deployment-tomcat-85c65466c5-glq5m 1/1 Running 0 84s
deployment-tomcat-85c65466c5-k6xk7 1/1 Running 0 84s
deployment-tomcat-85c65466c5-mw8wz 1/1 Running 0 84s
deployment-tomcat-85c65466c5-tqtzb 1/1 Running 0 84s
deployment-tomcat-85c65466c5-wftgj 1/1 Running 0 84s
deployment-tomcat-85c65466c5-xxv2p 1/1 Running 0 84s更新至新版本应用
修改资源设置文件
# cat deploy-tomcat.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-tomcat
namespace: default
spec:
# 定义更新策略
strategy:
# 指定类型为Recreate(重新创建)
type: Recreate
replicas: 10
selector:
matchLabels:
app: tomcat
template:
metadata:
name: pod-tomcat
labels:
app: tomcat
spec:
containers:
- name: container-tomcat
# 镜像版本更新至9.0
image: tomcat:9.0
restartPolicy: Always
# 重新应用资源文件
# kubectl apply -f deploy-tomcat.yaml
deployment.apps/deployment-tomcat configured查看ReplicaSet及Pod的变化
查看Pod
# 发现Pod全部处于ContainerCreating的状态,且没有一个处于Ready,验证了Recreate是将Pod全部删除然后重新创建
# kubectl get po
NAME READY STATUS RESTARTS AGE
deployment-tomcat-7ddf96c4d8-4dcmh 0/1 ContainerCreating 0 6s
deployment-tomcat-7ddf96c4d8-4w8dd 0/1 ContainerCreating 0 6s
deployment-tomcat-7ddf96c4d8-8z95r 0/1 ContainerCreating 0 6s
deployment-tomcat-7ddf96c4d8-9dgph 0/1 ContainerCreating 0 6s
deployment-tomcat-7ddf96c4d8-9wgr4 0/1 ContainerCreating 0 6s
deployment-tomcat-7ddf96c4d8-kt7nw 0/1 ContainerCreating 0 6s
deployment-tomcat-7ddf96c4d8-lrgfm 0/1 ContainerCreating 0 6s
deployment-tomcat-7ddf96c4d8-mpmb9 0/1 ContainerCreating 0 6s
deployment-tomcat-7ddf96c4d8-vvbtb 0/1 ContainerCreating 0 6s
deployment-tomcat-7ddf96c4d8-w8knq 0/1 ContainerCreating 0 6s查看ReplicaSet
# kubectl get rs
NAME DESIRED CURRENT READY AGE
deployment-tomcat-7ddf96c4d8 10 10 10 27s
deployment-tomcat-85c65466c5 0 0 0 4m回滚概述
回滚是指在更新过程中出现题目(如应用崩溃、功能非常等)时,将 Deployment 规复到之前某个稳定版本的操作。Kubernetes 会记录 Deployment 的每次更新历史,方便你随时回滚到指定版本。
回滚也可以理解成Deployment的更新,回滚也会按照我们资源设置文件中相关的设置来进行更新Pod。
回滚操作
[*]查看更新历史:使用 kubectl rollout history deployment命令查看 Deployment 的更新历史,每个更新都会有一个对应的版本号(Revision)。
[*]回滚到上一个版本:使用 kubectl rollout undo deployment命令将 Deployment 回滚到上一个稳定版本。
[*]回滚到指定版本:使用 kubectl rollout undo deployment--to-revision= 命令将 Deployment 回滚到指定的版本号。
[*]验证回滚结果:使用 kubectl rollout status命令查看回滚后的状态,确保回滚操作成功。
回滚示例
以上面Tomcat的为例,将版本回滚至8.0
查看要回滚的Deployment
# kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
deployment-tomcat 10/10 10 10 9m46s查看历史版本
在 kubectl rollout history 命令的输出里,版本号越大就代表是越新的版本
# kubectl rollout history deploy/deployment-tomcat
deployment.apps/deployment-tomcat
#版本 #变更的原因
REVISIONCHANGE-CAUSE
1 <none>#旧版本
2 <none>#新版本回滚到指定的版本
# kubectl rollout undo deployment deployment-tomcat --to-revision=1
deployment.apps/deployment-tomcat rolled back查看回滚的结果
# kubectl rollout status deploy deployment-tomcat
deployment "deployment-tomcat" successfully rolled out查看Pod
# kubectl get po
NAME READY STATUS RESTARTS AGE
deployment-tomcat-85c65466c5-5xbcn 1/1 Running 0 42s
deployment-tomcat-85c65466c5-7tb56 1/1 Running 0 42s
deployment-tomcat-85c65466c5-dpklc 1/1 Running 0 42s
deployment-tomcat-85c65466c5-k8sd6 1/1 Running 0 42s
deployment-tomcat-85c65466c5-m5kqt 1/1 Running 0 42s
deployment-tomcat-85c65466c5-rlvrz 1/1 Running 0 42s
deployment-tomcat-85c65466c5-szczs 1/1 Running 0 42s
deployment-tomcat-85c65466c5-vt89t 1/1 Running 0 42s
deployment-tomcat-85c65466c5-xrct9 1/1 Running 0 42s
deployment-tomcat-85c65466c5-xtpt6 1/1 Running 0 42s
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]