Config Controllerで複数Namespaceを使ったリソース管理

記事タイトルとURLをコピーする

G-gen の堂原です。本記事では Config Connector を Config Controller で構築した際に、複数の Kubernetes Namespace を使ってリソース管理を行う方法を紹介します。

本記事について

Config Connector は、Kubernetes を使用して Google Cloud のリソースを管理できる Kubernetes のアドオンです。

Google Cloud においては、Config Controller という Config Connector のマネージドサービスが提供されています。

Config Connector や Config Controller の基本的な解説や使い方は以下の記事で紹介しています。 blog.g-gen.co.jp

※ 本記事では、上記記事で紹介されているような、以下の内容を理解されている前提で話を進めます。

  • Config Controller を用いて、 Config Connector 用の Google Kubernetes Engine (GKE) クラスタを構築する方法
  • Config Controller インスタンスが存在する Google Cloud プロジェクト (以後、「プロジェクト」と記載) 上に、Config Connector を用いてリソースを作成する方法

前提知識

Namespace モード

Config Connector には Cluster モードと Namespace モードという 2 つのモードが存在します。

  • Cluster モード : 単一のサービスアカウントで全てのリソースを管理する設定
  • Namespace モード : 複数のサービスアカウントでリソースを管理する設定で、Kubernetes Namespace (以後、「Namespace」と記載) 毎にサービスアカウントを割り当てる

Namespace モードは、複数プロジェクトを跨る大量のリソースを管理するのに向いていると言えます。

なお、Config Connector を GKE クラスタにインストールする場合は、いずれのモードも Workload Identity での実装が基本となります。 Config Controller も GKE クラスタを用いているため、Workload Identity で実装されています。

GKE における Workload Identity については、以下の記事で紹介しています。 blog.g-gen.co.jp

Config Controller のデフォルト状態

Config Controller で構築された Config Connector においては、Namespace モードがデフォルトとなっています。

また、デフォルトで使用可能な Namespace は config-control です。 config-control 以外の Namespace に Config Connector リソースを作成した場合は、該当の Config Connector リソースのステータスが Unamanged となり、Google Cloud 上に対応するリソースがデプロイされることはありません。

実施内容

概要

下図のような環境にて、フォルダ appleorange の直下に 2 つずつプロジェクトを作成します。 ※ 実施後に各リソースは削除済みのため ID をマスクせずに掲示しています

実施前のフォルダ構成

実施内容は以下の通りです。

  1. プロジェクト test-cc に Config Controller インスタンスを作成
  2. 専用のサービスアカウント test-cc-appletest-cc-orange を作成
  3. 各サービスアカウントに以下のロールを付与
    • test-cc-apple : フォルダ apple に対する「プロジェクト作成者」ロール
    • test-cc-orange : フォルダ orange に対する「プロジェクト作成者」ロール
  4. Workload Identity を設定
  5. Kubernetes クラスタ内に Namespace appleorange 及び ConfigConnectorContext オブジェクト作成
  6. 各プロジェクト作成

完成形を図示すると下図となります。

完成形のイメージ

1. Config Controller インスタンス作成

以下のコマンドを実行して、Config Controller インスタンスを作成します。

Config Controller インスタンスは GKE Standard クラスタと Autopilot クラスタの両方で作成可能ですが、ここでは Autopilot クラスタで作成しています。

gcloud anthos config controller create test-cc --location=asia-northeast1 --full-management

コマンド完了後、Kubernetes クラスタの認証情報を取得します。

gcloud anthos config controller get-credentials test-cc --location=asia-northeast1

Config Controller インスタンス作成直後だと、ConfigConnectorContext オブジェクトは Namespace config-control にのみ存在します

$ kubectl get ConfigConnectorContext --all-namespaces
NAMESPACE        NAME                                                AGE     HEALTHY
config-control   configconnectorcontext.core.cnrm.cloud.google.com   9m11s   true

2. サービスアカウント作成

一旦 kubectl から離れ、サービスアカウント周りの設定を行っていきます。 まずは今回使用するサービスアカウント test-cc-apple 及び test-cc-orange を作成します。

gcloud iam service-accounts create test-cc-apple --project test-cc-395016

gcloud iam service-accounts create test-cc-orange --project test-cc-395016

3. サービスアカウントにロール付与

作成したサービスアカウントに対してプロジェクト作成に必要なロールを付与します。

個々の Namespace にサービスアカウントを紐付けることが出来るゆえに、必要以上のスコープでロールを付与する必要がなくなります。

gcloud resource-manager folders add-iam-policy-binding 391788755828 \
     --member="serviceAccount:test-cc-apple@test-cc-395016.iam.gserviceaccount.com" \
     --role="roles/resourcemanager.projectCreator"

