ノードをメンテナンス モードにする

ノードの修復またはメンテナンスが必要な場合は、まずノードをメンテナンス モードにする必要があります。ノードをメンテナンス モードにすると、Pod / ワークロードがドレインされ、Pod のスケジューリングからノードが除外されます。メンテナンス モードでは、Pod トラフィックが中断されるリスクなしに、ノードを操作できます。

仕組み

GKE on Bare Metal では、ノードをメンテナンス モードにできます。この方法により、他のクラスタ コンポーネントで、ノードがメンテナンス モードであることを正しく認識できます。ノードをメンテナンス モードにすると、そのノードでは追加の Pod をスケジュールできなくなり、既存の Pod が停止します。

メンテナンス モードを使用する代わりに、特定のノードで kubectl cordonkubectl 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 範囲を指定して、メンテナンス モードにするノードを選択します。選択するノードは、準備完了状態で、クラスタで機能している必要があります。

ノードをメンテナンス モードに設定するには:

  1. クラスタ構成ファイルを編集して、メンテナンス モードにするノードを選択します。

    任意のエディタを使用して構成ファイルを編集するか、次のコマンドを実行して、クラスタのカスタム リソースを直接編集できます。

    kubectl -n CLUSTER_NAMESPACE edit cluster CLUSTER_NAME
    

    次のように置き換えます。

    • CLUSTER_NAMESPACE: クラスタの名前空間。
    • CLUSTER_NAME: クラスタの名前。
  2. メンテナンス モードにするノードの単一の IP アドレスかアドレス範囲を指定するため、クラスタ構成ファイルに maintenanceBlocks セクションを追加します。

    次のサンプルでは、IP アドレスの範囲を指定して複数のノードを選択する方法を示します。

    metadata:
      name: my-cluster
      namespace: cluster-my-cluster
    spec:
      maintenanceBlocks:
        cidrBlocks:
        - 172.16.128.1-172.16.128.64
    
  3. 更新したクラスタ構成を保存して適用します。

    GKE on Bare Metal がノードのメンテナンス モードへの設定を開始します。

  4. 次のコマンドを実行して、クラスタ内のノードのステータスを取得します。

    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 のない)がノードでスケジュールされることがなくなります。

  5. 次のコマンドを実行して、メンテナンス モードのノード数を取得します。

    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 の数に基づきます。ノードをメンテナンス モードにすると、NoExecuteNoSchedule の 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 ファイルのパスに置き換えます。

ノードのメンテナンス モードを解除する

メンテナンス モードからノードを削除するには:

  1. クラスタの構成ファイルを編集して、メンテナンス モードから削除するノードを消去します。

    任意のエディタを使用して構成ファイルを編集するか、次のコマンドを実行して、クラスタのカスタム リソースを直接編集できます。

    kubectl -n CLUSTER_NAMESPACE edit cluster CLUSTER_NAME
    

    次のように置き換えます。

    • CLUSTER_NAMESPACE: クラスタの名前空間。
    • CLUSTER_NAME: クラスタの名前。
  2. IP アドレスを編集してメンテナンス モードから特定のノードを削除するか、maintenanceBlocks セクションを削除してメンテナンス モードからすべてを削除します。

  3. 更新したクラスタ構成を保存して適用します。

  4. kubectl コマンドを使用して、ノードのステータスを確認します。