5.4. ノードをグレースフルに再起動する
Windows Machine Config Operator (WMCO) は、可能な限りノードの再起動を最小限に抑えます。しかし、特定の操作および更新を行う際には、変更が正しくセキュアに適用されるように、再起動を実行する必要があります。Windows ノードを安全に再起動するには、グレースフル再起動プロセスを使用します。標準の OpenShift Container Platform ノードのグレースフル再起動を実行する方法は、「ノード」ドキュメントの「ノードのグレースフル再起動」を参照してください。
ノードを再起動する前に、ノードでのデータ損失を回避するために、etcd データをバックアップすることを推奨します。
シングルノード OpenShift クラスターの場合、クラスターを管理するために kubeconfig ファイルに証明書を含めるのではなく、ユーザーが oc login コマンドを実行する必要があります。そのため、ノードをスケジューリング対象から除外して drain (Pod の退避) を実行した後、oc adm コマンドが使用できなくなる可能性があります。これは、スケジューリング対象から除外する操作が原因で、openshift-oauth-apiserver Pod が実行されなくなるためです。以下の手順で示したように、SSH を使用してノードにアクセスできます。
シングルノード OpenShift クラスターでは、スケジューリング対象からの除外時および drain (Pod の退避) の実行時に Pod を再スケジューリングすることはできません。しかし、そうすることで、Pod、特にワークロード Pod が適切に停止し、関連するリソースを解放する時間を得ることができます。
手順
ノードのグレースフル再起動を実行するには、次の手順を実行します。
ノードをスケジューリング対象外としてマークします。
$ oc adm cordon <node1>ノードの drain (Pod の退避) を実行して、実行中のすべての Pod を削除します。
$ oc adm drain <node1> --ignore-daemonsets --delete-emptydir-data --forceカスタムの Pod Disruption Budget (PDB) に関連する Pod を退避できないというエラーが表示される場合があります。
エラーの例
error when evicting pods/"rails-postgresql-example-1-72v2w" -n "rails" (will retry after 5s): Cannot evict pod as it would violate the pod's disruption budget.この場合、drain コマンドを再度実行し、
disable-evictionフラグを追加し、PDB チェックを省略します。$ oc adm drain <node1> --ignore-daemonsets --delete-emptydir-data --force --disable-evictionWindows ノードに SSH で接続し、次のコマンドを実行して PowerShell に入ります。
C:\> powershell次のコマンドを実行してノードを再起動します。
C:\> Restart-Computer -ForceAmazon Web Services (AWS) 上の Windows ノードは、EC2 インスタンスのメタデータルートと Host Network Service (HNS) ネットワークとの不整合が原因で、グレースフル再起動後に
READY状態に戻りません。再起動後、AWS 上の任意の Windows ノードに SSH で接続し、シェルプロンプトで次のコマンドを実行してルートを追加します。
C:\> route add 169.254.169.254 mask 255.255.255.0 <gateway_ip>ここでは、以下のようになります。
169.254.169.254- EC2 インスタンスメタデータエンドポイントのアドレスを指定します。
255.255.255.255- EC2 インスタンスメタデータエンドポイントのネットワークマスクを指定します。
<gateway_ip>Windows インスタンス内のゲートウェイに対応する IP アドレスを指定します。これは、次のコマンドを実行して見つけることができます。
C:\> ipconfig | findstr /C:"Default Gateway"
再起動が完了したら、以下のコマンドを実行して、ノードをスケジューリング可能な状態にします。
$ oc adm uncordon <node1>ノードの準備ができていることを確認します。
$ oc get node <node1>出力例
NAME STATUS ROLES AGE VERSION <node1> Ready worker 6d22h v1.18.3+b0068a8