【问题标题】:Why k8s rolling update didn't stop update when CrashLoopBackOff pods more than maxUnavailable为什么当 CrashLoopBackOff pod 超过 maxUnavailable 时 k8s 滚动更新没有停止更新
【发布时间】:2021-07-20 16:26:30
【问题描述】:

我正在尝试利用 k8s daemonset 的滚动更新来在 daemonset 的 spec.template 字段发生更改时进行自动滚动更新。我故意为 pod 放置了一个无效的图像,以使 pod 无法正确启动。我想当不可用的 pod 数量超过 maxUnavailable 中定义的数量时,滚动更新可能会停止。不幸的是,这并没有发生,并且 pod 会保持更新,直到所有 pod 进入 CrashLoopBackOff。

我在 3 个节点环境中运行我的测试: kubectl 获取节点 -A

姓名 状态 角色 年龄 版本 wdc-rdops-vm05-dhcp-74-190 就绪 65d v1.18.0 wdc-rdops-vm05-dhcp-86-61 就绪主控 65d v1.18.0 wdc-rdops-vm05-dhcp-93-214 就绪 65d v1.18.0

我发现了一个类似的线程: How to automatically stop rolling update when CrashLoopBackOff? 但这里是为 daemonSet 而不是部署。

正如帖子中所建议的, 我添加了

spec:
  minReadySeconds: 120 

为了确保容器运行良好以设置 pod 可用或不可用状态。

但是,最后 3 个 pod 崩溃了

nsx-system   nsx-node-agent-9cl2v       0/3     CrashLoopBackOff      3          23s
nsx-system   nsx-node-agent-c95wb       3/3     Running               3          11m
nsx-system   nsx-node-agent-p58vs       3/3     Running               3          11m

第一个部署的 pod 不健康超过 120 秒,它应该不可用。 然而,更新并没有像预期的那样停止,它一直持续到所有 pod 都被 replca 但崩溃了:

nsx-system     nsx-node-agent-9cl2v             0/3     CrashLoopBackOff        45         15m 
nsx-system     nsx-node-agent-6mlmq             0/3     CrashLoopBackOff        48         2m46s
nsx-system     nsx-node-agent-9fzcc             0/3     CrashLoopBackOff        57         2m59s

完整的守护进程规范 YAML: kubectl get ds -n nsx-system nsx-node-agent -o yaml

