KubernetesシークレットのKMS v2への移行

Kubernetes Engine (OKE)を使用して作成したクラスタでKey Management Service (KMS)プロバイダ・バージョン2を使用して、既存のKubernetesシークレット・オブジェクトを再暗号化する方法を確認してください。

Kubernetesクラスタ・コントロール・プレーンは、機密構成データ(認証トークン、証明書、資格証明など)をKubernetesシークレット・オブジェクトとしてetcdに格納します。Kubernetesエンジンを使用してクラスタを作成する場合、Oracle Cloud Infrastructure Vaultサービスにマスター暗号化キーを指定して、Kubernetesシークレットをリストア時に保護するデータ暗号化キーを暗号化できます。詳細は、EtcdにあるKubernetesシークレットの暗号化を参照してください。

Kubernetesは、KMSプロバイダを使用して、Kubernetes APIサーバーとKubernetes Engine KMSプラグイン間で通信します。KMSプロバイダのバージョンは、Vaultのマスター暗号化キーのバージョンとは異なります。KMSプロバイダ・バージョン1からKMSプロバイダ・バージョン2に移行する場合、新しいマスター暗号化キーを作成したり、クラスタに関連付けられたキーを変更する必要はありません。Kubernetes KMSプロバイダの詳細は、Kubernetesドキュメントのデータ暗号化のためのKMSプロバイダの使用を参照してください。

Kubernetesシークレット・オブジェクトの暗号化に使用されるKMSプロバイダのバージョンは、クラスタ・コントロール・プレーンで実行されているKubernetesのバージョンによって異なります:

  • 1.36.1 より前のKubernetesバージョンを管理および実行するマスター暗号化キーを使用するクラスタは、KMSプロバイダ・バージョン1を使用してKubernetesシークレット・オブジェクトを暗号化します。
  • Kubernetesバージョン1.36.1以降で作成された新しいクラスタと、管理するマスター暗号化キーは、クラスタ作成時からKMSプロバイダ・バージョン2を使用します。
  • 既存のクラスタをKubernetesバージョン1.36.1以降にアップグレードすると、Kubernetes EngineはKMSプロバイダ・バージョン2の使用を開始します。新しいKubernetesシークレット・オブジェクトは、後で更新される既存のシークレット・オブジェクトと同様に、KMSプロバイダ・バージョン2を使用します。

クラスタ・コントロール・プレーンをアップグレードしても、既存のすべてのKubernetesシークレット・オブジェクトは自動的にリライトされません。アップグレード前にKMSプロバイダ・バージョン1を使用して暗号化されたシークレット・オブジェクトは、Kubernetesによって再度書き込まれるまで、KMSプロバイダ・バージョン1を使用して暗号化されたままにできます。

Kubernetesエンジンは、KMSプロバイダ・バージョン1を読み込みフォールバックとして保持するため、コントロール・プレーンのアップグレード後および移行中に既存のシークレット・オブジェクトを読取り可能なままにします。アプリケーションの実行を維持するために、既存のシークレット・オブジェクトをすぐに移行する必要はありません。

このトピックの手順を使用して、既存のすべてのKubernetesシークレット・オブジェクトを1回の操作でリライトします。Kubernetesが各シークレット・オブジェクトをリライトすると、Kubernetes APIサーバーはKMSプロバイダ・バージョン2を使用してそれを暗号化します。移行が成功すると、以前にKMSプロバイダバージョン1を使用して暗号化されていたシークレットオブジェクトは、KMSプロバイダバージョン2を使用して再暗号化されています。

次の点に注意してください:

  • Kubernetesバージョン1.36.1以降で作成された新しいクラスタでは、通常、この移行を実行する必要はありません。これは、クラスタが作成された時点からKMSプロバイダ・バージョン2を使用するためです。
  • クラスタ・コントロール・プレーンが1.36.1より前のKubernetesバージョンを実行している間は移行を実行できません。
  • クラスタ・コントロール・プレーンのアップグレード時に、Kubernetes Engineによって一括移行が自動的に開始されることはありません。移行を開始するタイミングを決定します。
  • 手動移行が必要なのは、既存の変更されていないすべてのKubernetesシークレット・オブジェクトを1回の操作で再暗号化する場合のみです。
ノート

この手順は、etcd内のrestでKubernetesシークレット・オブジェクトを暗号化するために管理するマスター暗号化キーを使用するクラスタにのみ適用されます。etcdを含むブロック・ストレージ・ボリュームのデフォルトの暗号化のみを使用するクラスタには適用されません。

始める前に

