6.4. 管理安全节点关闭
安全节点关闭可让 kubelet 在节点关闭过程中延迟 pod 驱除。当您配置安全节点关闭时,您可以在关闭前为 pod 定义一个时间段来完成运行的工作负载。这个宽限期可以减少在意外的节点关闭事件期间,关键工作负载被中断的情况。使用优先级类,您还可以指定 pod 关闭的顺序。
6.4.1. 关于安全节点关闭
在安全节点关闭过程中,kubelet 会向节点上运行的 pod 发送终止信号,并会延迟节点的关闭,直到所有 pod 都被驱除。如果节点意外关闭,安全节点关闭功能可以减少在这些 pod 上运行的工作负载被中断的情况。
在安全节点关闭过程中,kubelet 以两个阶段停止 pod:
- 常规 pod 终止
- 关键 pod 终止
您可以通过在 KubeletConfig 自定义资源中配置以下规格来为常规和关键 pod 定义关闭宽限期:
-
shutdownGracePeriod:指定常规和关键 pod 终止的 pod 终止的总计持续时间。 -
shutdownGracePeriodCriticalPods:指定关键 pod 终止的持续时间。这个值必须小于shutdownGracePeriod值。
例如,如果 shutdownGracePeriod 值为 30s,并且 shutdownGracePeriodCriticalPods 值为 10s,kubelet 会将节点关闭延迟为 30 秒。在关闭过程中,为正常关闭常规 pod 保留前 20 (30-10)秒,最后 10 秒被则保留下来正常关闭关键 pod。
要定义关键 pod,分配一个大于或等于 2000000000 的 pod 优先级值。要定义常规 pod,分配小于 2000000000 的 Pod 优先级值。
有关如何为 pod 定义优先级值的更多信息,请参阅附加资源部分。
6.4.2. 配置安全节点关闭
要配置安全节点关闭,请创建一个 KubeletConfig 自定义资源(CR) 来为一组节点上的 pod 指定关闭宽限期。安全节点关闭功能可最小化在这些 pod 上运行的工作负载中断。
如果没有配置安全节点关闭,则默认宽限期为 0,pod 会强制从节点驱除。
先决条件
-
您可以使用
cluster-admin角色访问集群。 - 您已为需要关键或常规分类的 pod 定义了优先级类。
流程
通过在
kubelet-gns.yaml文件中保存以下 YAML,在KubeletConfigCR 中定义关闭宽限期:apiVersion: machineconfiguration.openshift.io/v1 kind: KubeletConfig metadata: name: graceful-shutdown namespace: openshift-machine-config-operator spec: machineConfigPoolSelector: matchLabels: pools.operator.machineconfiguration.openshift.io/worker: "" 1 kubeletConfig: shutdownGracePeriod: "3m" 2 shutdownGracePeriodCriticalPods: "2m" 3 #...运行以下命令来创建
KubeletConfigCR:$ oc create -f kubelet-gns.yaml
输出示例
kubeletconfig.machineconfiguration.openshift.io/graceful-shutdown created
验证
使用命令行或查看
kubelet.conf文件,查看节点的 kubelet 日志以验证宽限期配置。注意确保
shutdownGracePeriodRequested和shutdownGracePeriodCriticalPods的日志消息与KubeletConfigCR 中设置的值匹配。要使用命令行查看日志,请运行以下命令,将
<node_name>替换为节点的名称:$ oc adm node-logs <node_name> -u kubelet
输出示例
Sep 12 22:13:46 ci-ln-qv5pvzk-72292-xvkd9-worker-a-dmbr4 hyperkube[22317]: I0912 22:13:46.687472 22317 nodeshutdown_manager_linux.go:134] "Creating node shutdown manager" shutdownGracePeriodRequested="3m0s" 1 shutdownGracePeriodCriticalPods="2m0s" shutdownGracePeriodByPodPriority=[ {Priority:0 ShutdownGracePeriodSeconds:1200} {Priority:2000000000 ShutdownGracePeriodSeconds:600}] ...- 1
- 确保
shutdownGracePeriodRequested和shutdownGracePeriodCriticalPods的日志消息与KubeletConfigCR 中设置的值匹配。
要查看节点上的
kubelet.conf文件中的日志,请运行以下命令来在节点上输入 debug 会话:$ oc debug node/<node_name>
$ chroot /host
$ cat /etc/kubernetes/kubelet.conf
输出示例
#... “memorySwap”: {}, “containerLogMaxSize”: “50Mi”, “logging”: { “flushFrequency”: 0, “verbosity”: 0, “options”: { “json”: { “infoBufferSize”: “0” } } }, “shutdownGracePeriod”: “10m0s”, 1 “shutdownGracePeriodCriticalPods”: “3m0s” } #...- 1
- 确保
shutdownGracePeriodRequested和shutdownGracePeriodCriticalPods的日志消息与KubeletConfigCR 中设置的值匹配。
在安全节点关闭过程中,您可以通过运行以下命令来验证 pod 是否安全关闭,将
<pod_name>替换为 pod 的名称:$ oc describe pod <pod_name>
输出示例
Reason: Terminated Message: Pod was terminated in response to imminent node shutdown.
其他资源