デプロイを GKE Namespace に制限する

Google Kubernetes Engine(GKE)にデプロイする場合、デフォルトの Cloud Deploy 実行サービス アカウントは、ターゲット クラスタ内のすべての Namespace にアクセスできます。そのサービス アカウントを構成して、1 つの名前空間にのみデプロイできます。

  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 ロールを 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 は、サービス アカウントにアクセス権を付与する名前空間です。サービス アカウントは、クラスタ上の他の名前空間にアクセスできません。

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

    kubectl apply -f YAML_NAME