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 上に対応するリソースがデプロイされることはありません。
実施内容
概要
下図のような環境にて、フォルダ apple
と orange
の直下に 2 つずつプロジェクトを作成します。
※ 実施後に各リソースは削除済みのため ID をマスクせずに掲示しています
実施内容は以下の通りです。
- プロジェクト
test-cc
に Config Controller インスタンスを作成 - 専用のサービスアカウント
test-cc-apple
とtest-cc-orange
を作成 - 各サービスアカウントに以下のロールを付与
test-cc-apple
: フォルダapple
に対する「プロジェクト作成者」ロールtest-cc-orange
: フォルダorange
に対する「プロジェクト作成者」ロール
- Workload Identity を設定
- Kubernetes クラスタ内に Namespace
apple
とorange
及び ConfigConnectorContext オブジェクト作成- ConfigConnectorContext オブジェクト : Config Connector が該当の Namespace を監視するために必要なオブジェクトで、各 Namespace 毎に作成する必要があります。
- 各プロジェクト作成
完成形を図示すると下図となります。
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-apple
と test-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:namespace
を apple
または 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にも選出)。休みの日はだいたいゲームをしているか、時々自転車で遠出をしています。
Follow @ryu_dohara