Kubernetesシークレット・オブジェクトをKMSプロバイダ・バージョン2に移行する前に:

  • リストア時にKubernetesシークレットを暗号化するために管理するOracle Cloud Infrastructure Vaultサービスのマスター暗号化キーがクラスタで使用されていることを確認します。EtcdでRestにKubernetesシークレットを暗号化するを参照してください。
  • クラスタ・コントロール・プレーンをKubernetesバージョン1.36.1以降にアップグレードします。クラスタのコントロール・プレーン・ノードでのKubernetesバージョンのアップに関する項を参照してください。
  • クラスタにアクセスするようにkubectlを構成します。クラスタ・アクセスの設定を参照してください。
  • Kubernetesアイデンティティに、クラスタ・スコープのstorageversionmigrations.storagemigration.k8s.ioリソースを作成、取得、監視および削除する権限があることを確認します。通常、クラスタ管理者にはこれらの権限があります。
  • Veleroなどのバックアップ・ソリューションを使用する場合は、すべてのKubernetesシークレット・オブジェクトを含む現在のバックアップを取得し、バックアップが正常に完了したことを確認します。機密データが含まれているため、組織のセキュリティ要件に従ってバックアップを保護します。
  • 移行が成功するまで監視するように計画します。移行では、クラスタ内のすべてのKubernetesシークレット・オブジェクトが読取りおよびリライトされ、追加のKubernetes APIアクティビティを生成できます。クラスタを大きくすると、移行に時間がかかる場合があります。

クラスタの準備ができていることの確認

内部Kubernetes Engine KMSプロバイダ構成は表示できません。かわりに、Kubernetesコントロール・プレーン・バージョンおよびKubernetes API検出を使用して、クラスタを移行する準備ができていることを確認します:

  1. 次のように入力して、Kubernetesクライアントおよびサーバーのバージョンを確認します:

    kubectl version

    Server Versionv1.36.1以降であることを確認します。

    サーバー・バージョンは、クラスタ・コントロール・プレーンで実行されているKubernetesバージョンです。ワーカー・ノードで実行されているKubernetesバージョンは、KMSプロバイダ・バージョン2の移行が使用可能かどうかを決定しません。

  2. 次のように入力して、ストレージ・バージョン移行APIが使用可能であることを確認します:

    kubectl api-resources --api-group=storagemigration.k8s.io

    出力に、次のようなstorageversionmigrationsリソースが含まれていることを確認します。

    
    NAME                         SHORTNAMES   APIVERSION                         NAMESPACED   KIND
    storageversionmigrations                  storagemigration.k8s.io/v1beta1    false        StorageVersionMigration
  3. 次のように入力して、Kubernetesアイデンティティが移行を作成、監視および削除できることを確認します:

    kubectl auth can-i create storageversionmigrations.storagemigration.k8s.io
    kubectl auth can-i get storageversionmigrations.storagemigration.k8s.io
    kubectl auth can-i watch storageversionmigrations.storagemigration.k8s.io
    kubectl auth can-i delete storageversionmigrations.storagemigration.k8s.io

    各コマンドは、yesを返す必要があります。

    コマンドでnoが返された場合は、クラスタ管理者に移行の実行を依頼するか、必要なKubernetes RBAC権限を付与してください。

次のすべてに該当する場合は、移行を開始できます。

  • クラスタでは、管理するマスター暗号化キーを使用してKubernetesシークレット・オブジェクトを暗号化します。
  • クラスタ・コントロール・プレーンは、Kubernetesバージョン1.36.1以降を実行しています。
  • ストレージ・バージョン移行APIを使用できます。
  • Kubernetesアイデンティティに必要な権限があります。

ストレージ・バージョン移行APIが使用できない場合は、別のバルク・リライト・プロシージャを使用しないでください。kubectlが目的のクラスタに接続され、コントロール・プレーンのアップグレードが完了したことを確認します。APIが使用できない場合は、Oracle Supportに連絡してください。

既存のKubernetesシークレット・オブジェクトの移行

Kubernetesストレージ・バージョン移行APIを使用してストアド・オブジェクトを移行する方法の詳細は、Kubernetesドキュメントのストレージ・バージョン移行を使用したKubernetesオブジェクトの移行を参照してください。