gcloud resource-manager folders add-iam-policy-binding 1027926769724 \
    --member="serviceAccount:test-cc-orange@test-cc-395016.iam.gserviceaccount.com" \
    --role="roles/resourcemanager.projectCreator"

4. Workload Identity 設定

Google Cloud のサービスアカウント test-cc-appletest-cc-orange を、Kubernetes の Service Account に紐づけます。

gcloud iam service-accounts add-iam-policy-binding \
test-cc-apple@test-cc-395016.iam.gserviceaccount.com \
    --member="serviceAccount:test-cc-395016.svc.id.goog[cnrm-system/cnrm-controller-manager-apple]" \
    --role="roles/iam.workloadIdentityUser" \
    --project test-cc-395016

gcloud iam service-accounts add-iam-policy-binding \
test-cc-orange@test-cc-395016.iam.gserviceaccount.com \
    --member="serviceAccount:test-cc-395016.svc.id.goog[cnrm-system/cnrm-controller-manager-orange]" \
    --role="roles/iam.workloadIdentityUser" \
    --project test-cc-395016

この時点では Kubernetes クラスタ上に該当の Service Account は存在せず、ConfigConnectorContext オブジェクト作成時に作成されます。

以上、Google Cloud 側の作業は完了です。

5. Namespace 及び ConfigConnectorContext オブジェクト作成

以下のマニュフェストファイルを適応させることで、Namespace 及び ConfigConnectorContext オブジェクトを作成します。

apiVersion: v1
kind: Namespace
metadata:
  name: apple
---
apiVersion: core.cnrm.cloud.google.com/v1beta1
kind: ConfigConnectorContext
metadata:
  name: configconnectorcontext.core.cnrm.cloud.google.com
  namespace: apple
spec:
  googleServiceAccount: test-cc-apple@test-cc-395016.iam.gserviceaccount.com
---
apiVersion: v1
kind: Namespace
metadata:
  name: orange
---
apiVersion: core.cnrm.cloud.google.com/v1beta1
kind: ConfigConnectorContext
metadata:
  name: configconnectorcontext.core.cnrm.cloud.google.com
  namespace: orange
spec:
  googleServiceAccount: test-cc-orange@test-cc-395016.iam.gserviceaccount.com

以下、ConfigConnectorContext オブジェクトのマニフェストファイルのポイントです。

  • metadata:name の値は configconnectorcontext.core.cnrm.cloud.google.com のみ認められており、これ以外の値だとエラーとなります。

    error during reconciliation: the only allowed name for ConfigConnectorContext object is 'configconnectorcontext.core.cnrm.cloud.google.com'. The name restriction is required to ensure that there is only one ConfigConnectorContext instance in your namespace
    
  • metadata:namespace で、ConfigConnectorContext オブジェクトを作成したい Namespace を指定します。

  • spec:googleServiceAccount で、Workload Identity で紐づけたサービスアカウントを指定します。

このタイミングで、手順 4. で指定していた Kubernetes Service Account が作成されます。

$ kubectl get ServiceAccount -n cnrm-system
NAME                                     SECRETS   AGE
cnrm-controller-manager-apple            0         26m
cnrm-controller-manager-config-control   0         41m
cnrm-controller-manager-orange           0         26m
cnrm-deletiondefender                    0         40m
cnrm-resource-stats-recorder             0         40m
cnrm-unmanaged-detector                  0         40m
cnrm-webhook-manager                     0         40m
default                                  0         41m

6. プロジェクト作成

最後に metadata:namespaceapple または orange とした上で、プロジェクト用のマニフェストファイルを適応させます。

以下はフォルダ apple 配下に作成するプロジェクト用のマニフェストファイルです。

apiVersion: resourcemanager.cnrm.cloud.google.com/v1beta1
kind: Project
metadata:
  annotations:
    cnrm.cloud.google.com/auto-create-network: "false"
  name: prod-apple
  namespace: apple
spec:
  name: Prod Apple
  resourceID: prod-apple-dfe
  folderRef:
    external: "391788755828"
---
apiVersion: resourcemanager.cnrm.cloud.google.com/v1beta1
kind: Project
metadata:
  annotations:
    cnrm.cloud.google.com/auto-create-network: "false"
  name: dev-apple
  namespace: apple
spec:
  name: Dev Apple
  resourceID: dev-apple-dfe
  folderRef:
    external: "391788755828"

同様に orange も適応させることで、以下のようにプロジェクトを作成することが出来ます。

実施後のフォルダ構成

堂原 竜希(記事一覧)

クラウドソリューション部データアナリティクス課。2023年4月より、G-genにジョイン。

Google Cloud Partner Top Engineer 2023, 2024に選出 (2024年はRookie of the yearにも選出)。休みの日はだいたいゲームをしているか、時々自転車で遠出をしています。