6.4. グレースフルノードシャットダウンの管理

グレースフルノードシャットダウンを使用すると、kubelet はノードのシャットダウン時に Pod の強制エビクションを遅らせることができます。グレースフルノードシャットダウンを設定する場合、シャットダウンする前に Pod が実行中のワークロードを完了するための期間を定義できます。この猶予期間を設定することで、予期しないノードのシャットダウンイベントによる重要なワークロードの中断を最小限に抑えることができます。優先順位クラスを使用すると、Pod のシャットダウン順序も指定できます。

6.4.1. グレースフルノードシャットダウンについて

グレースフルノードシャットダウン時に、kubelet は該当するノード上で実行されている Pod に終了信号を送信し、すべての Pod がエビクトされるまでノードのシャットダウンを延期します。予期せずノードがシャットダウンした場合、グレースフルノードシャットダウン機能により、該当する Pod 上で実行されていたワークロードの中断が最小限に抑えられます。

グレースフルノードシャットダウンの実行中に、kubelet は 2 つのフェーズで Pod を停止します。

  • 通常 Pod の終了
  • 重要 Pod の終了

KubeletConfig カスタムリソースで以下の仕様を設定して、通常 Pod および重要 Pod のシャットダウン猶予期間を定義できます。

  • shutdownGracePeriod: 通常 Pod および 重要 Pod の合計 Pod 終了期間を指定します。
  • shutdownGracePeriodCriticalPods: 重要 Pod の終了期間を指定します。この値は shutdownGracePeriod 値よりも小さくする必要があります。

たとえば、shutdownGracePeriod 値が 30s で、shutdownGracePeriodCriticalPods 値が 10s の場合、kubelet はノードのシャットダウンを 30 秒遅らせます。シャットダウン中は、最初の 20 (30-10) 秒が通常 Pod のシャットダウン用にあてられ、最後の 10 秒は重要 Pod のグレースフルシャットダウン用にあてられます。

重要 Pod を定義する場合は、Pod 優先順位に 2000000000 以上の値を割り当てます。通常 Pod を定義する場合は、Pod 優先順位に 2000000000 未満の値を割り当てます。

Pod 優先順位の値を定義する方法について、詳しくは 関連情報 セクションを参照してください。

6.4.2. グレースフルノードシャットダウンの設定

グレースフルノードシャットダウンを設定するには、KubeletConfig カスタムリソース (CR) を作成し、一連のノード上の Pod に対するシャットダウン猶予期間を指定します。グレースフルノードシャットダウン機能により、該当する Pode で実行されているワークロードの中断が最小限に抑えられます。

注記

グレースフルノードシャットダウンを設定しない場合、デフォルトの猶予期間は 0 となり、Pod はノードから強制的にエビクトされます。

前提条件

  • cluster-admin ロールでクラスターにアクセスできる。
  • 重要 Pod と通常 Pod の分類が必要な Pod の優先順位クラスを定義している。

手順

  1. 以下の YAML を kubelet-gns.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 ログで猶予期間の設定を確認します。

    注記

    shutdownGracePeriodRequested および shutdownGracePeriodCriticalPods のログメッセージが、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
      shutdownGracePeriodRequested および shutdownGracePeriodCriticalPods のログメッセージが、KubeletConfig CR に設定された値と一致していることを確認します。
    2. ノードの kubelet.conf ファイルでログを表示するには、以下のコマンドを実行してノード上でデバッグセッションを開始します。

      $ 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 のログメッセージが、KubeletConfig CR に設定された値と一致していることを確認します。
  2. グレースフルノードシャットダウン中に以下のコマンドの <pod_name> をノード名に置き換えて実行すると、Pod のグレースフルシャットダウンが実行されたか確認できます。

    $ oc describe pod <pod_name>

    出力例

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