k8s的deployment滚动更新过程
执行kubectl rollout restart deployment ecp-billing -n hycan-ecp-test命令,观察pod的变化。
·
实验说明
deployment如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: ecp-billing
namespace: hycan-ecp-test
spec:
minReadySeconds: 60
progressDeadlineSeconds: 600
replicas: 2
revisionHistoryLimit: 10
selector:
matchLabels:
app: ecp-billing
strategy:
rollingUpdate:
maxSurge: 2
maxUnavailable: 0
type: RollingUpdate
template:
metadata:
labels:
app: ecp-billing
jmx: "true"
logging: "true"
spec:
containers:
- env:
- name: PODNAME
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.name
image: swr.cn-south-1.myhuaweicloud.com/hycan-test/ecp-billing:283
imagePullPolicy: IfNotPresent
lifecycle:
preStop:
exec:
command:
- bash
- -c
- 'curl -X POST http://localhost:6009/actuator/serviceregistry?status=DOWN
-H "Content-Type: application/vnd.spring-boot.actuator.v2+json;charset=UTF-8";sleep
30'
livenessProbe:
failureThreshold: 3
httpGet:
path: /actuator/health
port: 6009
scheme: HTTP
initialDelaySeconds: 60
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 5
name: ecp-billing
ports:
- containerPort: 6009
name: http
protocol: TCP
readinessProbe:
failureThreshold: 3
httpGet:
path: /actuator/health
port: 6009
scheme: HTTP
initialDelaySeconds: 60
periodSeconds: 30
successThreshold: 1
timeoutSeconds: 5
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
imagePullSecrets:
- name: default-secret
restartPolicy: Always
schedulerName: default-scheduler
terminationGracePeriodSeconds: 30
执行kubectl rollout restart deployment ecp-billing -n hycan-ecp-test命令,观察pod的变化。
观察pod变化可以用命令:
watch -n 1 'kubectl get pod -n hycan-ecp-test -o wide | grep ecp-billing'
实验结果解析
实验结果过程:
- 执行rollout restart命令后,k8s开始创建新的replicas,新的pod处于Pending状态
- 在经过90s(readinessProbe的initialDelaySeconds+一个periodSeconds周期)后,新的pod处于Running状态
- 在经过60s(minReadySeconds)后,旧的pod处于Terminating状态,开始进行清理步骤
- 在经过30s(terminationGracePeriodSeconds)后,旧的pod被删除
补充一下容器删除的过程:
- Pod 被删除,状态置为 Terminating。
- kube-proxy 更新转发规则,将 Pod 从 service 的 endpoint 列表中摘除掉,新的流量不再转发到该 Pod。
- 如果 Pod 配置了 preStop Hook ,将会执行。
- kubelet 对 Pod 中各个 container 发送 SIGTERM 信号以通知容器进程开始优雅停止。
- 等待容器进程完全停止,如果在 terminationGracePeriodSeconds 内 (默认 30s) 还未完全停止,就发送 SIGKILL 信号强制杀死进程。
- 所有容器进程终止,清理 Pod 资源。
总结:
- deployment中的配置项会影响pod的优雅更新过程,因此我们需要了解这些配置项的含义,并根据实际情况进行配置。
- minReadySeconds:pod处于Ready状态前的最少秒数,默认30s;影响pod的删除时间
- readinessProbe:pod的健康检查,默认的initialDelaySeconds为30s,periodSeconds为10s,successThreshold为1,timeoutSeconds为5s;影响pod的Ready状态
- terminationGracePeriodSeconds:pod的优雅停止时间,默认30s;影响pod的删除时间
- progressDeadlineSeconds:deployment的最大更新时间,超过该时间,更新失败,默认600s;影响更新的成功率
- 正常的pod无法与处于Terminating状态的pod通信,因为此时pod的ip已经被释放,所以我们需要在pod的preStop Hook中进行清理工作,才能保证优雅停机。
补充: preStop Hook 与 readinessProbe 区别:
- preStop Hook 用于在 Pod 被删除之前执行一些清理工作,比如向服务注册中心注销自己,或者执行一些自定义的清理工作。
更多推荐
已为社区贡献3条内容
所有评论(0)