零停机pod更新
中断原因:
1、新建Pod
Pod running 后被加入到 service对应的Endpoint 后端
中断原因:
请求通过service转发到 Pod 中,但是 Pod 业务代码还未初始化完毕,无法处理请求,导致服务中断 。
解决办法:
为 pod 配置就绪检测,等待业务代码初始化完毕后后 再将pod加入到Endpoint后端。
2、删除Pod
- pod 状态变更:将 Pod 设置为 Terminating 状态,并从所有 Service 的 Endpoints 列表中删除。此时,Pod 停止获得新的流量,但在 Pod 中运行的容器不会受到影响;
- 执行 preStop Hook:Pod 删除时会触发 preStop Hook,preStop Hook 支持 bash 脚本、TCP 或 HTTP 请求;
- 发送 SIGTERM 信号:向 Pod 中的容器发送 SIGTERM 信号;
- 等待指定的时间:terminationGracePeriodSeconds 字段用于控制等待时间,默认值为 30 秒。该步骤与 preStop Hook 同时执行,因此 terminationGracePeriodSeconds 需要大于 preStop 的时间,否则会出现 preStop 未执行完毕,pod 就被 kill 的情况;
- 发送 SIGKILL 信号:等待指定时间后,向 pod 中的容器发送 SIGKILL 信号,删除 pod。
中断原因:
上述 1、2、3、4步骤同时进行,因此有可能存在 Pod 收到 SIGTERM 信号并且停止工作后,还未从 Endpoints 中移除的情况。此时,请求从 service转发到 pod 中,而 Pod 已经停止工作,因此会出现服务中断
解决办法:
为 pod 配置 preStop Hook,使 Pod 收到 SIGTERM 时 sleep 一段时间而不是立刻停止工作,从而确保从 service 转发的流量还可以继续被 Pod 处理。
3、滚动更新策略
maxSurge:和期望ready的副本数比,超过期望副本数最大比例(或最大值),这个值调的越大,副本更新速度越快。
maxUnavailable:和期望ready的副本数比,不可用副本数最大比例(或最大值),这个值越小,越能保证服务稳定,更新越平滑。
中断原因:
若设置不合理,可能导致服务中断,比如repicas为1,maxSurge和maxUnavailable均设置为1,则可能出现无可用pod,导致服务中断。
解决办法:
建议使用默认值:
maxSurge: 25%
maxUnavailable: 25%
解决办法
针对上述的中断原因,可使用以下配置处理:(滚动更新策略、就绪检测、配置preStop Hook)
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: dev-user-backend
release: dev-user-backend
name: dev-user-backend
namespace: dev
spec:
progressDeadlineSeconds: 600
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
app: dev-user-backend
release: dev-user-backend
strategy:
# 滚动更新策略
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
labels:
app: dev-user-backend
release: dev-user-backend
spec:
containers:
- image: harbor.xxx.xxx/dev/user-backend:dev398-DEVELOP
imagePullPolicy: IfNotPresent
name: user-backend
ports:
- containerPort: 8127
name: 8127tcp00
protocol: TCP
# 就绪检测
readinessProbe:
failureThreshold: 5
httpGet:
path: /user/actuator/health
port: 8127
scheme: HTTP
initialDelaySeconds: 60
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 1
resources:
limits:
cpu: "1"
memory: 2Gi
requests:
cpu: 200m
memory: 1Gi
securityContext:
capabilities: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
securityContext:
fsGroup: 0
runAsUser: 0
# 配置preStop Hook
lifecycle:
preStop:
exec:
command:
- sleep
- 30
terminationGracePeriodSeconds: 60