GKE で Workload Identity を有効にする

このトピックでは、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_ID
echo $ORG_NAME
echo $ENV_NAME
echo $NAMESPACE
echo $CLUSTER_LOCATION
echo $CLUSTER_NAME

必要な変数を初期化します。

export PROJECT_ID=my-project-id
export 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 の構成を準備する

  1. オーバーライド ファイルで Workload Identity が有効になっていることを確認します。オーバーライド ファイルで有効にし、次の構成プロパティに値が設定されている必要があります。
  2. 次のコマンドを使用して、Google Cloud プロジェクト ID に設定されている現在の gcloud 構成を確認します。
    gcloud config get project
  3. 必要に応じて、現在の gcloud 構成を設定します。

    gcloud config set project $PROJECT_ID
  4. 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
  5. 次のコマンドを使用して、各ノードプールで 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-dataapigee-runtime という名前になっています。

  6. 次のコマンドを使用して、ノードプールで 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
      

Workload Identity を構成する

次のハイブリッド コンポーネントに対して Workload Identity を有効にする手順は次のとおりです。

  • apigee-datastore
  • apigee-telemetry
  • apigee-org
  • apigee-env

apigee-datastoreapigee-envapigee-orgapigee-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
  1. apigee-datastore の Workload Identity を設定するコマンドを取得し、出力の NOTES: でコマンドを実行します。
    helm upgrade datastore apigee-datastore/ \
      --namespace $NAMESPACE \
      -f overrides.yaml \
      --dry-run=server
  2. apigee-telemetry の Workload Identity を設定するコマンドを取得し、出力の NOTES: でコマンドを実行します。
    helm upgrade telemetry apigee-telemetry/ \
      --namespace $NAMESPACE \
      -f overrides.yaml \
      --dry-run
  3. apigee-org の Workload Identity を設定するコマンドを取得し、出力の NOTES: でコマンドを実行します。
    helm upgrade $ORG_NAME apigee-org/ \
      --namespace $NAMESPACE \
      -f overrides.yaml \
      --dry-run
  4. apigee-env の Workload Identity を設定するコマンドを取得し、出力の NOTES: でコマンドを実行します。
    helm upgrade $ENV_NAME apigee-env/ \
      --namespace $NAMESPACE \
      --set env=$ENV_NAME \
      -f overrides.yaml \
      --dry-run

    この手順をインストール環境ごとに繰り返します。

Workload Identity を確認する

  1. 正しく実行されたかどうか確認します。
    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
  2. 以前のインストールからアップグレードする場合は、サービス アカウントの秘密鍵を含むシークレットをクリーンアップします。
    kubectl delete secrets -n $NAMESPACE $(k get secrets -n $NAMESPACE | grep svc-account | awk '{print $1}')
    
  3. ログを確認します。
    kubectl logs -n $NAMESPACE -l app=apigee=synchronizer,env=$ENV_NAME,org=$ORG_NAME apigee-synchronizer
    
  4. (省略可)Kubernetes サービス アカウントのステータスを、Google Cloud コンソールの Kubernetes のワークロードの概要ページで確認できます。

    [ワークロード] に移動