2

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

我在 3 个节点环境中运行测试:kubectl get node -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

我在: CrashLoopBackOff 时如何自动停止滚动更新? 但这里是 daemonSet 不是部署。

正如线程中所建议的,我添加了

spec:
  minReadySeconds: 120 

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

然而,最后的 3 个吊舱都崩溃了

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

完整的 daemonset 规范 YAML:kubectl get ds -n nsx-system nsx-node-agent -o yaml

api版本:应用程序/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 没有停止。

另外:我们看到 pods 的年龄远远超过 minReadySeconds

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

4

1 回答 1

0

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

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

于 2021-04-27T17:18:41.867 回答