GKE Namespace へのデプロイの制限

Google Kubernetes Engine(GKE)にデプロイすると、デフォルトの Google Cloud Deploy 実行サービス アカウントは、ターゲット クラスタ内のすべての Namespace にアクセスできます。このサービス アカウントは、1 つの Namespace にのみデプロイするように構成できます。

  1. 実行サービス アカウントに roles/container.developer IAM ロールがないことを確認します。

  2. サービス アカウントに roles/container.clusterViewer ロールを付与します。

    gcloud projects add-iam-policy-binding PROJECT_ID \
     --member="serviceAccount:SERVICE_ACCOUNT" \
     --role="roles/container.clusterViewer"
    

    このロールは、サービス アカウントでクラスタに対する認証を許可しますが、それ以外の認証は行いません。

  3. Namespace に対する管理者のアクセス権を付与する Kubernetes RBAC ロールを作成する。

    この例の RBAC ロールには、clouddeploy.developer IAM ロールと同等の幅広い権限があります。権限昇格のリスクを最小限に抑えるため、これらの権限をアプリで必要最小限のものに変更することをおすすめします。手順については、GKE の RBAC ドキュメントをご覧ください。

    kind: Role
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: admin
      namespace: NAMESPACE
    rules:
    - apiGroups: ["", "extensions", "apps"]
      resources: ["*"]
      verbs: ["*"]
    
  4. 選択した Namespace の RBAC ロールを Google Cloud Deploy 実行サービス アカウントにバインドする RoleBinding を作成します。

    kind: RoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: admin
      namespace: NAMESPACE
    subjects:
    # Google Cloud user account
    - kind: User
      name: SERVICE_ACCOUNT
    roleRef:
      kind: Role
      name: admin
      apiGroup: rbac.authorization.k8s.io
    

    このマニフェストは、admin ロールを実行サービス アカウントにバインドする RBAC ポリシーを定義します。NAMESPACE は、サービス アカウントへのアクセスを許可する名前空間です。サービス アカウントは、クラスタ内の他の Namespace にアクセスできません。

  5. RBAC マニフェストをクラスタに適用します。

    kubectl apply -f YAML_NAME