GKE 用 Workload Identity 連携を使用する

Workload Identity Federation for GKE を使用して Knative serving サービスを認証し、Compute API、Storage API、Database API、Machine Learning API などの Google Cloud APIs にアクセスする方法を説明します。

Knative serving サービスを認証するには、次のことを行う必要があります。

  1. クラスタで Workload Identity Federation for GKE を有効にする
  2. 権限を構成する
  3. Kubernetes サービス アカウント(KSA)を Google サービス アカウント(GSA)にバインドする

この手順が完了したら、作成した ID を使用する新しい Knative serving サービスをデプロイできます。

クラスタで GKE 用 Workload Identity 連携を有効にする

Knative serving で Workload Identity Federation for GKE を設定するには、Google Cloud サービス アカウントの JSON ファイルを使用する代わりに、フリートの Workload Identity 連携を設定します。

すべての指標を有効できる権限を構成する

Google Cloud Observability へのリクエスト数やリクエストのレイテンシなどの指標を有効にするには、Cloud Monitoring の書き込み権限を付与する必要があります。たとえば、Knative serving に関連付けられている Google サービス アカウントに、モニタリング指標の書き込みロールroles/monitoring.metricWriter)を付与する必要があります。これは、このロールにモニタリング データを書き込むために必要な権限が含まれているためです。Google サービス アカウントの作成の詳細については、サービス アカウントを使用するをご覧ください。

サービス アカウントをバインドする

Google サービス アカウント(GSA)として機能する Kubernetes サービス アカウント(KSA)の関係を設定する必要があります。バインドする KSA として実行されるワークロードは、Google Cloud APIs にアクセスするとき自動的に GSA として認証されます。バインドする KSA は、GKE 用 Workload Identity 連携を使用する Knative serving サービスのクラスタと名前空間内に存在する必要があります。GSA は、クラスタが存在する Google Cloud プロジェクトとは異なる Google Cloud プロジェクトに属することができます。

  1. GSA が存在しない場合は作成します。存在する場合は、次の手順に進みます。組織内の任意の Google Cloud プロジェクト内で、Knative serving で使用する GSA を作成すると、Knative serving サービスが動作する Google Cloud プロジェクトで GSA を使用できます。

    次のコマンドを実行して、新しいGSAを作成します。

    gcloud iam service-accounts create GSA_NAME

    GSA_NAME は、新しい Google Cloud サービス アカウントの名前に置き換えます。

    Knative serving サービスで Google サービス アカウントを使用する方法については、サービス アカウントを使用するをご覧ください。

  2. GSA に必要な IAM ロールがあることを確認します。次のコマンドを使用して、追加のロールを付与できます。

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member "serviceAccount:GSA_NAME@PROJECT_ID.iam.gserviceaccount.com" \
        --role "ROLE_NAME"

    以下のように置き換えます。

    • PROJECT_ID: Google サービス アカウントが存在する Google Cloud プロジェクト ID。
    • GSA_NAME: Google サービス アカウントの名前。
    • ROLE_NAME: GSA に割り当てる IAM ロール(roles/monitoring.metricWriter など)。
  3. Kubernetes サービス アカウント(KSA)が存在しない場合、Knative serving サービスと同じ Kubernetes 名前空間にアカウントを作成します。それ以外の場合は、スキップして次の手順に進みます。

    kubectl create serviceaccount --namespace K8S_NAMESPACE KSA_NAME
  4. Kubernetes サービス アカウントと Google サービス アカウントをバインドして ID を作成し、クラスタにデプロイします。

    1. 2 つの間の IAM ポリシー バインディングを作成すると、KSA が GSA を偽装できるようになります。

      gcloud iam service-accounts add-iam-policy-binding \
      --role roles/iam.workloadIdentityUser \
      --member "serviceAccount:PROJECT_ID.svc.id.goog[K8S_NAMESPACE/KSA_NAME]" \
      GSA_NAME@GSA_PROJECT_ID.iam.gserviceaccount.com

      次のように置き換えます。

      • PROJECT_ID は、Kubernetes サービス アカウントと Knative serving サービスが存在するクラスタの Google Cloud プロジェクトの ID に置き換えます。
      • K8S_NAMESPACE/KSA_NAME は、Kubernetes サービス アカウントの名前空間と名前に置き換えます。
      • GSA_NAME@GSA_PROJECT_ID は、Google サービス アカウントの名前と Google Cloud プロジェクトの ID に置き換えます。組織内の任意の Google サービス アカウントを使用できます。Google サービス アカウントを表示するには、サービス アカウントの一覧取得をご覧ください。
    2. GSA のメールアドレスを使用して、iam.gke.io/gcp-service-account=GSA_NAME@GSA_PROJECT_ID アノテーションを KSA に追加します。

      kubectl annotate serviceaccount \
      --namespace K8S_NAMESPACE KSA_NAME \
       iam.gke.io/gcp-service-account=GSA_NAME@GSA_PROJECT_ID.iam.gserviceaccount.com

      以下のように置き換えます。

      • K8S_NAMESPACE/KSA_NAME: バインディングを作成した Kubernetes サービス アカウントの Namespace と名前。
      • GSA_NAME@GSA_PROJECT_ID: Google サービス アカウントの名前と、バインディングを作成した Google Cloud プロジェクトの ID。

