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 の優先順位クラスを定義している。
手順
以下の YAML を
kubelet-gns.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ファイルでログを表示するには、以下のコマンドを実行してノード上でデバッグセッションを開始します。$ 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_name>をノード名に置き換えて実行すると、Pod のグレースフルシャットダウンが実行されたか確認できます。$ oc describe pod <pod_name>
出力例
Reason: Terminated Message: Pod was terminated in response to imminent node shutdown.
関連情報