Terraform通过模板批量创建多份同类型Kubernetes清单方法
Terraform批量部署Calico GlobalNetworkPolicy落地方案
实现逻辑说明
- 基于Terraform的
for_each元参数实现批量资源迭代,无需为每个微服务单独编写重复的资源块 - 所有差异化配置(服务名、执行动作、端口)统一收敛到本地变量中维护,后续新增服务只需要在变量里加对应条目即可
- 复用已有的模板渲染、YAML解码框架,仅补全变量传参和循环逻辑,无需重构已有模板
步骤1:定义服务差异化配置映射
在main.tf中新增locals块,统一存储3个微服务的配置参数:
locals { service_network_policies = { frontend = { action = "allow" ports = [8080, 443] } backend = { action = "allow" ports = [4731] } middleware = { action = "allow" ports = [8751, 7542] } } }
注意:如果现有模板里
ports占位符要求传入逗号分隔的字符串而非数值列表,直接把上面ports字段的值改成对应字符串即可,比如frontend的ports写"8080,443",和模板内的字段类型保持一致即可避免类型报错。
步骤2:补全kubernetes_manifest资源块逻辑
把现有框架里的资源块替换为以下内容,通过for_each循环遍历配置,自动给每个服务渲染对应模板:
resource "kubernetes_manifest" "calico_gnp" { for_each = local.service_network_policies manifest = yamldecode( templatefile("${path.module}/networkpolicy.yaml.tpl", { name = each.key action = each.value.action ports = each.value.ports }) ) }
代码里${path.module}代表当前main.tf所在目录,如果模板文件放在其他子目录,调整路径到对应位置即可。
步骤3:模板一致性校验
确认networkpolicy.yaml.tpl内的占位符名称和传入的变量名完全匹配,以下是符合上述传参逻辑的模板参考,可对照现有模板调整:
${yamlencode({ apiVersion = "projectcalico.org/v3" kind = "GlobalNetworkPolicy" metadata = { name = "${name}-gnp" # 可按需修改策略命名规则 } spec = { # 以下通用规则保持原有模板的逻辑即可,只需要确保三个占位符位置正确 selector = "app == '${name}'" ingress = [ { action = action protocol = "TCP" destination = { ports = ports } } ] # 其余egress、order等通用配置按实际需求保留 } })}
步骤4:部署校验
- 执行
terraform init完成Kubernetes provider初始化 - 执行
terraform plan预览生成的资源,确认三个策略的名称、动作、端口配置和预期完全一致 - 确认无误后执行
terraform apply完成批量部署
内容的提问来源于stack exchange,提问作者Eva
相关产品推荐
相关产品推荐

