このページでは、Google Kubernetes Engine(GKE)クラスタでコントロール プレーンの IP ローテーションを行う方法について説明します。
概要
IP ローテーションを行うことで、コントロール プレーンが Kubernetes API からのリクエストに対応するために使用する IP アドレスを変更できます。コントロール プレーンの IP アドレスは静的であり、IP ローテーションを実行しない限り変更されません。
IP ローテーションにより SSL 証明書とクラスタ認証局(CA)が変更されるため、以前のアドレスを新しいアドレスに接続する機能が制限されます。
IP ローテーションは、認証情報のローテーションでも行われます。
始める前に
始める前に、次の作業が完了していることを確認してください。
- Google Kubernetes Engine API を有効にする。 Google Kubernetes Engine API の有効化
- このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化する。すでに gcloud CLI をインストールしている場合は、
gcloud components update
を実行して最新のバージョンを取得する。
IP ローテーションを行う
IP ローテーションは、複数のステップから構成されるプロセスです。
- IP ローテーションを開始すると、コントロール プレーンは元の IP アドレスに加えて新しい IP アドレスでもサービスを開始します。
- GKE は、新しい IP アドレスを使用するようにノードプールを再作成します。ノードプールをすでに実行されている GKE バージョンにアップグレードして、手動で再作成することもできます。
- ローテーションを開始した後は、クラスタの API クライアント(
kubectl
コマンドライン インターフェースを使用する開発マシンなど)を更新して、新しい IP アドレスでコントロール プレーンとの通信を開始する必要があります。 - ローテーションを完了すると、コントロール プレーンは以前の IP アドレスでのトラフィックの処理を停止します。
IP アドレスのローテーションを開始すると、GKE によってノードが再作成されます。ただし、Google Cloud Next などの大規模なイベントの期間中は、中断が発生しないように自動ノード再作成を一時停止することがあります。IP アドレスのローテーションを開始してから 7 日以内にローテーションを完了しなかった場合、GKE はローテーションを完了しようとします。クラスタ内のノードが以前の IP アドレスを引き続き使用している場合、自動完了は失敗しています。ローテーションを開始した後、IP アドレスのローテーションを手動で追跡して完了する必要があります。自動完了はベスト エフォートであり、自動完了に依存しないでください。
ローテーションを開始する
IP ローテーションを開始するには、次のコマンドを実行します。
gcloud container clusters update CLUSTER_NAME \ --start-ip-rotation
CLUSTER_NAME
はクラスタの名前で置き換えます。出力は次のようになります。
This will start an IP Rotation on cluster CLUSTER_NAME. The master will be updated to serve on a new IP address in addition to the current IP address. Google Kubernetes Engine will then schedule recreation of all nodes to point to the new IP address. If maintenance window is used, nodes are not recreated until a maintenance window occurs. See documentation on how to manually update nodes. This operation is long-running and will block other operations on the cluster (including delete) until it has run to completion. Do you want to continue (Y/n)?
また、このコマンドを実行すると、元の IP アドレスと新しい IP アドレスの 2 つの IP アドレスでサービスを提供するようにコントロール プレーンが構成されます。
ローテーションを確認し、シェルを開いたままの状態で操作を完了します。
ノードを再作成する
新しい IP アドレスでサービスを提供するように API サーバーを再構成すると、GKE は新しい IP アドレスを使用するようにノードを自動的に更新します。GKE は、すべてのノードを最も近いサポート対象のノード バージョンにアップグレードし、ノードを再作成します。詳細については、ノードプールのアップグレードをご覧ください。
デフォルトでは、GKE はオペレーションの開始から 7 日後に IP アドレスのローテーションを自動的に完了します。クラスタ内のアクティブなメンテナンスの時間枠または除外により、この 7 日間に GKE が一部のノードを再作成できない場合、IP アドレスのローテーションは完了しません。
メンテナンスの除外またはメンテナンスの時間枠を使用すると、ローテーションが失敗する可能性がある場合は、クラスタを手動でアップグレードして、ノードを強制的に再作成します。
gcloud container clusters upgrade CLUSTER_NAME \ --location=LOCATION \ --cluster-version=VERSION
VERSION
は、クラスタがすでに使用している GKE バージョンに置き換えます。詳細については、メンテナンス時間枠の注意点をご覧ください。
ノードプールの再作成の進行状況を確認する
ローテーションのオペレーションをモニタリングするには、次のコマンドを実行します。
gcloud container operations list \ --filter="operationType=UPGRADE_NODES AND status=RUNNING" \ --format="value(name)"
このコマンドは、ノードのアップグレード オペレーションのオペレーション ID を返します。
オペレーションをポーリングするには、オペレーション ID を次のコマンドに渡します。
gcloud container operations wait OPERATION_ID
ノードプールは 1 つずつ再作成され、それぞれに固有のオペレーションがあります。複数のノードプールがある場合は、次の手順に沿って各オペレーションをポーリングします。
API クライアントを更新する
IP ローテーションを開始したら、新しい IP アドレスを指すように、クラスタの外部にあるすべての API クライアント(デベロッパー マシンの kubectl
など)を更新する必要があります。
API クライアントを更新するには、クライアントごとに次のコマンドを実行します。
gcloud container clusters get-credentials CLUSTER_NAME
ハードコードされた IP アドレスとファイアウォール ルールを更新する
使用環境でコントロール プレーンの IP アドレスをハードコードした場合、またはコントロール プレーンの IP アドレスをターゲットとするファイアウォール ルールがある場合は、アドレスを新しい IP アドレスに更新します。アプリケーションとファイアウォール ルールの IP アドレスを更新せずにローテーションを完了すると、GKE が以前のコントロール プレーン IP アドレスに対するサービスを停止したときに、それらのリソースで中断が発生する可能性があります。
ローテーションを完了する
クラスタ外の API クライアントを更新したら、ローテーションを完了して、新しい IP アドレスのみでサービスを提供するようにコントロール プレーンを構成します。
ローテーションを完了するには、次のコマンドを実行します。
gcloud container clusters update CLUSTER_NAME \
--complete-ip-rotation
出力は次のようになります。
This will complete the in-progress IP Rotation on cluster CLUSTER_NAME.
The master will be updated to stop serving on the old IP address and only
serve on the new IP address. Make sure all API clients have been updated
to communicate with the new IP address (e.g. by running `gcloud container
clusters get-credentials --project PROJECT_ID --region COMPUTE_REGION
CLUSTER_NAME`). This operation is long-running and will
block other operations on the cluster (including delete) until it has
run to completion.
IP アドレスのローテーションが完了せず、次のようなエラー メッセージが返される場合は、トラブルシューティングを参照してください。
ERROR: (gcloud.container.clusters.update) ResponseError: code=400, message=Node pool "test-pool-1" requires recreation.