Kubernetes Secret での Cassandra Secret のローテーション
この手順では、クラスタ内の Kubernetes Secret で Cassandra 認証情報をローテーションする方法について説明します。Hashicorp Vault 内での認証情報のローテーションについては、Hashicorp Vault での Cassandra 認証情報のローテーションをご覧ください。
この手順では、次の 3 つのタスクを自動化してトリガーすることで、本番環境の Apigee ハイブリッド サービスで使用される Cassandra 認証情報を、ダウンタイムなしでローテーションできます。
- ユーザー認証情報のローテーション
- ローテーションのロールバック
- 古い認証情報と新しい認証情報のクリーンアップ
Kubernetes Secret で Cassandra Secret をローテーションする
ローテーションできる Cassandra 認証情報のユーザー名とパスワードのペアは 6 つあります。
default
(パスワードのローテーションのみ)admin_user
ddl_user
dml_user
jmxuser
apigee
認証情報のローテーションの準備をする
これらの手順を実行するには、クラスタ内で kubectl apply -f
を実行する権限が必要です。
- Cassandra データベースをバックアップします。このバックアップは、事前にローテーションされた認証情報の復元を確実に行うためのものです。Cassandra のバックアップの概要をご覧ください。
- クラスタが正常な状態であり、すべての Apigee リソースが実行されており、保留中の状態変更がないことを確認します。
単一リージョンの認証情報のローテーション
- Kubernetes Secret でユーザー名とパスワードを設定するの手順に沿って、ローテーションする Cassandra ユーザー認証情報を保持する新しい Kubernetes Secret を Apigee Namespace に作成します。
- ローテーションの事前チェックを実行します。
-
次のテンプレートを使用して、新しい SecretRotation カスタム リソースを作成します。
# rotation-k8s-secrets.yaml apiVersion: apigee.cloud.google.com/v1alpha1 kind: SecretRotation metadata: name: ROTATION_NAME namespace: APIGEE_NAMESPACE spec: organizationId: APIGEE_ORG rotationId: ROTATION_ID timeoutMinutes: TIMEOUT_MINUTES # optional. 480 recommended. precheck: true cassandra: oldSecretRef: OLD_SECRET_REF newSecretRef: NEW_SECRET_REF jobType: ROTATE
ここで
- ROTATION_NAME: ローテーション ジョブの名前(例:
sr-1-precheck
)。 - APIGEE_NAMESPACE: Apigee Namespace。
- APIGEE_ORG: Apigee 組織の ID。
- ROTATION_ID: カスタム ID(例:
rot-1-precheck
)。 - TIMEOUT_MINUTES: 省略可。デフォルト(480 分 = 8 時間)をオーバーライドします。<=0 は無限のタイムアウトを意味します。
- OLD_SECRET_REF:
apigeedatastore
で現在使用されている Secret 名。これは次のコマンドを使用して確認できます。kubectl -n APIGEE_NAMESPACE get apigeedatastore default -o jsonpath='{.spec.credentialRef}'
- NEW_SECRET_REF: 前の手順で作成したシークレット名。
- ROTATION_NAME: ローテーション ジョブの名前(例:
-
ローテーション YAML ファイルを適用して、ローテーションの事前チェックジョブをトリガーします。
kubectl -n APIGEE_NAMESPACE apply -f ROTATION_YAML_FILE
-
ジョブのステータスを確認し、完了するまで待ちます。
kubectl -n APIGEE_NAMESPACE describe sr ROTATION_NAME
ジョブが完了すると、出力には次の内容が含まれます。
Status: Message: rotation complete State: complete
kubectl -n APIGEE_NAMESPACE logs sr-ROTATION_ID-rotate-job-HASH
-
次のテンプレートを使用して、新しい SecretRotation カスタム リソースを作成します。
-
ローテーションの事前チェックジョブが完了したら、ローテーションを実行します。
- ローテーション YAML ファイルに次の変更を加えます。
metadata.name
を、これが事前チェックではないことを示す名前(sr-1
など)に変更します。spec.precheck
をfalse
に設定する。spec.rotationId
を新しい ID(rot-1
など)に変更します。
- ファイルをもう一度適用して、ローテーションを実行します。
kubectl -n APIGEE_NAMESPACE apply -f ROTATION_YAML_FILE
- ローテーション YAML ファイルに次の変更を加えます。
- ローテーション ジョブが完了したら、トラフィックが引き続き正しく転送されていることを確認します。
- トラフィックを検証したら、古いシークレットのクリーンアップを行います。
-
ローテーション YAML ファイルに次の変更を加えます。
metadata.name
を、これがクリーンアップ ジョブであることを示す名前(sr-1-cleanup
など)に変更します。spec.cassandra.jobType
をCLEANUP
に設定する。
- ファイルをもう一度適用して、クリーンアップを実行します。
kubectl -n APIGEE_NAMESPACE apply -f ROTATION_YAML_FILE
-
ジョブのステータスを確認し、完了するまで待ちます。
kubectl -n APIGEE_NAMESPACE describe sr ROTATION_NAME
クリーンアップ ジョブが完了すると、ローテーション プロセスは完了します。
-
ローテーション YAML ファイルに次の変更を加えます。
- Cassandra データベースのバックアップを取得します。このバックアップは、ローテーション後の認証情報の復元を確実に行うためのものです。
- 古い Cassandra 認証情報シークレットを削除します。
マルチリージョン認証情報のローテーション
-
各リージョンで、Kubernetes Secret でユーザー名とパスワードを設定するの手順に沿って、ローテーションする Cassandra ユーザー認証情報を保持する新しい Kubernetes Secret を Apigee Namespace に作成します。
認証情報は各リージョンで同じである必要があります。
- ローテーションの事前チェックを実行します。
-
次のテンプレートを使用して、新しい SecretRotation カスタム リソースを作成します。
# rotation-k8s-secrets.yaml apiVersion: apigee.cloud.google.com/v1alpha1 kind: SecretRotation metadata: name: ROTATION_NAME namespace: APIGEE_NAMESPACE spec: organizationId: APIGEE_ORG rotationId: ROTATION_ID timeoutMinutes: TIMEOUT_MINUTES # optional. 480 recommended. precheck: true cassandra: oldSecretRef: OLD_SECRET_REF newSecretRef: NEW_SECRET_REF jobType: ROTATE
ここで
- ROTATION_NAME: ローテーション ジョブの名前(例:
sr-1-precheck
)。 - APIGEE_NAMESPACE: Apigee Namespace。
- APIGEE_ORG: Apigee 組織の ID。
- ROTATION_ID: カスタム ID(例:
rot-1-precheck
)。 - TIMEOUT_MINUTES: 省略可。デフォルト(480 分 = 8 時間)をオーバーライドします。<=0 は無限のタイムアウトを意味します。
- OLD_SECRET_REF:
apigeedatastore
で現在使用されている Secret 名。これは次のコマンドを使用して確認できます。kubectl -n APIGEE_NAMESPACE get apigeedatastore default -o jsonpath='{.spec.credentialRef}'
- NEW_SECRET_REF: 前の手順で作成したシークレット名。
- ROTATION_NAME: ローテーション ジョブの名前(例:
-
最初のリージョンで、ローテーション YAML ファイルを適用してローテーションの事前チェックジョブをトリガーします。
kubectl -n APIGEE_NAMESPACE apply -f ROTATION_YAML_FILE
-
ジョブのステータスを確認し、完了するまで待ちます。
kubectl -n APIGEE_NAMESPACE describe sr ROTATION_NAME
ジョブが完了すると、出力には次の内容が含まれます。
Status: Message: rotation complete State: complete
kubectl -n APIGEE_NAMESPACE logs sr-ROTATION_ID-rotate-job-HASH
-
次のテンプレートを使用して、新しい SecretRotation カスタム リソースを作成します。
-
ローテーションの事前チェックジョブが完了したら、同じリージョンでローテーションを実行します。
- ローテーション YAML ファイルに次の変更を加えます。
metadata.name
を、これが事前チェックではないことを示す名前(sr-1
など)に変更します。spec.precheck
をfalse
に設定する。spec.rotationId
を新しい ID(rot-1
など)に変更します。
- ファイルをもう一度適用して、ローテーションを実行します。
kubectl -n APIGEE_NAMESPACE apply -f ROTATION_YAML_FILE
- ローテーション YAML ファイルに次の変更を加えます。
- ローテーション ジョブが完了したら、トラフィックが引き続き正しく転送されていることを確認します。
- 残りのリージョンに対してローテーションの手順を繰り返します。
- トラフィックを検証したら、古いシークレットのクリーンアップを行います。クリーンアップは 1 つのリージョンでのみ行う必要があります。どのリージョンを選択してもかまいません。
-
ローテーション YAML ファイルに次の変更を加えます。
metadata.name
を、これがクリーンアップ ジョブであることを示す名前(sr-1-cleanup
など)に変更します。spec.cassandra.jobType
をCLEANUP
に設定する。
- ファイルをもう一度適用して、クリーンアップを実行します。
kubectl -n APIGEE_NAMESPACE apply -f ROTATION_YAML_FILE
-
ジョブのステータスを確認し、完了するまで待ちます。
kubectl -n APIGEE_NAMESPACE describe sr ROTATION_NAME
クリーンアップ ジョブが完了すると、ローテーション プロセスは完了します。
-
ローテーション YAML ファイルに次の変更を加えます。
- Cassandra データベースのバックアップを取得します。このバックアップは、ローテーション後の認証情報の復元を確実に行うためのものです。
- 古い Cassandra 認証情報シークレットを削除します。
ローテーションのロールバック
各リージョンで次の手順を実行します。
-
次のテンプレートを使用して、新しい SecretRotation カスタム リソースを作成します。
# rollback-k8s-secrets.yaml apiVersion: apigee.cloud.google.com/v1alpha1 kind: SecretRotation metadata: name: ROLLBACK_NAME namespace: APIGEE_NAMESPACE spec: organizationId: APIGEE_ORG rotationId: ROTATION_ID # match the current rotation. timeoutMinutes: TIMEOUT_MINUTES # optional. precheck: false cassandra: oldSecretRef: OLD_SECRET_REF # Must match the previous oldSecretRef. newSecretRef: NEW_SECRET_REF # Must match the previous newSecretRef. jobType: ROLLBACK
ここで
- ROLLBACK_NAME: ロールバック ジョブの名前(例:
sr-1-rollback
)。 - APIGEE_NAMESPACE: Apigee Namespace。
- APIGEE_ORG: Apigee 組織の ID。
- ROTATION_ID: ロールバックする現在のローテーションの ID(例:
rot-1
)。 - TIMEOUT_MINUTES: 省略可。デフォルト(480 分 = 8 時間)をオーバーライドします。<=0 は無限のタイムアウトを意味します。
- OLD_SECRET_REF: 単一リージョンのローテーションまたはマルチリージョンのローテーションの手順で使用したローテーション YAML ファイルの
oldSecretRef:
のシークレット名と一致する必要があります。 - NEW_SECRET_REF: 単一リージョンのローテーションまたはマルチリージョンのローテーションの手順で使用したローテーション YAML ファイルの
newSecretRef:
のシークレット名と一致する必要があります。
- ROLLBACK_NAME: ロールバック ジョブの名前(例:
-
ロールバックを適用します。
kubectl -n APIGEE_NAMESPACE apply -f ROLLBACK_YAML_FILE
-
ジョブのステータスを確認し、完了するまで待ちます。
kubectl -n APIGEE_NAMESPACE describe sr ROTATION_NAME
- ロールバックが完了したら、トラフィックが引き続き正しく転送されていることを確認します。
- トラフィックが正しく流れたら、残りの各リージョンでロールバック プロセスを繰り返します。
-
ロールバックが完了し、トラフィックが引き続き正しく転送されていることを確認したら、クリーンアップ プロセスを開始します。クリーンアップは 1 つのリージョンでのみ行う必要があります。どのリージョンを選択してもかまいません。
ローテーション YAML ファイルに次の変更を加えます。
metadata.name
は、クリーンアップ ジョブであることを示す名前に変更します(例:sr-1-cleanup-rollback
)。spec.cassandra.jobType
をCLEANUP_ROLLBACK
に変更します。
-
ファイルを適用してクリーンアップ ジョブをトリガーします。
kubectl -n APIGEE_NAMESPACE apply -f ROTATION_YAML_FILE