Config Controller — Quản Lý GCP Resources Qua Kubernetes CRDs
Tại Sao Quan Trọng Trong Production
Infrastructure-as-Code (IaC) có hai approaches chính:
- Terraform/CloudFormation: Dedicated DSL, separate state management, separate tool lifecycle
- Kubernetes as IaC: Manage infrastructure qua Kubernetes manifests, RBAC, Config Sync, GitOps
Config Controller là Google's answer cho approach thứ hai — fully-managed GKE cluster cài sẵn Config Connector (KCC) cho phép quản lý Google Cloud resources (GCS buckets, Cloud SQL, Pub/Sub topics, Service Accounts, v.v.) bằng Kubernetes CRDs.
Lợi ích:
- Single source of truth: Infra definitions trong Git, apply qua Config Sync giống như application code
- Unified RBAC: Ai được tạo GCS bucket = Kubernetes RBAC roles, không cần separate IAM management
- Declarative: Dùng declarative manifest thay vì imperative scripts
- GitOps workflow: Review infra changes qua PRs, audit trail từ Git commits
Config Controller vs Standalone KCC
Config Connector (KCC) là open-source Kubernetes addon cho phép CRDs quản lý GCP resources.
Config Controller là GCP's fully-managed service:
- Provisioned GKE cluster (Autopilot, không quản lý nodes)
- KCC pre-installed
- Built-in Config Sync
- Connected vào fleet (optional)
- Simplified operations
Standalone KCC:
You provision GKE cluster → install KCC addon → manage yourself
Config Controller:
Google provision GKE cluster → KCC pre-installed → you provision resourcesConfig Controller là recommended approach cho production vì:
- No node management burden
- Automatic KCC updates
- Built-in high availability
- Direct integration with fleet
- Audit logging enabled by default
Internal Architecture — CRD to GCP Resource Reconciliation
Config Connector Custom Resources
KCC define CRDs cho mỗi GCP resource type. Ví dụ: StorageBucket CRD cho GCS bucket:
apiVersion: storage.cnrm.cloud.google.com/v1beta1
kind: StorageBucket
metadata:
name: my-bucket
namespace: default
annotations:
cnrm.cloud.google.com/project-id: my-project
spec:
location: US
versioning:
enabled: true
lifecycleRule:
- action:
type: Delete
condition:
age: 30
- action:
type: SetStorageClass
storageClass: ARCHIVE
condition:
numNewerVersions: 3Khi resource apply, KCC controller:
- Validate spec — StorageBucket spec dùng custom validation rules
- Call GCP APIs —
storage.googleapis.com CreateBucket - Set ownership — GCP resource được tagged với annotations cho traceability
- Update status —
.status.selfLink,.status.conditions, GCP resource ID - Watch for external changes — nếu bucket bị modified vào GCP console, KCC detect drift
Example: Service Account Management
apiVersion: iam.cnrm.cloud.google.com/v1beta1
kind: IAMServiceAccount
metadata:
name: payments-service-account
namespace: default
annotations:
cnrm.cloud.google.com/project-id: my-project
spec:
displayName: "Payments Service Account"
---
# Grant payments-service-account role editor trên GCS bucket
apiVersion: storage.cnrm.cloud.google.com/v1beta1
kind: StorageBucketIAMBinding
metadata:
name: bucket-payments-access
namespace: default
spec:
bucketRef:
name: my-bucket
role: roles/storage.objectViewer
members:
- serviceAccount:payments-service-account@my-project.iam.gserviceaccount.comKhi apply:
- IAMServiceAccount controller create GCP Service Account
- StorageBucketIAMBinding controller apply IAM binding tới bucket
- Nếu delete resource từ Kubernetes, GCP resource default được delete (tùy theo resource type)
Deletion Protection
Xóa Kubernetes resource default xóa GCP resource — nguy hiểm. KCC support deletion protection:
apiVersion: storage.cnrm.cloud.google.com/v1beta1
kind: StorageBucket
metadata:
name: prod-bucket
annotations:
cnrm.cloud.google.com/deletion-policy: abandon
spec:
...Deletion policies:
delete(default): Delete GCP resource khi KCC resource deletedabandon: Keep GCP resource, remove từ KCC managementretain: Prevent deletion (raise error nếu try delete)
For production resources: luôn set deletion-policy: abandon để prevent accidental deletion.
Khác với Terraform prevent_destroy, abandon cho phép resource tồn tại independent sau khi delete Kubernetes resource. Tức là rollback không impossible — GCP resource vẫn sống, chỉ KCC quản lý bị remove.
Dependency Management
KCC handle resource dependencies via references:
apiVersion: sql.cnrm.cloud.google.com/v1beta1
kind: SQLInstance
metadata:
name: prod-database
namespace: default
spec:
databaseVersion: MYSQL_8_0
settings:
backupConfiguration:
enabled: true
---
apiVersion: sql.cnrm.cloud.google.com/v1beta1
kind: SQLDatabase
metadata:
name: payments-db
namespace: default
spec:
instanceRef:
name: prod-database # Reference to SQLInstance above
charset: utf8mb4
---
apiVersion: sql.cnrm.cloud.google.com/v1beta1
kind: SQLUser
metadata:
name: payments-user
namespace: default
spec:
instanceRef:
name: prod-database
password:
valueFrom:
secretKeyRef:
name: db-password
key: passwordKCC controller order applies: SQLInstance trước SQLDatabase trước SQLUser. Đồng thời, nếu try delete SQLInstance nhưng SQLDatabase vẫn exist (tham chiếu), delete sẽ fail.
Config Controller + Config Sync = Meta-IaC
Config Controller + Config Sync tạo nên meta-IaC pattern: dùng Git → Config Sync → Config Connector để manage GCP infrastructure.
Git Repository: fleet-infrastructure/
├── namespaces/
│ ├── default/
│ │ ├── storage-bucket.yaml # GCS bucket
│ │ ├── database.yaml # Cloud SQL
│ │ └── service-account.yaml # Service Account
│ └── platform/
│ └── monitoring.yaml # Monitoring setup
├── kustomization.yaml
└── RootSync (deployed on Config Controller cluster)Workflow:
- Platform engineer write GCP resource manifests
- Commit đến Git
- Config Sync pull từ Git, apply đến Config Controller
- Config Connector create GCP resources
- Audit trail từ Git commits
Tất cả infrastructure versions tracked trong Git. Rollback = revert commit + config sync pull.
Resource Dependency Resolution
KCC handle transitive dependencies — nếu StorageBucket depend trên Network, Network depend trên Subnetwork, KCC tạo trong order đúng.
Nhưng circular dependencies === error:
# ERROR: A depends on B, B depends on A
apiVersion: ...
kind: ServiceA
spec:
refB:
name: service-b
---
apiVersion: ...
kind: ServiceB
spec:
refA:
name: service-aApply sẽ fail. Designer phải break dependency cycle.
Constraints Và Limitations
Not all GCP services supported: KCC support ~140 resource types, không phải mọi GCP service. Phải check KCC documentation xem resource type supported trước dùng. Unsupported resource phải quản lý qua Terraform hoặc GCP console.
Eventual consistency: Khi update resource spec, change apply asynchronously — không instant. Status field update khi change complete.
GCP API rate limiting: Nếu apply hàng trăm resources cùng lúc, GCP API rate limiting có thể kick in. KCC retry theo exponential backoff, nhưng large-scale resource provisioning cần patient waiting.
Secret management: Sensitive data (database passwords, API keys) phải store trong Kubernetes Secrets. Không làm encryption at rest cho Secrets — phải setup Workload Identity hoặc managed KMS để protect secrets.
Resource recreation on spec change: Một số GCP resource properties immutable — change property yêu cầu delete + recreate. KCC xử lý này, nhưng user phải aware downtime.
Multi-project resources: Config Connector có thể manage resources trong multiple GCP projects (via annotations), nhưng RBAC ở project level. Nếu create resources ở project A và project B, need IAM permissions trên cả hai.
Example: Platform Team Setup
Typical Config Controller usage cho platform team:
Platform Team:
├── Config Controller cluster (GKE Autopilot)
│ └── Config Connector enabled
├── Fleet membership (member của platform fleet)
├── Config Sync RootSync pointing to fleet-infrastructure Git repo
└── All infra defined as CRDs
Namespaces in Config Controller:
├── default/
│ ├── GCP project VPCs
│ ├── Service accounts
│ └── IAM bindings
├── monitoring/
│ ├── Cloud Monitoring alert policies
│ └── Log sinks
└── networking/
├── Cloud Armor policies
└── Private Service ConnectionsWhen new GKE cluster needs provisioning:
- Platform engineer create GKECluster CRD in Config Controller Git repo
- Commit + push
- Config Sync sync lên Config Controller
- Config Connector create GKE cluster resource
- Cluster ready, register vào fleet
- Config Sync distribute workloads từ fleet-workload-config repo
Entire provisioning tracked in Git, reproducible, audited.