k8s 滚动部署学习总结
滚动发布
滚动发布配置总结
定义:
滚动升级(Rolling update) 就是指每次更新部分Pod,而不是在同一时刻将该Service下面的所有Pod shutdown,然后去更新逐个更新可以避免将业务中断
使用Deployments实现系统部署
主要配置:
minReadySeconds: 30
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
type: RollingUpdate
strategy.type
指定部署策略可以是"Recreate"或者是 “RollingUpdate”。"RollingUpdate"是默认值。
- Recreate: 重建式更新,在创建新 Pod 之前,所有现有的 Pod 会被杀死
- RollingUpdate:滚动更新,简单定义 更新期间pod最多有几个等。可以指定maxUnavailable 和 maxSurge 来控制 rolling update 进程
Recreate会导致站点的停机,Recreate策略适合:不面向用户,可接受少了停机时间
RollingUpdate 可以让服务在接受用户流量的情况下,部署新的版本不出现停机
minReadySeconds
minReadySeconds是一个可选字段,用于指定新创建的 Pod 在没有任意容器崩溃情况下的最小就绪时间, 只有超出这个时间 Pod 才被视为可用。(如果没有设置该值,Kubernetes会假设该容器启动起来后就提供服务了)默认值为 0
例如
minReadySeconds: 30 Pod就绪30秒后视为可用
可以结合readinessProbe 就绪探针一起使用,就绪探针可参考《k8s-故障转移 livenessProbe & readinessProbe 学习总结》
strategy.rollingUpdate.maxSurge
滚动升级过程中最多可以比原始Deployments中的replicas设置多出的POD数量(注意maxSurge值不能为0 默认值为 25%)
例如:
maxSurage=1,replicas=2,则表示Kubernetes会先启动1一个新的Pod后才删掉一个旧的POD,
整个升级过程中最多会有2+1个POD。也可以使用百分比例如:10%
strategy.rollingUpdate.maxUnavaible
用来指定滚动升级过程中最多有多少个POD处于无法提供服务的状态,该值可以是绝对数字(例如,5),也可以是所需 Pod 的百分比(例如,10%)(注意maxUnavaible值不能为0 默认值为 25%)
例如:maxUnavaible=1,则表示Kubernetes整个升级过程中最多会有1个POD处于无法服务的状态,
可以保证有足够的pod(或者认为是足够的性能)提供服务。
滚动发布实例
Deployment 配置文件如下
apiVersion: apps/v1
kind: Deployment
metadata:
name: order-service-deployment
spec:
replicas: 2
selector:
matchLabels: #定义匹配的标签,必须要设置 只能配置一个(template.metadata.labels 中的一个)
app: order-service #匹配的目标标签,
strategy:
rollingUpdate:
maxSurge: 1 #整个升级过程中最多会有2+1个POD replicas=2
maxUnavailable: 1 #最多只能有一个Pod不能使用
type: RollingUpdate #指定策略为滚动升级
template:
metadata:
labels:
app: order-service
version: "2ffff22" #注意version 可以实现apply -f 镜像latest
#定义pod信息
spec:
imagePullSecrets:
- name: myaliyunsecret
containers:
- name: order-service-runtime #容器名称(自定义)
image: registry.cn-hangzhou.aliyuncs.com/jimliu/order-service:latest
# 就绪探测 控制Pod是否就绪 Service是否能够使用Pod
readinessProbe:
# 会访问localhost:5555/startok 这个http请求
httpGet:
#scheme: http https 默认http
path: /startok
port: 5555
# 可以自定义请求头
httpHeaders:
- name: Custom-Header
value: Awesome
initialDelaySeconds: 5 #延迟探测时间
timeoutSeconds: 1
periodSeconds: 5 #访问频率
failureThreshold: 3
注意给template添加一个version自定义label,这样可以使用helm或者其他模板方式更新此字段 否则如果镜像是latest apply -f 会提示 unchanged
开始部署前
当前版本
重新创建镜像并推送
docker build -t order-service .
docker tag order-service registry.cn-hangzhou.aliyuncs.com/jimliu/order-service
docker push registry.cn-hangzhou.aliyuncs.com/jimliu/order-service:latest
开始滚动部署
可以看到此时已经停掉了一个pod 并正在创建两个新的pod
- 满足maxSurage=1,replicas=2整个升级过程中最多会有2+1=3个POD
- 满足maxUnavaible=1 最多只能有1个POD不可用
访问 http://192.168.0.160:5555/version 系统整体还是可以访问,并未中断服务
使用 kubectl rollout status deployment order-service-deployment 可以看到滚动部署的状态
部署完成后可以看到原来的pod已经被替换为新的pod
访问 http://192.168.0.160:5555/version 版本已经更新