Workload Identity Federation for GKE を使用する新しいサービスをデプロイする

作成した Workload Identity Federation for GKE を使用する新しい Knative serving サービスをデプロイします。

Console

  1. Google Cloud コンソールで Knative serving に移動します。

    Knative serving に移動

  2. デプロイ先の新しいサービスを構成する場合は、[サービスを作成] をクリックします。既存のサービスを構成する場合は、そのサービスをクリックし、[新しいリビジョンの編集とデプロイ] をクリックします。

  3. [詳細設定] で [コンテナ] をクリックします。

  4. [サービス アカウント] プルダウンをクリックして、目的のサービス アカウントを選択します。

  5. [次へ] をクリックして、次のセクションに進みます。

  6. [このサービスをトリガーする方法の構成] セクションで、サービスを呼び出すために使用する接続を選択します。

  7. [作成] をクリックしてイメージを Knative serving にデプロイし、デプロイの完了を待ちます。

コマンドライン

  • 既存のサービスの場合は、次のパラメータを使用して gcloud run services update コマンドを実行し、Kubernetes サービス アカウントを設定します。

    gcloud run services update SERVICE --service-account KSA_NAME

    次のように置き換えます。

    • SERVICE は、Knative serving サービスの名前に置き換えます。
    • KSA_NAME は、Workload Identity の作成に使用した Kubernetes サービス アカウントに置き換えます。
  • 新しいサービスの場合は、--service-account パラメータを使用して gcloud run deploy コマンドを実行し、Kubernetes サービス アカウントを設定します。

    gcloud run deploy --image IMAGE_URL --service-account KSA_NAME

    以下のように置き換えます。

    • IMAGE_URL: コンテナ イメージへの参照(gcr.io/cloudrun/hello など)。
    • KSA_NAME は、Workload Identity の作成に使用した Kubernetes サービス アカウントに置き換えます。

YAML

--format=export フラグを使用して、gcloud run services describe コマンドで既存のサービスの構成を YAML ファイルにダウンロードできます。次に YAML ファイルを変更し、gcloud run services replace コマンドを使用してこれらの変更をデプロイします。指定した属性のみを変更する必要があります。

  1. ローカル ワークスペースの service.yaml という名前のファイルにサービスの構成をダウンロードします。

    gcloud run services describe SERVICE --format export > service.yaml

    SERVICE は、Knative serving サービスの名前に置き換えます。

  2. ローカル ファイルで serviceAccountName: 属性を更新します。

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
    spec:
      template:
        spec:
          serviceAccountName: KSA_NAME

    次のように置き換えます。

    • SERVICE は、Knative serving サービスの名前に置き換えます。
    • KSA_NAME は、Workload Identity の作成に使用した Kubernetes サービス アカウントに置き換えます。
  3. 次のコマンドを実行して、Knative serving サービスに構成をデプロイします。

    gcloud run services replace service.yaml

既存のサービスを移行して GKE 用 Workload Identity 連携を使用する

既存のクラスタで Workload Identity Federation for GKE を有効にした場合、Workload Identity Federation for GKE を使用するクラスタの各サービスを移行する必要があります。既存のサービスを移行する方法について学習する

次のステップ

サービスへのアクセスを管理する方法を確認する。