实验说明

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'

实验结果解析

实验结果过程:

  1. 执行rollout restart命令后,k8s开始创建新的replicas,新的pod处于Pending状态
  2. 在经过90s(readinessProbe的initialDelaySeconds+一个periodSeconds周期)后,新的pod处于Running状态
  3. 在经过60s(minReadySeconds)后,旧的pod处于Terminating状态,开始进行清理步骤
  4. 在经过30s(terminationGracePeriodSeconds)后,旧的pod被删除

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

补充一下容器删除的过程:

  1. Pod 被删除,状态置为 Terminating。
  2. kube-proxy 更新转发规则,将 Pod 从 service 的 endpoint 列表中摘除掉,新的流量不再转发到该 Pod。
  3. 如果 Pod 配置了 preStop Hook ,将会执行。
  4. kubelet 对 Pod 中各个 container 发送 SIGTERM 信号以通知容器进程开始优雅停止。
  5. 等待容器进程完全停止,如果在 terminationGracePeriodSeconds 内 (默认 30s) 还未完全停止,就发送 SIGKILL 信号强制杀死进程。
  6. 所有容器进程终止,清理 Pod 资源。

总结:

  1. 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;影响更新的成功率
  1. 正常的pod无法与处于Terminating状态的pod通信,因为此时pod的ip已经被释放,所以我们需要在pod的preStop Hook中进行清理工作,才能保证优雅停机。

补充: preStop Hook 与 readinessProbe 区别:

  1. preStop Hook 用于在 Pod 被删除之前执行一些清理工作,比如向服务注册中心注销自己,或者执行一些自定义的清理工作。
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