Deployment 控制器
概述
Deployment是ReplicaSet的高级别抽象,ReplicaSet控制器有的功能Deployment全部具备,ReplicaSet没有的Deployment也具备比如,它提供了滚动升级和回滚的功能。Deployment是控制多个ReplicaSet,从而可以实现无缝升级和回滚。
特点
选择器:ReplicaSet使用标签选择器来选择要管理的Pod副本。
伸缩性:Deployment高级控制器可以根据负载自动伸缩容器数量,以满足应用程序的需求。
自我修复:Deployment高级控制器可以监控容器的健康状况,并在容器出现故障时自动重启或替换容器。
负载均衡:Deployment高级控制器可以通过负载均衡算法,将请求分发到不同的容器实例上,以提高应用程序的性能和可用性。
版本控制:Deployment可以指定多个ReplicaSet,每个ReplicaSet可以控制不同版本的Pod,从而实现灰度发布和回滚。
声明式:指直接修改资源清单yaml文件,然后通过 apply ,就可以更改资源。
工作原理
Deployment控制器建立在ReplicaSet控制器之上,管理多个ReplicaSet,每次更新镜像版本,都会生成一个新的ReplicaSet,把旧的ReplicaSet替换掉,多个ReplicaSet同时存在,但只运行一个ReplicaSet。
如上图所示:ReplicaSet V1版本控制了三个Pod,ReplicaSet V1版本删除一个Pod,会在ReplicaSet V2版本新建一个Pod,以此类推,直到ReplicaSet V2版本完全替换完。
如果ReplicaSet V2版本更新上去存在问题,还可以回滚,Deployment建立在ReplicaSet之上,多个ReplicaSet组成一个Deployment,但只有一个ReplicaSet处于活跃状态。
Deployment YAML编写及参数解释
使用explain命令查看定义 可以查看 deployment控制器字段说明:
kubectl explain deployment
Deployment YAML资源清单内容:
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-deployment-1
labels:
env: uat
spec:
replicas: 3
minReadySeconds: 10 # 更新场景,等待时间,如果没有设置K8S会假设该容器启动起来后就提供服务了
paused: # 暂停,当更新Pod时,先暂停,而不是立马更新
progressDeadlineSeconds: 60 # 更新场景,等待时间超过此值,状态标记False,并说明原因,但是它并不会阻止 Deployment 继续进行卡住后面的操作
strategy:
rollingUpdate: # 滚动更新,定义滚动更新方式,也就是pod能多几个,少几个
maxSurge: 20% # 允许更新中,最多超过Pod数值
maxUnavailable: 20% # 允许更新中,最多允许几个不可用
selector:
matchLabels:
app: demo-nginx
template:
metadata:
labels:
app: demo-nginx
spec:
containers:
- name: demo-nginx
image: nginx
imagePullPolicy: IfNotPresent
startupProbe: # 启动探测
tcpSocket:
port: 80
livenessProbe: # 存活探测
httpGet:
port: 80
path: /index.html
readinessProbe: # 就绪探测
httpGet:
port: 80
path: "/index.html"
核心参数详解
spec.minReadySeconds
:更新场景,等待时间,如果没有设置K8S会假设该容器启动起来后就提供服务了。spec.paused
: 暂停,当更新Pod时,先暂停,而不是立马更新,后面金丝雀发布要用到spec.progressDeadlineSeconds
:更新场景,等待时间超过此值,状态标记False,并说明原因,但是它并不会阻止 Deployment 继续进行卡住后面的操作spec.strategy.rollingUpdate
:滚动更新,定义滚动更新方式,也就是pod能多几个,少几个spec.strategy.rollingUpdate.maxSurge
:指定在更新期间可以创建的新Pod的最大数量。例如,如果maxSurge设置为1,而Deployment中有3个Pod,则在更新期间可以创建4个Pod,其中3个是旧的Pod,1个是新的Pod。spec.strategy.rollingUpdate.maxUnavailable
:指定在更新期间可以同时停止的旧Pod的最大数量。例如,如果maxUnavailable设置为1,而Deployment中有3个Pod,则在更新期间可以停止2个Pod,其中1个是旧的Pod,1个是新的Pod。
Deployment更新策略:
Deployment目前支持两种更新策略
Recreate:重建式更新,把Pod全部删除,在重新创建,风险很大,不建议使用
rollingUpdate:滚动式更新,批量替换更新,平滑升级,用户无感知
Deployment更新策略百分比方式计算公式:
假设有5个副本,最多一个不可用,就表示最少有4个可用
maxSurge: 25% 5*25%=1.25(~=2) 5+2=7个可用
maxUnavailable: 25% 5%25%=1.25(~=1) 5-1=4个不可用
Deployment针对WEB站点滚动更新
滚动更新是一种自动化较高的更新方式,即一批一批的更新Pod资源,用户体验比较平滑。滚动更新使用 spec.strategy.rollingUpdate 字段来定义。
基于上面YAML资源清单进行滚动更新,更换镜像版本为V2 YAML如下:
cat web-deployment.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-deployment
labels:
env: uat
spec:
replicas: 5
minReadySeconds: 10
progressDeadlineSeconds: 60
strategy:
rollingUpdate:
maxSurge: 30% # 5*30%=1.5(~=2), 2+5=7,更新期间最多创建7个Pod
maxUnavailable: 20% # 5*20%=1, 1-5=4,更新期间最多停止4个Pod
selector:
matchLabels:
app: web-nginx
template:
metadata:
labels:
app: web-nginx
spec:
containers:
- name: web-nginx
image: web:v2 # 版本更新
imagePullPolicy: IfNotPresent
startupProbe:
tcpSocket:
port: 80
livenessProbe:
httpGet:
port: 80
path: /index.html
readinessProbe:
httpGet:
port: 80
path: "/index.html"
执行更新命令
kubectl apply -f web-deployment.yaml
Deployment针对WEB站点回滚版本
查看历史版本:
kubectl rollout history deployment web-deployment
回滚版本
kubectl rollout undo deployment web-deployment --to-revision=1