このトピックでは、GKE 上の Apigee ハイブリッドで Workload Identity を有効にする方法について説明します。
Apigee ハイブリッド AKS または EKS を使用している場合は、AKS と EKS で 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 サービス アカウントとやり取りできます。
これらの手順で使用する環境変数
これらの手順では、次の環境変数を使用します。これらをコマンドシェルに設定するか、コードサンプル内のそれらを実際の値に置き換えます。
PROJECT_ID
: Google Cloud プロジェクトの ID。ORG_NAME
: Apigee 組織の名前。ENV_NAME
: Apigee 環境の名前。NAMESPACE
: Apigee Namespace(通常はapigee
)。CLUSTER_LOCATION
: Kubernetes クラスタのリージョンまたはゾーン(例:us-west1
)。CLUSTER_NAME
: クラスタの名前。
環境変数を確認します。
echo $PROJECT_IDecho $ORG_NAME
echo $ENV_NAME
echo $NAMESPACE
echo $CLUSTER_LOCATION
echo $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=my-cluster-name
Workload Identity とサービス アカウント キー ファイル
GKE で Apigee ハイブリッドを実行するときには、通常、各サービス アカウントの秘密鍵(.json
ファイル)を作成してダウンロードします。Workload Identity を使用する場合、サービス アカウントの秘密鍵をダウンロードして GKE クラスタに追加する必要はありません。
Apigee ハイブリッド インストールの一部としてサービス アカウント キー ファイルをダウンロードした場合は、Workload Identity を有効にした後、それらのファイルを削除できます。ほとんどのインストールでは、各コンポーネントの char ディレクトリに存在します。
Apigee ハイブリッドで Workload Identity を有効にする
プロジェクトの Workload Identity を構成する手順は次のとおりです。
Workload Identity の構成を準備する
- オーバーライド ファイルで Workload Identity が有効になっていることを確認します。オーバーライド ファイルで有効にし、次の構成プロパティに値が設定されている必要があります。
- すべてのインストールで、
gcp.workloadIdentity.enabled
を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-datastore
apigee-telemetry
apigee-org
apigee-env
apigee-datastore
、apigee-env
、apigee-org
、apigee-telemetry
チャートに対して --dry-run
フラグまたは --dry-run=server
フラグを指定して helm upgrade
を実行すると、正しい GSA 名と KSA 名で Workload Identity を構成する際に必要になるコマンドが出力に含まれます。
次に例を示します。
helm upgrade datastore apigee-datastore/ \ --namespace $NAMESPACE \ -f overrides.yaml \ --dry-run=server
NAME: datastore ... For Cassandra 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 my-gsa@my-project-id.iam.gserviceaccount.com \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:my-project-id.svc.id.goog[apigee/apigee-cassandra-default]" \ --project my-project-id kubectl annotate serviceaccount apigee-cassandra-default \ iam.gke.io/gcp-service-account=my-gsa@my-project-id.iam.gserviceaccount.com \ --namespace apigee
apigee-datastore
の Workload Identity を設定するコマンドを取得し、出力のNOTES:
でコマンドを実行します。helm upgrade datastore apigee-datastore/ \ --namespace $NAMESPACE \ -f overrides.yaml \ --dry-run=server
apigee-telemetry
の Workload Identity を設定するコマンドを取得し、出力のNOTES:
でコマンドを実行します。helm upgrade telemetry apigee-telemetry/ \ --namespace $NAMESPACE \ -f overrides.yaml \ --dry-run=server
apigee-org
の Workload Identity を設定するコマンドを取得し、出力のNOTES:
でコマンドを実行します。helm upgrade $ORG_NAME apigee-org/ \ --namespace $NAMESPACE \ -f overrides.yaml \ --dry-run=server
apigee-env
の Workload Identity を設定するコマンドを取得し、出力のNOTES:
でコマンドを実行します。helm upgrade $ENV_NAME apigee-env/ \ --namespace $NAMESPACE \ --set env=$ENV_NAME \ -f overrides.yaml \ --dry-run=server
この手順をインストール環境ごとに繰り返します。
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
- 以前のインストールからアップグレードする場合は、サービス アカウントの秘密鍵を含むシークレットをクリーンアップします。
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 のワークロードの概要ページで確認できます。