【发布时间】: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