api版本:apps/v1
种类:守护程序集
元数据:
  创建时间戳:“2021-02-21T11:28:03Z”
  世代:101
  标签:
    组件:nsx-node-agent
    层级:nsx 网络
    版本:v1
  管理字段:
  - api版本:应用程序/v1
    字段类型:FieldsV1
    字段V1:
      f:元数据:
        f:注释:
          .: {}
          f:deprecated.daemonset.template.generation: {}
          f:kubectl.kubernetes.io/last-applied-configuration: {}
        f:标签:
          .: {}
          f:组件:{}
          f:层:{}
          f:版本:{}
      f:规格:
        f:revisionHistoryLimit: {}
        f:选择器:
          f:匹配标签:
            .: {}
            f:组件:{}
            f:层:{}
            f:版本:{}
        f:模板:
          f:元数据:
            f:注释:
              .: {}
              f:container.apparmor.security.beta.kubernetes.io/nsx-node-agent: {}
            f:标签:
              .: {}
              f:组件:{}
              f:层:{}
              f:版本:{}
          f:规格:
            f:容器:
              k:{"name":"nsx-kube-proxy"}:
                .: {}
                f:命令:{}
                f:环境:
                  .: {}
                  k:{"name":"CONTAINER_NAME"}:
                    .: {}
                    f:名称:{}
                    f:值:{}
                  k:{"name":"POD_NAME"}:
                    .: {}
                    f:名称:{}
                    f:值来自:
                      .: {}
                      f:fieldRef:
                        .: {}
                        f:api版本:{}
                        f:fieldPath: {}
                f:imagePullPolicy: {}
                f:livenessProbe:
                  .: {}
                  f:执行:
                    .: {}
                    f:命令:{}
                  f:failureThreshold: {}
                  f:initialDelaySeconds: {}
                  f:周期秒:{}
                  f:successThreshold: {}
                  f:timeoutSeconds: {}
                f:名称:{}
                f:资源:{}
                f:安全上下文:
                  .: {}
                  f:能力:
                    .: {}
                    f:添加:{}
                f:terminationMessagePath: {}
                f:terminationMessagePolicy: {}
                f:volumeMounts:
                  .: {}
                  k:{"mountPath":"/etc/nsx-ujo"}:
                    .: {}
                    f:mountPath: {}
                    f:名称:{}
                    f:readOnly: {}
                  k:{"mountPath":"/var/log/nsx-ujo"}:
                    .: {}
                    f:mountPath: {}
                  k:{"mountPath":"/var/run/openvswitch"}:
                    .: {}
                    f:mountPath: {}
                    f:名称:{}
              k:{"name":"nsx-node-agent"}:
                .: {}
                f:命令:{}
                f:环境:
                  .: {}
                  k:{"name":"CONTAINER_NAME"}:
                    .: {}
                    f:名称:{}
                    f:值:{}
                  k:{"name":"POD_NAME"}:
                    .: {}
                    f:名称:{}
                    f:值来自:
                      .: {}
                      f:fieldRef:
                        .: {}
                        f:api版本:{}
                        f:fieldPath: {}
                f:imagePullPolicy: {}
                f:livenessProbe:
                  .: {}
                  f:执行:{}
                  f:failureThreshold: {}
                  f:initialDelaySeconds: {}
                  f:周期秒:{}
                  f:successThreshold: {}
                  f:timeoutSeconds: {}
                f:名称:{}
                f:资源:{}
                f:安全上下文:
                  .: {}
                  f:能力:
                    .: {}
                    f:添加:{}
                f:terminationMessagePath: {}
                f:terminationMessagePolicy: {}
                f:volumeMounts:
                  .: {}
                  k:{"mountPath":"/etc/nsx-ujo"}:
                    .: {}
                    f:mountPath: {}
                    f:名称:{}
                    f:readOnly: {}
                  k:{"mountPath":"/host/etc/os-release"}:
                    .: {}
                    f:mountPath: {}
                    f:名称:{}
                    f:readOnly: {}
                  k:{"mountPath":"/host/proc"}:
                    .: {}
                    f:mountPath: {}
                    f:名称:{}
                    f:readOnly: {}
                  k:{"mountPath":"/host/var/run/netns"}:
                    .: {}
                    f:mountPath: {}
                    f:mountPropagation: {}
                    f:名称:{}
                  k:{"mountPath":"/var/lib/kubelet/device-plugins/"}:
                    .: {}
                    f:mountPath: {}
                    f:名称:{}
                    f:readOnly: {}
                  k:{"mountPath":"/var/log/nsx-ujo"}:
                    .: {}
                    f:mountPath: {}
                  k:{"mountPath":"/var/run/nsx-ujo"}:
                    .: {}
                    f:mountPath: {}
                    f:名称:{}
                  k:{"mountPath":"/var/run/openvswitch"}:
                    .: {}
                    f:mountPath: {}
                    f:名称:{}
              k:{"name":"nsx-ovs"}:
                .: {}
                f:命令:{}
                f:imagePullPolicy: {}
                f:livenessProbe:
                  .: {}
                  f:执行:
                    .: {}
                    f:命令:{}
                  f:failureThreshold: {}
                  f:initialDelaySeconds: {}
                  f:周期秒:{}
                  f:successThreshold: {}
                  f:timeoutSeconds: {}
                f:名称:{}
                f:资源:{}
                f:安全上下文:
                  .: {}
                  f:能力:
                    .: {}
                    f:添加:{}
                f:terminationMessagePath: {}
                f:terminationMessagePolicy: {}
                f:volumeMounts:
                  .: {}
                  k:{"mountPath":"/etc/nsx-ujo"}:
                    .: {}
                    f:mountPath: {}
                    f:名称:{}
                    f:readOnly: {}
                  k:{"mountPath":"/etc/openvswitch"}:
                    .: {}
                    f:mountPath: {}
                    f:名称:{}
                    f:子路径:{}
                  k:{"mountPath":"/host/etc/openvswitch"}:
                    .: {}
                    f:mountPath: {}
                    f:名称:{}
                  k:{"mountPath":"/host/etc/os-release"}:
                    .: {}
                    f:mountPath: {}
                    f:名称:{}
                    f:readOnly: {}
                  k:{"mountPath":"/lib/modules"}:
                    .: {}
                    f:mountPath: {}
                    f:名称:{}
                    f:readOnly: {}
                  k:{"mountPath":"/sys"}:
                    .: {}
                    f:mountPath: {}
                    f:名称:{}
                    f:readOnly: {}
                  k:{"mountPath":"/var/log/nsx-ujo"}:
                    .: {}
                    f:mountPath: {}
                  k:{"mountPath":"/var/log/openvswitch"}:
                    .: {}
                    f:mountPath: {}
                    f:名称:{}
                    f:子路径:{}
                  k:{"mountPath":"/var/run/openvswitch"}:
                    .: {}
                    f:mountPath: {}
                    f:名称:{}
            f:dnsPolicy: {}
            f:hostNetwork: {}
            f:restartPolicy: {}
            f:调度程序名称:{}
            f:securityContext: {}
            f:serviceAccount: {}
            f:serviceAccountName: {}
            f:terminationGracePeriodSeconds: {}
            f:容忍度:{}
            f:卷:
              .: {}
              k:{“名称”:“设备插件”}:
                .: {}
                f:主机路径:
                  .: {}
                  f:路径:{}
                  f:类型:{}
                f:名称:{}
              k:{“名称”:“主机模块”}:
                .: {}
                f:主机路径:
                  .: {}
                  f:路径:{}
                  f:类型:{}
                f:名称:{}
              k:{"name":"host-original-ovs-db"}:
                .: {}
                f:主机路径:
                  .: {}
                  f:路径:{}
                  f:类型:{}
                f:名称:{}
              k:{"name":"host-os-release"}:
                .: {}
                f:主机路径:
                  .: {}
                  f:路径:{}
                  f:类型:{}
                f:名称:{}
              k:{“名称”:“主机系统”}:
                .: {}
                f:主机路径:
                  .: {}
                  f:路径:{}
                  f:类型:{}
                f:名称:{}
              k:{"name":"host-var-log-ujo"}:
                .: {}
                f:主机路径:
                  .: {}
                  f:路径:{}
                  f:类型:{}
                f:名称:{}
              k:{"name":"netns"}:
                .: {}
                f:主机路径:
                  .: {}
                  f:路径:{}
                  f:类型:{}
                f:名称:{}
              k:{"name":"openvswitch"}:
                .: {}
                f:主机路径:
                  .: {}
                  f:路径:{}
                  f:类型:{}
                f:名称:{}
              k:{"name":"proc"}:
                .: {}
                f:主机路径:
                  .: {}
                  f:路径:{}
                  f:类型:{}
                f:名称:{}
              k:{"name":"projected-volume"}:
                .: {}
                f:名称:{}
                f:预计:
                  .: {}
                  f:defaultMode: {}
                  f:来源:{}
              k:{"name":"var-run-ujo"}:
                .: {}
                f:主机路径:
                  .: {}
                  f:路径:{}
                  f:类型:{}
                f:名称:{}
        f:更新策略:
          f:滚动更新:
            .: {}
            f:最大不可用:{}
          f:类型:{}
    经理:kubectl
    操作:更新
    时间:“2021-04-19T08:07:54Z”
  - api版本:应用程序/v1
    字段类型:FieldsV1
    字段V1:
      f:规格:
        f:minReadySeconds: {}
        f:模板:
          f:规格:
            f:容器:
              k:{"name":"nsx-kube-proxy"}:
                f:图像:{}
                f:volumeMounts:
                  k:{"mountPath":"/var/log/nsx-ujo"}:
                    f:名称:{}
              k:{"name":"nsx-node-agent"}:
                f:图像:{}
                f:livenessProbe:
                  f:执行:
                    f:命令:{}
                f:volumeMounts:
                  k:{"mountPath":"/var/log/nsx-ujo"}:
                    f:名称:{}
              k:{"name":"nsx-ovs"}:
                f:图像:{}
                f:volumeMounts:
                  k:{"mountPath":"/var/log/nsx-ujo"}:
                    f:名称:{}
      f:状态:
        f:desiredNumberScheduled: {}
    经理:nsx-ncp-operator
    操作:更新
    时间:“2021-04-27T10:01:23Z”
  - api版本:应用程序/v1
    字段类型:FieldsV1
    字段V1:
      f:状态:
        f:currentNumberScheduled: {}
        f:numberReady: {}
        f:数字不可用:{}
        f:observedGeneration: {}
        f:updatedNumberScheduled: {}
    经理:kube-controller-manager
    操作:更新
    时间:“2021-04-27T10:15:28Z”
  名称:nsx 节点代理
  命名空间:nsx 系统
  资源版本:“14594084”
  selfLink:/apis/apps/v1/namespaces/nsx-system/daemonsets/nsx-node-agent
  用户名:e3dd0951-1b31-4095-8c27-56ec9780d94e
