このトピックでは、Helm チャートを使用して Apigee ハイブリッドで Workload Identity を有効にする方法について説明します。
apigeectl
を使用して Apigee ハイブリッドのインストールと管理を行う場合は、apigeectl
での Workload Identity の有効化をご覧ください。
概要
Workload Identity は、GKE(Google Kubernetes Engine)内で実行されているアプリケーションが Google Cloud サービスにアクセスするための方法です。Workload Identity の概要については、以下をご覧ください。
Google Cloud IAM サービス アカウントは、アプリケーションが Google API へのリクエストに使用できる ID です。このドキュメントでは、これらのサービス アカウントを GSA(Google サービス アカウント)と呼びます。GSA の詳細については、サービス アカウントをご覧ください。
これとは別に、Kubernetes にもサービス アカウントという概念があります。サービス アカウントは、Pod で実行されるプロセスの ID を提供します。Kubernetes サービス アカウントは Kubernetes のリソースですが、Google サービス アカウントは Google Cloud 固有のものです。Kubernetes サービス アカウントの詳細については、Kubernetes ドキュメントの Pod のサービス アカウントを構成するをご覧ください。
Apigee は、コンポーネントの Helm チャートを最初にインストールするときに、コンポーネントの種類ごとに Kubernetes サービス アカウントを作成して使用します。Workload Identity を有効にすると、ハイブリッド コンポーネントが Kubernetes サービス アカウントとやり取りできます。
これらの手順で使用する環境変数
これらの手順では、次の環境変数を使用します。これらの変数をコマンドシェルに設定するか、コードサンプル内の値を実際の値に置き換えます。
CLUSTER_LOCATION
: Kubernetes クラスタのリージョンまたはゾーン(例:us-west1
)。CLUSTER_NAME
: クラスタの名前。ENV_NAME
: Apigee 環境の名前。ORG_NAME
: Apigee 組織の名前。PROJECT_ID
: Google Cloud プロジェクトの ID。NAMESPACE
: Apigee Namespace(通常は apigee)。
環境変数を確認します。
echo $PROJECT_IDecho $ORG_NAME
echo $ENV_NAME
echo $NAMESPACE
echo $CLUSTER_LOCATION
echo $CLUSTER_NAME
CLUSTER_NAME
必要な変数を初期化します。
export PROJECT_ID=my-project-idexport ORG_NAME=$PROJECT_ID
export ENV_NAME=my-environment-name
export NAMESPACE=apigee
export CLUSTER_LOCATION=my-cluster-location
export CLUSTER_NAME=hybrid-base-directory/apigeectl
Workload Identity とサービス アカウント キー ファイル
GKE で Apigee ハイブリッドを実行するときには、通常、各サービス アカウントの秘密鍵(.json
ファイル)を作成してダウンロードします。Workload Identity を使用する場合、サービス アカウントの秘密鍵をダウンロードして GKE クラスタに追加する必要はありません。
Apigee ハイブリッド インストールの一部としてサービス アカウント キー ファイルをダウンロードした場合は、Workload Identity を有効にした後、それらのファイルを削除できます。ほとんどのインストールでは、各コンポーネントの char ディレクトリに存在します。
Apigee ハイブリッドで Workload Identity を有効にする
プロジェクトの Workload Identity を構成する手順は次のとおりです。
移行されたインストールと Workload Identity
Apigee ハイブリッド Helm 移行ツールを使用してクラスタを apigeectl
管理から移行した場合、Workload Identity のオーバーライド構文が変更されます。オーバーライド ファイルの次のプロパティを確認する必要があります。
namespace
は必須です。次に例を示します。instanceID: "hybrid-instance-1" namespace: "apigee"
gcp.workloadIdentity.enabled
プロパティはgcp.workloadIdentityEnabled
プロパティに代わるものです。次に例を示します。gcp: workloadIdentity: enabled: true
- 本番環境のインストールでは、各コンポーネントに
gsa
プロパティがあります。これらのプロパティの値は、対応するコンポーネントの Google IAM サービス アカウントのメールアドレスです。次に例を示します。watcher gsa: apigee-watcher@my-hybrid-project.iam.gserviceaccount.com
- 非本番環境のインストールでは、
gcp.workloadIdentity.gsa
プロパティで 1 つの GSA を指定できます。gcp workloadIdentity gsa: apigee-watcher@my-hybrid-project.iam.gserviceaccount.com
- Apigee ハイブリッドの Helm チャートで、Workload Identity 用に本番環境と非本番環境の GSA を混在させます。
gcp.workloadIdentity.gsa
プロパティに GSA を 1 つ指定することも、特定のコンポーネントに GSA を個別に指定することもできます。個々のコンポーネントに指定した値は、そのコンポーネントでのみgcp.workloadIdentity.gsa
に指定した値をオーバーライドします。
Workload Identity の構成を準備する
- オーバーライド ファイルで Workload Identity が有効になっていることを確認します。オーバーライド ファイルで有効にし、次の構成プロパティに値が設定されている必要があります。
- すべてのインストールで、
gcp.workloadIdentityEnabled
をtrue
にする必要があります。次に例を示します。gcp: workloadIdentity: enabled: true
- 本番環境のインストールの場合:
- 非本番環境のインストールの場合は、
gcp.workloadIdentity.gsa
プロパティに非本番環境 GSA のアドレス(必要なすべての IAM ロールを含む)を指定します。
- すべてのインストールで、
- 次のコマンドを使用して、Google Cloud プロジェクト ID に設定されている現在の
gcloud
構成を確認します。gcloud config get project
- GKE クラスタで Workload Identity が有効になっていることを確認します。ステップ 1: クラスタを作成するでクラスタを作成したとき、ステップ 6 で Workload Identity を有効にしました。次のコマンドを実行して、Workload Identity が有効になっているかどうかを確認できます。
リージョン クラスタ
gcloud container clusters describe $CLUSTER_NAME \ --region $CLUSTER_LOCATION \ --project $PROJECT_ID \ --flatten 'workloadIdentityConfig'
ゾーンクラスタ
gcloud container clusters describe $CLUSTER_NAME \ --zone $CLUSTER_LOCATION \ --project $PROJECT_ID \ --flatten 'workloadIdentityConfig'
出力は次のようになります。
--- workloadPool: PROJECT_ID.svc.id.goog
結果に
null
が表示された場合は、次のコマンドを実行してクラスタで Workload Identity を有効にします。リージョン クラスタ
gcloud container clusters update $CLUSTER_NAME \ --workload-pool=$PROJECT_ID.svc.id.goog \ --project $PROJECT_ID \ --region $CLUSTER_LOCATION
ゾーンクラスタ
gcloud container clusters update $CLUSTER_NAME \ --workload-pool=$PROJECT_ID.svc.id.goog \ --zone $CLUSTER_LOCATION \ --project $PROJECT_ID
-
次のコマンドを使用して、各ノードプールで Workload Identity を有効にします。このオペレーションは、ノードごとに最大 30 分かかることがあります。
リージョン クラスタ
gcloud container node-pools update NODE_POOL_NAME \ -cluster=$CLUSTER_NAME \ --region $CLUSTER_LOCATION \ --project $PROJECT_ID \ --workload-metadata=GKE_METADATA
ゾーンクラスタ
gcloud container node-pools update NODE_POOL_NAME \ --cluster=$CLUSTER_NAME \ --zone $CLUSTER_LOCATION \ --project $PROJECT_ID \ --workload-metadata=GKE_METADATA
ここで、NODE_POOL_NAME は各ノードプールの名前です。ほとんどの Apigee ハイブリッド インストールでは、2 つのデフォルト ノードプールは
apigee-data
とapigee-runtime
という名前になっています。 - 次のコマンドを使用して、ノードプールで Workload Identity が有効になっていることを確認します。
リージョン クラスタ
gcloud container node-pools describe apigee-data \ --cluster $CLUSTER_NAME \ --region $CLUSTER_LOCATION \ --project $PROJECT_ID \ --flatten "config:"
gcloud container node-pools describe apigee-runtime \ --cluster $CLUSTER_NAME \ --region $CLUSTER_LOCATION \ --project $PROJECT_ID \ --flatten "config:"
ゾーンクラスタ
gcloud container node-pools describe apigee-data \ --cluster $CLUSTER_NAME \ --zone $CLUSTER_LOCATION \ --project $PROJECT_ID \ --flatten "config:"
gcloud container node-pools describe apigee-runtime \ --cluster $CLUSTER_NAME \ --zone $CLUSTER_LOCATION \ --project $PROJECT_ID \ --flatten "config:"
出力は次のようになります。
--- diskSizeGb: 100 diskType: pd-standard ... workloadMetadataConfig: mode: GKE_METADATA
必要に応じて、現在の gcloud
構成を設定します。
gcloud config set project $PROJECT_ID
Workload Identity を構成する
次のハイブリッド コンポーネントに対して Workload Identity を有効にする手順は次のとおりです。
apigee-telemetry
apigee-org
apigee-env
apigee-datastore
、apigee-env
、apigee-org
、apigee-telemetry
チャートに対して --dry-run
フラグを指定して helm upgrade
を実行すると、正しい GSA 名と KSA 名で Workload Identity を構成する際に必要になるコマンドが出力に含まれます。
次に例を示します。
helm upgrade datastore apigee-datastore/ \ --namespace $NAMESPACE \ -f overrides.yaml \ --dry-run
NAME: datastore ... For C* backup GKE Workload Identity, please make sure to add the below membership to the IAM policy binding using the respective kubernetes SA (KSA). gcloud iam service-accounts add-iam-policy-binding \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:my-project.svc.id.goog[apigee/apigee-cassandra-backup-sa]" \ --project :my-project
apigee-datastore
の Workload Identity を設定するコマンドを取得し、出力のNOTES:
でコマンドを実行します。helm upgrade datastore apigee-datastore/ \ --namespace $NAMESPACE \ -f overrides.yaml \ --dry-run
apigee-telemetry
の Workload Identity を設定するコマンドを取得し、出力のNOTES:
でコマンドを実行します。helm upgrade telemetry apigee-telemetry/ \ --namespace $NAMESPACE \ -f overrides.yaml \ --dry-run
apigee-org
の Workload Identity を設定するコマンドを取得し、出力のNOTES:
でコマンドを実行します。helm upgrade $ORG_NAME apigee-org/ \ --namespace $NAMESPACE \ -f overrides.yaml \ --dry-run
apigee-env
の Workload Identity を設定するコマンドを取得し、出力のNOTES:
でコマンドを実行します。helm upgrade $ENV_NAME apigee-env/ \ --namespace $NAMESPACE \ --set env=ENV_NAME \ -f overrides.yaml \ --dry-run
この手順をインストール環境ごとに繰り返します。
Workload Identity を確認する
- 正しく実行されたかどうか確認します。
gcloud config set project $PROJECT_ID
kubectl run --rm -it --image google/cloud-sdk:slim \ --namespace $NAMESPACE workload-identity-test\ -- gcloud auth list
コマンド プロンプトが表示されない場合は、Enter キーを押してください。
正しく実行されると、次のようなレスポンスが表示されます。
Credentialed Accounts ACTIVE ACCOUNT * GSA@PROJECT_ID.iam.gserviceaccount.com
- 以前のインストールからアップグレードする場合は、サービス アカウントの秘密鍵を含む Secret をクリーンアップします。
kubectl delete secrets -n $NAMESPACE $(k get secrets -n $NAMESPACE | grep svc-account | awk '{print $1}')
- ログを確認します。
kubectl logs -n $NAMESPACE -l app=apigee=synchronizer,env=$ENV_NAME,org=$ORG_NAME apigee-synchronizer
- (省略可)Kubernetes サービス アカウントのステータスは、Google Cloud コンソールの Kubernetes のワークロードの概要ページで確認できます。