零停机pod更新

零停机pod更新

中断原因:

1、新建Pod

Pod running 后被加入到 service对应的Endpoint 后端

中断原因

请求通过service转发到 Pod 中,但是 Pod 业务代码还未初始化完毕,无法处理请求,导致服务中断 。

解决办法

为 pod 配置就绪检测,等待业务代码初始化完毕后后 再将pod加入到Endpoint后端。

2、删除Pod

  1. pod 状态变更:将 Pod 设置为 Terminating 状态,并从所有 Service 的 Endpoints 列表中删除。此时,Pod 停止获得新的流量,但在 Pod 中运行的容器不会受到影响;
  2. 执行 preStop Hook:Pod 删除时会触发 preStop Hook,preStop Hook 支持 bash 脚本、TCP 或 HTTP 请求;
  3. 发送 SIGTERM 信号:向 Pod 中的容器发送 SIGTERM 信号;
  4. 等待指定的时间:terminationGracePeriodSeconds 字段用于控制等待时间,默认值为 30 秒。该步骤与 preStop Hook 同时执行,因此 terminationGracePeriodSeconds 需要大于 preStop 的时间,否则会出现 preStop 未执行完毕,pod 就被 kill 的情况;
  5. 发送 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
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值