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 定义了优先级类。

流程

  1. 通过在 kubelet-gns.yaml 文件中保存以下 YAML,在 KubeletConfig CR 中定义关闭宽限期:

    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
    #...
    1
    本例将关闭宽限期应用到具有 worker 角色的节点。
    2
    定义要关闭的常规 pod 的时间周期。
    3
    定义要关闭的关键 pod 的时间周期。
  2. 运行以下命令来创建 KubeletConfig CR:

    $ oc create -f kubelet-gns.yaml

    输出示例

    kubeletconfig.machineconfiguration.openshift.io/graceful-shutdown created

验证

  1. 使用命令行或查看 kubelet.conf 文件,查看节点的 kubelet 日志以验证宽限期配置。

    注意

    确保 shutdownGracePeriodRequestedshutdownGracePeriodCriticalPods 的日志消息与 KubeletConfig CR 中设置的值匹配。

    1. 要使用命令行查看日志,请运行以下命令,将 <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
      确保 shutdownGracePeriodRequestedshutdownGracePeriodCriticalPods 的日志消息与 KubeletConfig CR 中设置的值匹配。
    2. 要查看节点上的 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
      确保 shutdownGracePeriodRequestedshutdownGracePeriodCriticalPods 的日志消息与 KubeletConfig CR 中设置的值匹配。
  2. 在安全节点关闭过程中,您可以通过运行以下命令来验证 pod 是否安全关闭,将 <pod_name> 替换为 pod 的名称:

    $ oc describe pod <pod_name>

    输出示例

    Reason:         Terminated
    Message:        Pod was terminated in response to imminent node shutdown.

其他资源