アプリケーション レイヤでの Secret の暗号化のトラブルシューティング


このページでは、Google Kubernetes Engine(GKE)のアプリケーション レイヤの Secret の暗号化に関連する問題を解決する方法について説明します。

更新の失敗

アプリケーション レイヤの Secret の暗号化の暗号化構成を更新するときに、GKE は Kubernetes クラスタ内のすべての Secret オブジェクトを書き換える必要があります。GKE は、すべての Secret が新しい Cloud KMS 鍵で暗号化されるようにします。あるいは、暗号化されていない状態で書き込まれるように構成します。

この更新オペレーションは、次のいずれかの条件が原因で失敗する可能性があります。

  • 更新の進行中は、Kubernetes コントロール プレーンが一時的に使用できなくなります。
  • ユーザー定義の AdmissionWebhook により、GKE が Secret オブジェクトを更新できなくなります。
  • 更新オペレーションが完了する前に、更新された Cloud KMS 鍵または以前の Cloud KMS 鍵が無効になります。

更新オペレーションが成功するまで、更新された Cloud KMS 鍵または以前の Cloud KMS 鍵を使用しないでください。

デバッグ用のフィールド

バージョン 1.29 以降を実行している新しい GKE クラスタには、Cluster.DatabaseEncryption の更新を追跡し、障害からの復旧に役立つ追加フィールドが含まれています。

次の手順は、DatabaseEncryption.CurrentState フィールドが空でないクラスタにのみ適用されます。CurrentState フィールドが空の場合、このクラスタ バージョンでこの機能はまだ有効になっていません。

これらのフィールドには、次の上限が適用されます。

  • 出力専用です。クラスタの作成リクエストまたは更新リクエストに設定することはできません。

CurrentState フィールド

DatabaseEncryption 更新オペレーションの現在のステータスは、Cluster.DatabaseEncryptionCurrentState フィールドで確認できます。

CurrentState の値 説明

CURRENT_STATE_ENCRYPTED

CURRENT_STATE_DECRYPTED

最後の更新オペレーションは成功しました。特に対応は必要ありません。以前に使用されていた鍵は破棄できます。

CURRENT_STATE_ENCRYPTION_PENDING

CURRENT_STATE_DECRYPTION_PENDING

更新の進行中です。

CURRENT_STATE_ENCRYPTION_ERROR

CURRENT_STATE_DECRYPTION_ERROR

最後の更新でエラーが発生しました。以前に使用した Cloud KMS 鍵を無効化または破棄しないでください。GKE でまだ使用されている可能性があります。

詳細については、LastOperationErrors フィールドを参照してください。

LastOperationErrors フィールド

更新オペレーションが失敗すると、GKE コントロール プレーンのエラーが gcloud container clusters update の出力に表示されます。

失敗した 2 つの更新オペレーションのエラー メッセージも Cluster.DatabaseEncryption.LastOperationErrors で確認できます。

DecryptionKeys フィールド

新しい暗号化オペレーションに使用される Cloud KMS 鍵が DatabaseEncryption.KeyName に表示されます。通常、これはクラスタで使用される唯一の鍵です。

ただし、DatabaseEncryption.DecryptionKeys には、更新の進行中または障害発生後にクラスタによって使用される追加の鍵も含まれています。

更新が失敗した場合の復元

更新に失敗した場合は、次の手順で復元します。

  1. エラー メッセージを確認して、示されている問題に対処します。
  2. 失敗したコマンド(gcloud container clusters update ... --database-encryption-key など)を実行して、更新リクエストを再試行します。最初に送信した更新リクエストを再試行するか、クラスタを以前の状態に戻して更新することをおすすめします。GKE が 1 つ以上の Secret を読み取れない場合、別の鍵または暗号化状態に移行できないことがあります。

以降のセクションでは、エラーの一般的な原因について説明します。

Cloud KMS 鍵のエラー

エラー メッセージに 1 つ以上の Cloud KMS 鍵への参照が含まれている場合は、Cloud KMS 鍵の構成を調べて、関連する鍵のバージョンが使用可能であることを確認します。

たとえば、Cloud KMS 鍵が無効化または破棄されたことを示すエラーが発生した場合は、鍵または鍵バージョンを再度有効にします。

Secret を更新できない

Kubernetes API がアドミッション Webhook により更新リクエストを拒否した場合、次のエラーが発生することがあります。

error admission webhook WEBHOOK_NAME denied the request

このエラーを解決するには、Webhook を削除するか、鍵の更新時に GKE がすべての Namespace の Secret を更新できるように変更します。