KMSプロバイダ・バージョン2を使用して既存のすべてのKubernetesシークレット・オブジェクトを再暗号化するには:

  1. migrate-secrets-to-kms-v2.yamlという名前のファイルを次の内容で作成します。

    apiVersion: storagemigration.k8s.io/v1beta1
    kind: StorageVersionMigration
    metadata:
      name: migrate-secrets-to-kms-v2
    spec:
      resource:
        group: ""
        resource: secrets

    空のgroup値は、KubernetesコアAPIグループを識別します。resource: secrets値は、Kubernetesシークレット・オブジェクトへの移行を制限します。

    StorageVersionMigrationリソースはクラスタ・スコープです。したがって、移行には、すべてのネームスペースにKubernetesシークレット・オブジェクトが含まれます。

  2. 移行を作成します。

    kubectl create -f migrate-secrets-to-kms-v2.yaml

    リソースを作成すると、Kubernetesストレージ・バージョン・マイグレータにKubernetesシークレット・オブジェクトの読取りおよびリライトが指示されます。この操作では、シークレット値は意図的に変更されません。各オブジェクトが書き込まれると、Kubernetes APIサーバーはアクティブなKMSプロバイダ・バージョン2構成を使用してそれを暗号化します。

  3. 移行を監視し、それが成功するまで待ちます。

    kubectl wait \
      --for=condition=Succeeded \
      storageversionmigration.storagemigration.k8s.io/migrate-secrets-to-kms-v2 \
      --timeout=24h

    成功したコマンドによって、次のような出力が返されます。

    storageversionmigration.storagemigration.k8s.io/migrate-secrets-to-kms-v2 condition met

    タイムアウトは、kubectlが条件を待機する時間を制御します。タイムアウトに達しても、まだ実行されている移行は取り消されません。

移行の確認

移行が正常に完了したことを確認するには:

  1. 移行ステータスを取得します。

    kubectl get \
      storageversionmigration.storagemigration.k8s.io/migrate-secrets-to-kms-v2 \
      -o yaml
  2. status.conditionsリストで、Succeeded条件の値が次のようにTrueであることを確認します。

    status:
      conditions:
      - type: Succeeded
        status: "True"
        reason: StorageVersionMigrationSucceeded

成功ステータスにより、Kubernetesがシークレット・オブジェクトを書き直したことが確認されます。管理するマスター暗号化キーを使用し、Kubernetesバージョン1.36.1以降を実行しているクラスタの場合、リライトされたオブジェクトはKMSプロバイダ・バージョン2を使用して暗号化されます。

移行が成功したことを確認した後、完了した移行リソースを削除できます。

kubectl delete \
  storageversionmigration.storagemigration.k8s.io/migrate-secrets-to-kms-v2

ローカルのmigrate-secrets-to-kms-v2.yamlファイルを削除することもできます。

StorageVersionMigrationリソースを削除しても、移行は元に戻されず、Kubernetesシークレット・オブジェクトは削除されません。

KMS v2移行のトラブルシューティング

ストレージ・バージョン移行APIがリストされていません

kubectl api-resourcesコマンドでstorageversionmigrationsリソースが一覧表示されない場合は、次のことを確認します。

  • kubectlは、目的のクラスタのコンテキストを使用しています。
  • kubectl versionによってレポートされるServer Versionは、v1.36.1以上です。
  • コントロール・プレーンのアップグレードが正常に完了しました。

ワーカー・ノードで実行されているKubernetesバージョンでは、移行APIが使用可能かどうかは判断されません。

これらの条件がすべて満たされ、APIが使用できなくなった場合は、Oracle Supportに連絡してください。別のバルク・リライト・プロシージャを使用しないでください。

移行を作成できません

kubectl createコマンドでForbiddenエラーが返された場合は、Kubernetesアイデンティティで移行リソースを作成できることを確認します:

kubectl auth can-i create storageversionmigrations.storagemigration.k8s.io

コマンドでnoが返された場合は、クラスタ管理者に移行の実行を依頼するか、必要なKubernetes RBAC権限を付与してください。

kubectl createコマンドでAlreadyExistsエラーが返された場合は、既存の移行を調べます。

kubectl get \
  storageversionmigration.storagemigration.k8s.io/migrate-secrets-to-kms-v2 \
  -o yaml

既存の移行が正常に完了し、新しい移行を実行する場合は、完了したStorageVersionMigrationリソースを削除してから再度作成してください。

移行が成功しない

移行ステータスおよび関連するイベントを検査します。

kubectl describe \
  storageversionmigration.storagemigration.k8s.io/migrate-secrets-to-kms-v2

Failed条件がTrueの場合、または移行が不完全な場合は、コマンド出力を保持し、Oracle Supportに連絡してください。

リライトされていないKubernetesシークレット・オブジェクトは、KMSプロバイダ・バージョン1フォールバックを使用して読取り可能なままになります。通常のKubernetes操作で更新される新しいシークレット・オブジェクトおよび既存のシークレット・オブジェクトは、引き続きKMSプロバイダ・バージョン2を使用して暗号化されます。