规格:
  minReadySeconds:120
  修订历史限制:10
  选择器:
    匹配标签:
      组件:nsx-node-agent
      层级:nsx 网络
      版本:v1
  模板:
    元数据:
      注释:
        container.apparmor.security.beta.kubernetes.io/nsx-node-agent: localhost/node-agent-apparmor
      创建时间戳:空
      标签:
        组件:nsx-node-agent
        层级:nsx 网络
        版本:v1
    规格:
      容器:
      - 命令:
        - start_node_agent
        环境:
        - 名称:POD_NAME
          值来自:
            字段参考:
              api版本:v1
              字段路径:元数据名称
        - 名称:CONTAINER_NAME
          值:nsx-node-agent
        图片:registry.access.redhat.com/ubi8/ubi:latest
        imagePullPolicy: IfNotPresent
        活性探针:
          执行:
            命令:
            - /bin/sh
            - -C
            - check_pod_liveness nsx-node-agent 5
          失败阈值:5
          初始延迟秒数:60
          periodSeconds: 10
          成功阈值:1
          超时秒数:5
        名称:nsx 节点代理
        资源: {}
        安全上下文:
          能力:
            添加:
            - NET_ADMIN
            - SYS_ADMIN
            - SYS_PTRACE
            - DAC_READ_SEARCH
            - NET_RAW
            - AUDIT_WRITE
        终止消息路径:/dev/termination-log
        终止消息策略:文件
        卷装:
        - 安装路径:/etc/nsx-ujo
          名称:预计体积
          只读:真
        - 安装路径:/var/run/openvswitch
          名称:openvswitch
        - 安装路径:/var/run/nsx-ujo
          名称:var-run-ujo
        - 安装路径:/host/var/run/netns
          mountPropagation:HostToContainer
          名称:netns
        - 挂载路径:/host/proc
          名称:过程
          只读:真
        - 安装路径:/var/lib/kubelet/device-plugins/
          名称:设备插件
          只读:真
        - 挂载路径:/host/etc/os-release
          名称:主机操作系统发布
          只读:真
        - 安装路径:/var/log/nsx-ujo
          名称:host-var-log-ujo
      - 命令:
        - start_kube_proxy
        环境:
        - 名称:POD_NAME
          值来自:
            字段参考:
              api版本:v1
              字段路径:元数据名称
        - 名称:CONTAINER_NAME
          值:nsx-kube-proxy
        图片:registry.access.redhat.com/ubi8/ubi:latest
        imagePullPolicy: IfNotPresent
        活性探针:
          执行:
            命令:
            - /bin/sh
            - -C
            - check_pod_liveness nsx-kube-proxy 5
          失败阈值:5
          初始延迟秒数:10
          periodSeconds: 10
          成功阈值:1
          超时秒数:5
        名称:nsx-kube-proxy
        资源: {}
        安全上下文:
          能力:
            添加:
            - NET_ADMIN
            - SYS_ADMIN
            - SYS_PTRACE
            - DAC_READ_SEARCH
            - NET_RAW
            - AUDIT_WRITE
        终止消息路径:/dev/termination-log
        终止消息策略:文件
        卷装:
        - 安装路径:/etc/nsx-ujo
          名称:预计体积
          只读:真
        - 安装路径:/var/run/openvswitch
          名称:openvswitch
        - 安装路径:/var/log/nsx-ujo
          名称:host-var-log-ujo
      - 命令:
        - start_ovs
        图片:registry.access.redhat.com/ubi8/ubi:latest
        imagePullPolicy: IfNotPresent
        活性探针:
          执行:
            命令:
            - /bin/sh
            - -C
            - check_pod_liveness nsx-ovs 10
          失败阈值:3
          初始延迟秒数:10
          periodSeconds: 10
          成功阈值:1
          超时秒数:10
        名称:nsx-ovs
        资源: {}
        安全上下文:
          能力:
            添加:
            - NET_ADMIN
            - SYS_ADMIN
            - SYS_NICE
            - SYS_MODULE
        终止消息路径:/dev/termination-log
        终止消息策略:文件
        卷装:
        - 安装路径:/etc/nsx-ujo
          名称:预计体积
          只读:真
        - 挂载路径:/etc/openvswitch
          名称:var-run-ujo
          子路径:openvswitch-db
        - 安装路径:/var/run/openvswitch
          名称:openvswitch
        - 挂载路径:/sys
          名称:主机系统
          只读:真
        - 挂载路径:/host/etc/openvswitch
          名称:host-original-ovs-db
        - 安装路径:/lib/modules
          名称:主机模块
          只读:真
        - 挂载路径:/host/etc/os-release
          名称:主机操作系统发布
          只读:真
        - 挂载路径:/var/log/openvswitch
          名称:host-var-log-ujo
          子路径:openvswitch
        - 安装路径:/var/log/nsx-ujo
          名称:host-var-log-ujo
      dnsPolicy:集群优先
      主机网络:真
      重启策略:总是
      调度程序名称:默认调度程序
      安全上下文:{}
      serviceAccount:nsx-node-agent-svc-account
      serviceAccountName:nsx-node-agent-svc-account
      终止GracePeriodSeconds:60
      容忍度:
      - 效果:NoSchedule
        关键:node-role.kubernetes.io/master
      - 效果:NoSchedule
        关键:node.kubernetes.io/not-ready
      - 效果:NoSchedule
        关键:node.kubernetes.io/unreachable
      卷:
      - 名称:预计体积
        预计:
          默认模式:420
          来源:
          - 配置地图:
              项目:
              - 键:ncp.ini
                路径:ncp.ini
              名称:nsx-node-agent-config
          - 配置地图:
              项目:
              - 关键:版本
                路径:版本
              名称:nsx-ncp-版本配置
      - 主机路径:
          路径:/var/run/openvswitch
          类型: ””
        名称:openvswitch
      - 主机路径:
          路径:/var/run/nsx-ujo
          类型: ””
        名称:var-run-ujo
      - 主机路径:
          路径:/var/run/netns
          类型: ””
        名称:netns
      - 主机路径:
          路径:/proc
          类型: ””
        名称:过程
      - 主机路径:
          路径:/var/lib/kubelet/device-plugins/
          类型: ””
        名称:设备插件
      - 主机路径:
          路径:/var/log/nsx-ujo
          类型:目录或创建
        名称:host-var-log-ujo
      - 主机路径:
          路径:/sys
          类型: ””
        名称:主机系统
      - 主机路径:
          路径:/lib/modules
          类型: ””
        名称:主机模块
      - 主机路径:
          路径:/etc/openvswitch
          类型: ””
        名称:host-original-ovs-db
      - 主机路径:
          路径:/etc/os-release
          类型: ””
        名称:主机操作系统发布
  更新策略:
    滚动更新:
      最大不可用:1
    类型:滚动更新
