ユーザー クラスタ認証局のローテーション

Anthos clusters on VMware(GKE On-Prem)は、証明書と秘密鍵を使用してユーザー クラスタ内のシステム コンポーネント間の接続を認証および暗号化します。管理クラスタは、ユーザー クラスタごとに新しい認証局(CA)を作成し、これらの CA 証明書を使用してシステム コンポーネントの追加のリーフ証明書を発行します。管理クラスタは、システム コンポーネントへの公開 CA 証明書とリーフ証明書の鍵ペアの配布を管理し、安全な通信を確立します。

ユーザー クラスタの CA ローテーション機能を使用すると、ユーザー クラスタ内のコアシステム証明書のローテーションをトリガーできます。ローテーション時に、管理クラスタはユーザー クラスタのコアシステム CA を新しく生成した CA に置き換え、新しい公開 CA 証明書とリーフ証明書鍵ペアをユーザー クラスタ システム コンポーネントに分散します。ローテーションは段階的に行われるため、システム コンポーネントはローテーション中も通信を継続できます。ただし、ローテーション中にワークロードとノードが再起動されることに注意してください。

各ユーザー クラスタで、管理クラスタによって管理されるシステム CA は次の 3 つです。

  • etcd CA は、API サーバーから etcd レプリカへの通信と、etcd レプリカ間のトラフィックを保護します。この CA は自己署名です。
  • クラスタ CA は、API サーバーとすべての内部 Kubernetes API クライアント(kubelet、コントローラ、スケジューラ)間の通信を保護します。 この CA は自己署名です。
  • フロントプロキシ CA は、集約 API との通信を保護します。この CA は自己署名です。

authentication.sni オプションで構成した証明書に署名するために、org CA を使用することもできます。この CA と SNI 証明書は、クラスタ外部のクライアントに Kubernetes API を提供するために使用されます。自身でこの CA を管理し、SNI 証明書を手動で生成します。この CA と SNI 証明書のどちらも、ユーザー クラスタの CA ローテーション機能による影響を受けません。

制限事項

  • ユーザー クラスタの CA ローテーション機能は、Anthos clusters on VMware クラスタ バージョン 1.8 以降でサポートされています。
  • ユーザー クラスタの CA ローテーション機能は、概要で説明した etcd、クラスタ、フロントプロキシの CA に限定されています。org CA はローテーションされません。ユーザー クラスタの CA ローテーション機能は、さらに Anthos clusters on VMware によって自動的に発行される証明書に限定されます。管理者が手動で発行した証明書は、システム CA によって署名されている場合でも、ローテーションで更新されることはありません。
  • CA ローテーションでは、API サーバー、その他のコントロール プレーン プロセス、クラスタ内の各ノードを複数回再起動する必要があります。CA ローテーションの各ステージは、クラスタのアップグレードと同様に行われます。CA のローテーション中もユーザー クラスタは動作を継続しますが、ワークロードが再起動されて再スケジュールされることが想定されます。また、HA 構成を使用しない場合は、コントロール プレーンのダウンタイムが短時間発生することも予想されます。
  • ユーザー クラスタに接続するためのユーザー クラスタの kubeconfig ファイルと認証構成ファイルは、CA ローテーション後に手動で更新して再配布する必要があります。これは、CA ローテーションによって古い CA が必ず取り消されるため、これらの認証情報が認証されなくなるためです。
  • 一度開始されると、CA ローテーションを一時停止またはロールバックすることはできません。
  • ユーザー クラスタのサイズによっては、CA のローテーションが完了するまでに、かなりの時間を要する場合があります。

CA ローテーションの実行方法

次の gkectl コマンドを実行して、CA ローテーションを開始し、ローテーションの現在のステータスを表示できます。

CA 証明書をローテーションする

CA ローテーションをトリガーするには、次のコマンドを実行します。

gkectl update credentials certificate-authorities rotate \
--config USER_CONFIG_FILE \
--kubeconfig ADMIN_KUBECONFIG_FILE

ここで

  • USER_CONFIG_FILE は、CA をローテーションする対象であるユーザー クラスタのユーザー クラスタ構成ファイルへのパスです。
  • ADMIN_KUBECONFIG_FILE は、ユーザー クラスタを管理する管理クラスタに接続するための kubeconfig ファイルへのパスです。

CA ローテーションが正常に開始すると、次のようなメッセージが表示されます。

successfully started the CA rotation with CAVersion 2, use gkectl update credentials certificate-authorities status command to view the current state of CA rotation

CA ローテーションがすでに進行中の場合は、次のようなエラー メッセージが表示されます。

Exit with error:
admission webhook "vonpremusercluster.onprem.cluster.gke.io" denied the request: requests must not modify CAVersion when cluster is not ready: ready condition is not true: ClusterCreateOrUpdate: Creating or updating user cluster control plane workloads

CA ローテーション ステータスを表示する

CA ローテーションのステータスを表示するには、次のコマンドを実行します。このコマンドは CAVersion を報告します。これは、各 CA ローテーションの前後で使用された CA を区別するために、システムが自動的にインクリメントする整数です。ステータス(True または False)は、CA のローテーションが完了したかどうかと、システムの各コンポーネントで現在使用されている CAVersion を示すメッセージです。

gkectl update credentials certificate-authorities status \
--config USER_CONFIG_FILE \
--kubeconfig ADMIN_KUBECONFIG_FILE

CA のローテーションがすでに完了している場合は、次のようなメッセージが表示されます。

State of CARotation with CAVersion 2 is -
status: True,
reason: CARotationCompleted,
message: Control plane has CA bundle [2], certs from CA 2, CA 2 is CSR signer. Data plane has CA bundle [2], CA 2 was CSR signer at last restart.

CA のローテーションが引き続き進行中である場合は、次のようなメッセージが表示されます。

State of CARotation with CAVersion 2 is -
status: False,
reason: CARotationProgressed,
message: Control plane has CA bundle [1 2], certs from CA 2, CA 1 is CSR signer. Data plane has CA bundle [1 2], CA 1 was CSR signer at last restart.

ユーザー クラスタ認証情報を更新する

CA ローテーションが完了したら、新しいユーザー クラスタ kubeconfig ファイルを管理クラスタからダウンロードして、以前にユーザー クラスタへの接続に使用していた古い kubeconfig を置き換える必要があります。これは、CA ローテーションによって、古い kubeconfig ファイルが基づく古い CA が取り消されるためです。CA のローテーションの完了後に次のコマンドを実行して、新しい kubeconfig ファイルをダウンロードします。

kubectl --kubeconfig ADMIN_KUBECONFIG_FILE get secret admin \
 -n USER_CLUSTER_NAME -o jsonpath='{.data.admin\.conf}' \
 | base64 --decode > USER_CLUSTER_NAME-kubeconfig

追加の kubeconfig ファイルがクラスタの他のユーザーに手動で発行された場合は、それらのファイルも更新する必要があります。

認証構成ファイルを更新する

CA のローテーションが完了したら、認証構成ファイルを更新して再配布する必要があります。リンク先の手順に沿って、CA のローテーション後に、これらのファイルを更新して再配布します。

CA ローテーションのトラブルシューティング

gkectl diagnose コマンドは、完了した CA ローテーションの予想されるステータスをユーザー クラスタに対してチェックすることをサポートします。ユーザー クラスタで gkectl diagnose を実行する方法については、クラスタの問題の診断をご覧ください。CA ローテーションの問題が発生した場合は、Google サポートに連絡して gkectl diagnose の出力を提供してください。