我正在尝试使用 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 的滚动更新策略不符合定义的规范?滚动更新时不应允许这种情况发生。