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

使用Terraform部署RabbitMQ集群Secret时遇Provider结果不一致错误

使用Terraform kubernetes_manifest部署Secret时的不一致结果问题

错误信息

╷
│ Error: Provider produced inconsistent result after apply
│ 
│ When applying changes to kubernetes_manifest.default_user_config, provider
│ "provider[\"registry.opentofu.org/hashicorp/kubernetes\"]" produced an
│ unexpected new value: .object.stringData: was
│ cty.MapVal(map[string]cty.Value{"default_user.conf":cty.StringVal("default_user
│ = user\ndefault_pass = password\n")}), but now null.
│ 
│ This is a bug in the provider, which should be reported in the provider's
│ own issue tracker.

对应的资源代码

resource "kubernetes_manifest" "default_user_config" {
  manifest = yamldecode(<<EOF
apiVersion: v1
kind: Secret
metadata:
  name: "default-user-config"
  namespace: ${var.namespace}
type: Opaque
stringData:
  default_user.conf: |
    default_user = user
    default_pass = password
  # host: dmF1bHQtZGVmYXVsdC11c2VyLmRlZmF1bHQuc3Zj
  # username: my-admin
  # password: super-secure-password
  # port: "5672"
  # provider: rabbitmq
  # type: rabbitmq
EOF
  )
}

解决方案

这个问题的核心是Kubernetes API对Secret的处理逻辑:当你提交stringData时,Kubernetes会自动将其编码为base64并存储在data字段中,不会保留stringData。而Terraform的kubernetes_manifest资源在同步集群状态时,只能获取到data字段,导致本地配置的stringData和集群返回的状态不一致,触发报错。

解决方式有两种:

方式一:手动替换为data字段并编码内容

将原代码中的stringData替换为data,并把default_user.conf的内容提前做base64编码:

resource "kubernetes_manifest" "default_user_config" {
  manifest = yamldecode(<<EOF
apiVersion: v1
kind: Secret
metadata:
  name: "default-user-config"
  namespace: ${var.namespace}
type: Opaque
data:
  default_user.conf: "ZGVmYXVsdF91c2VyID0gdXNlcgpkZWZhdWx0X3Bhc3MgPSBwYXNzd29yZAo="
EOF
  )
}

方式二:用Terraform函数动态编码

使用base64encode函数自动处理编码,更灵活且避免手动编码出错:

resource "kubernetes_manifest" "default_user_config" {
  manifest = {
    apiVersion = "v1"
    kind       = "Secret"
    metadata = {
      name      = "default-user-config"
      namespace = var.namespace
    }
    type = "Opaque"
    data = {
      "default_user.conf" = base64encode("default_user = user\ndefault_pass = password\n")
    }
  }
}

两种方式都能让本地配置的字段和集群返回的状态保持一致,解决Provider不一致的错误。

内容的提问来源于stack exchange,提问作者Estifanos Bireda

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 02:09:51