Kubernetes サービス アカウントの使用

このページでは、Kubernetes サービス アカウントと Google Kubernetes Engine(GKE)でそれらのアカウントを使用する方法、および使用するのが適した場合について説明します。

概要

Kubernetes サービス アカウントは Kubernetes API を使用して作成、管理される Kubernetes リソースであり、Kubernetes API サーバーまたは外部サービスでの認証を行うことを目的として、クラスタ内で Kubernetes によって作成された Pod などのエンティティが使用するためのものです。

Kubernetes サービス アカウントは、Identity and Access Management(IAM)のサービス アカウントとは異なります。

Kubernetes サービス アカウントを使用するのが適した場合

Kubernetes サービス アカウントを使用すると、Pod に ID を付与し、Pod を次の目的で使用できます。

  • Pod を Kubernetes API サーバーに対して認証すると、Pod は Kubernetes API オブジェクト(例: クラスタにアプリケーションをデプロイする CI / CD パイプライン)の読み取りと操作を行うことを許可されます。
  • Workload Identity を使用して Pod を Google Cloud リソースに対して認証し、Pod が Google サービス アカウントとして機能できるようにします。これにより、Google Cloud APIs にアクセスする必要がある場合に、Pod に詳細な ID と認可を付与できます。

Kubernetes サービス アカウントを作成する

Kubernetes サービス アカウントを作成するには、以下のタスクを実行します。

  1. クラスタと通信を行うように kubectl を構成します。

    gcloud container cluster get-credentials CLUSTER_NAME
    

    CLUSTER_NAME は、使用するクラスタの名前に置き換えます。

  2. Namespace を作成します。

    kubectl create namespace NAMESPACE_NAME
    

    NAMESPACE_NAME を新しい Namespace の名前に置き換えます。

  3. Namespace 用の Kubernetes サービス アカウントを作成します。

    kubectl create serviceaccount KSA_NAME --namespace NAMESPACE_NAME
    

    以下を置き換えます。

    • KSA_NAME: 新しい Kubernetes サービス アカウントの名前。
    • NAMESPACE_NAME: Namespace の名前。

Kubernetes サービス アカウントを Pod に割り当てる

Kubernetes サービス アカウントを使用する場合は、2 つの異なる認証情報タイプから選択できます。

  • 標準のサービス アカウント認証情報: サービス アカウントの静的な有効期間が長い認証情報を Pod にマウントします。

    apiVersion: v1
    kind: Pod
    metadata:
      name: POD_NAME
      namespace: NAMESPACE_NAME
    spec:
      serviceAccountName: KSA_NAME
    
  • サービス アカウント トークン ボリュームのプロジェクション: 有効期間が短い、自動でローテーションされる Kubernetes サービス アカウント トークンを Pod にマウントします。このトークンは OpenID Connect トークンであり、Kubernetes API やその他の外部サービスでの認証に使用できます。

    apiVersion: v1
    kind: Pod
    metadata:
      name: POD_NAME
      namespace: NAMESPACE_NAME
    spec:
      containers:
      - image: CONTAINER_NAME
        name: CONTAINER_NAME
        volumeMounts:
        - mountPath: /var/run/secrets/tokens
          name: KSA_NAME_TOKEN
      serviceAccountName: KSA_NAME
      volumes:
      - name: KSA_NAME_TOKEN
        projected:
          sources:
          - serviceAccountToken:
              path: KSA_NAME_TOKEN
              expirationSeconds: 86400
              audience: some-oidc-audience
    

サービス アカウントの管理についてのベスト プラクティス

  • クラスタの管理境界に基づいて、Namespace でサービス アカウントを分離します。これにより、クラスタ内の特定のサービス アカウントを管理できるユーザーを制限できます。この機能については、組織の規模が拡大した場合に価値が明確になる可能性があります。
  • ワークロードごとに 1 つの Namespace を使用します。ただし、単一の Namespace に存在する複数のワークロードに異なる責任を割り当てる必要がある場合は、それらのワークロードの責任に対して異なるサービス アカウントを使用します。デフォルトのサービス アカウントは使用しないでください。Pod にサービス アカウントが指定されていない場合、Pod は Namespace のデフォルトのサービス アカウントとして実行されます。ワークロードごとに Kubernetes サービス アカウントを作成すると、最小権限の原則をより適切に適用できます。
  • サービス アカウント トークンのボリューム プロジェクションを使用すると、サービス アカウントの認証情報の有効期間を短く設定し、認証情報の漏洩による影響を軽減できます。

Kubernetes サービス アカウントの認証情報のローテーション

Kubernetes サービス アカウントの認証情報が不正使用された場合に、不正使用された認証情報を取り消すには、次の 2 つの方法のいずれかに沿って処理します。

  • 新しい Kubernetes サービス アカウントを作成し、Pod と認可を新しいサービス アカウントに移行してから、以前の Kubernetes サービス アカウントへのアクセス権を取り消します。
  • 認証情報のローテーションを行います。これにより、クラスタ内のすべての Kubernetes サービス アカウントの認証情報が取り消されます。ローテーションによって、クラスタの CA 証明書と IP アドレスも変更されます。

次のステップ