ノードの修復またはメンテナンスが必要な場合は、まずノードをメンテナンス モードにする必要があります。ノードをメンテナンス モードにすると、Pod / ワークロードがドレインされ、Pod のスケジューリングからノードが除外されます。メンテナンス モードでは、Pod トラフィックが中断されるリスクなしに、ノードを操作できます。
仕組み
GKE on Bare Metal では、ノードをメンテナンス モードにできます。この方法により、他のクラスタ コンポーネントで、ノードがメンテナンス モードであることを正しく認識できます。ノードをメンテナンス モードにすると、そのノードでは追加の Pod をスケジュールできなくなり、既存の Pod が停止します。
メンテナンス モードを使用する代わりに、特定のノードで kubectl cordon
や kubectl drain
などの Kubernetes コマンドを手動で使用できます。GKE on Bare Metal バージョン 1.12.0(anthosBareMetalVersion: 1.12.0
)またはそれ以前を実行する場合、メンテナンス モード手順を使用しない場合、ノードが閉鎖解除されるという既知の問題をご覧ください。
メンテナンス モードのプロセスを使用すると、GKE on Bare Metal は次の処理を行います。
Node Taints が指定されたノードに追加され、ノードで Pod をスケジュールできず、実行もできないことを示します。
ノードが Pod の停止を待機して停止するのを防ぐために、20 分のタイムアウトが適用されます。Pod は、すべての taint を許容するよう構成されている場合、またはファイナライザが設定されている場合、停止できません。 GKE on Bare Metal はすべての Pod を停止しようとしますが、タイムアウトを超えるとノードがメンテナンス モードになります。このタイムアウトにより、実行中の Pod がアップグレードをブロックしなくなります。
ノードをメンテナンス モードにする
クラスタ構成ファイルの maintenanceBlocks
で選択したノードの IP 範囲を指定して、メンテナンス モードにするノードを選択します。選択するノードは、準備完了状態で、クラスタで機能している必要があります。
ノードをメンテナンス モードに設定するには:
クラスタ構成ファイルを編集して、メンテナンス モードにするノードを選択します。
任意のエディタを使用して構成ファイルを編集するか、次のコマンドを実行して、クラスタのカスタム リソースを直接編集できます。
kubectl -n CLUSTER_NAMESPACE edit cluster CLUSTER_NAME
次のように置き換えます。
CLUSTER_NAMESPACE
: クラスタの名前空間。CLUSTER_NAME
: クラスタの名前。
メンテナンス モードにするノードの単一の IP アドレスかアドレス範囲を指定するため、クラスタ構成ファイルに
maintenanceBlocks
セクションを追加します。次のサンプルでは、IP アドレスの範囲を指定して複数のノードを選択する方法を示します。
metadata: name: my-cluster namespace: cluster-my-cluster spec: maintenanceBlocks: cidrBlocks: - 172.16.128.1-172.16.128.64
更新したクラスタ構成を保存して適用します。
GKE on Bare Metal がノードのメンテナンス モードへの設定を開始します。
次のコマンドを実行して、クラスタ内のノードのステータスを取得します。
kubectl get nodes --kubeconfig=KUBECONFIG
結果は次のようになります。
NAME STATUS ROLES AGE VERSION user-anthos-baremetal-01 Ready control-plane 2d22h v1.27.4-gke.1600 user-anthos-baremetal-04 Ready worker 2d22h v1.27.4-gke.1600 user-anthos-baremetal-05 Ready worker 2d22h v1.27.4-gke.1600 user-anthos-baremetal-06 Ready worker 2d22h v1.27.4-gke.1600
ノードは引き続きスケジューリング可能ですが、taint によって、Pod(適切な toleration のない)がノードでスケジュールされることがなくなります。
次のコマンドを実行して、メンテナンス モードのノード数を取得します。
kubectl get nodepools --kubeconfig ADMIN_KUBECONFIG
レスポンスは次の例のようになります。
NAME READY RECONCILING STALLED UNDERMAINTENANCE UNKNOWN np1 3 0 0 1 0
このサンプルの
UNDERMAINTENANCE
列は、1 つのノードがメンテナンス モードであることを示しています。GKE on Bare Metal では、ノードがメンテナンス モードになると、次の taint も追加されます。
baremetal.cluster.gke.io/maintenance:NoExecute
baremetal.cluster.gke.io/maintenance:NoSchedule
課金とメンテナンス モード
GKE on Bare Metal の課金は、ワークロードを実行可能なノードの vCPU の数に基づきます。ノードをメンテナンス モードにすると、NoExecute
と NoSchedule
の taint がノードに追加されますが、課金は無効になりません。ノードをメンテナンス モードにした後、ノード(kubectl cordon NODE_NAME
)を閉鎖してスケジュール不可としてマークします。ノードがスケジュール不可としてマークされると、ノードとそれに関連する vCPU は課金から除外されます。
料金ページで説明しているように、kubectl
を使用して各ユーザー クラスタの vCPU 容量(Anthos の請求に使用)を確認できます。
このコマンドでは、ノードがスケジューリング可能かどうかは考慮されず、ノードあたりの vCPU 数のみが示されます。
ユーザー クラスタのノードあたりの vCPU の数を確認するには:
kubectl get nodes \
--kubeconfig USER_KUBECONFIG \
-o=jsonpath="{range .items[*]}{.metadata.name}{\"\t\"} \
{.status.capacity.cpu}{\"\n\"}{end}"
USER_KUBECONFIG は、ユーザー クラスタ用の kubeconfig ファイルのパスに置き換えます。
ノードのメンテナンス モードを解除する
メンテナンス モードからノードを削除するには:
クラスタの構成ファイルを編集して、メンテナンス モードから削除するノードを消去します。
任意のエディタを使用して構成ファイルを編集するか、次のコマンドを実行して、クラスタのカスタム リソースを直接編集できます。
kubectl -n CLUSTER_NAMESPACE edit cluster CLUSTER_NAME
次のように置き換えます。
CLUSTER_NAMESPACE
: クラスタの名前空間。CLUSTER_NAME
: クラスタの名前。
IP アドレスを編集してメンテナンス モードから特定のノードを削除するか、
maintenanceBlocks
セクションを削除してメンテナンス モードからすべてを削除します。更新したクラスタ構成を保存して適用します。
kubectl
コマンドを使用して、ノードのステータスを確認します。