You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 09:24:34