このページでは、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.DatabaseEncryption
の CurrentState
フィールドで確認できます。
CurrentState の値 |
説明 |
---|---|
|
最後の更新オペレーションは成功しました。特に対応は必要ありません。以前に使用されていた鍵は破棄できます。 |
|
更新の進行中です。 |
|
最後の更新でエラーが発生しました。以前に使用した Cloud KMS 鍵を無効化または破棄しないでください。GKE でまだ使用されている可能性があります。
詳細については、 |
LastOperationErrors
フィールド
更新オペレーションが失敗すると、GKE コントロール プレーンのエラーが gcloud container clusters update
の出力に表示されます。
失敗した 2 つの更新オペレーションのエラー メッセージも Cluster.DatabaseEncryption.LastOperationErrors
で確認できます。
DecryptionKeys
フィールド
新しい暗号化オペレーションに使用される Cloud KMS 鍵が DatabaseEncryption.KeyName
に表示されます。通常、これはクラスタで使用される唯一の鍵です。
ただし、DatabaseEncryption.DecryptionKeys
には、更新の進行中または障害発生後にクラスタによって使用される追加の鍵も含まれています。
更新が失敗した場合の復元
更新に失敗した場合は、次の手順で復元します。
- エラー メッセージを確認して、示されている問題に対処します。
- 失敗したコマンド(
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 を更新できるように変更します。