بوتاسترپ Flux با Terraform، این بار درست!
خلاصهٔ کاملتر
وقتی میخوای Flux رو روی یه کلاستر Kubernetes نصب کنی، Terraform انتخاب طبیعیه؛ چون همون موقع credentials دم دستته و providerها آمادهان. مشکل اینجاست که وقتی Flux آنلاین میشه، همون منابعی که Terraform اعمال کرده الان Flux هم میخواد reconcileشون کنه — یعنی دو تا ابزار با هم میجنگن که کدوم صاحب اون منابعه.
این ماژول جدید با یه رویکرد متفاوت این مشکل رو حل میکنه: Terraform فقط مکانیزم بوتاسترپ رو در اختیار داره — یه namespace، چند RBAC موقت، و یه Kubernetes Job که Flux Operator و FluxInstance رو اعمال میکنه. بعدش Flux منابع رو تحویل میگیره و Terraform دیگه بهشون دست نمیزنه. وقتی inputها عوض نشن، terraform plan هیچ تفاوتی نشون نمیده.
یکی دیگه از مزیتهای این ماژول اینه که سیکرتها هیچوقت توی Terraform state ذخیره نمیشن. ماژول فقط یه هش SHA-256 برای تشخیص تغییرات نگه میداره و با server-side apply هر بار drift رو بررسی میکنه — دقیقاً مثل روشی که kustomize-controller داره. میتونی مقادیر رو از Vault، AWS Secrets Manager یا هر جای دیگهای بکشی و توی secrets_yaml ترکیبشون کنی:
module "flux_operator_bootstrap" {
source = "controlplaneio-fluxcd/flux-operator-bootstrap/kubernetes"
revision = 1
gitops_resources = {
instance_yaml = file("${path.root}/../clusters/${var.cluster_name}/flux-system/flux-instance.yaml")
}
managed_resources = {
secrets_yaml = <<-YAML
apiVersion: v1
kind: Secret
metadata:
name: flux-system
stringData:
username: git
password: '${var.git_token}'
YAML
}
}یه مزیت مهم دیگه اینه که این ماژول برای plan کردن نیازی به اتصال به کلاستر نداره. چون configuration کاملاً staticه، میتونه توی همون root moduleای که کلاستر رو میسازه زندگی کنه. یعنی دیگه نیازی به دو مرحلهی جداگانهی apply نیست و بوتاسترپ Flux مستقیماً میتونه با depends_on به ماژول کلاستر وابسته باشه.
نکات کلیدی:
- Terraform فقط بوتاسترپ رو مدیریت میکنه و بعدش Flux مالکیت منابع رو میگیره
- رویکرد «ایجاد فقط اگر وجود نداشته باشه» از تداخل بین Terraform و Flux جلوگیری میکنه
- سیکرتها هرگز وارد Terraform state نمیشن — فقط هش SHA-256 ذخیره میشه
- نیازی به دو مرحلهی apply جداگانه نیست؛ همه چیز در یه root module اجرا میشه
- با OpenTofu هم کاملاً سازگاره