状态:
  currentNumberScheduled: 3
  预定数量:3
  未安排的人数:0
  号码就绪:0
  数量不可用:3
  观察到的世代:101
  更新人数计划:3

ds 输出如下: kc get ds -n nsx-system -w

NAME                DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
nsx-node-agent      3         3         0       3            0           <none>          64d

不明白为什么不可用的pod数量超过maxUnavailable:1时k8s没有停止。

此外: 我们看到 pod 的年龄远远超过 minReadySeconds

看来,k8 的滚动更新策略不符合定义的规范?它不应该允许这个 滚动更新时会发生的情况。

【问题讨论】:

  • 我对这里的DaemonSet object spec 有点困惑:似乎您还需要设置maxSurge: 1,但这是 k8s 1.21 中的一个 alpha 字段,可能不一定在您的集群中可用.
  • 您好@TimDeng,欢迎来到 Stack Overflow!您能否通过编辑您的问题来分享您的完整 yaml 配置?另外,您使用的是哪个版本的 k8s,它在哪里运行?
  • 感谢您的建议,我已经为我的问题添加了 k8s 版本:1.18 和完整的 ds YAML 配置。
  • 是的,我发现 maxSurge 在 k8s: 1.18 中不可用,正如 David 指出的那样

标签: kubernetes daemonset


【解决方案1】:

我没有看到您的清单中定义的就绪探测。如果没有就绪探测,Kubernetes 将在进程运行时立即认为一个 pod 已“就绪”,并在 RollingUpdate 期间继续终止其他 pod。

maxUnavailable 设置为 1 的 pod 上的就绪性探测失败应该会停止更新 - 但如果没有这样的探测,则不会通知集群 pod 实际上还没有准备好接受流量。

【讨论】:

  • 不是“一旦安排好”,而是当进程运行时。
  • 是的,很明显。固定的。谢谢。
  • 我为就绪探测设置了“minReadySeconds: 120”。据我了解,pod 应该至少运行 120 秒,然后才被视为可用。但我们可以看到 nsx-system nsx-node-agent-9cl2v 0/3 CrashLoopBackOff 3 23s 部署的第一个 pod 运行不佳超过 120 秒。
猜你喜欢
  • 2019-02-06
  • 1970-01-01
  • 2018-12-30
  • 2020-04-12
  • 1970-01-01
  • 2020-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多