Terraform资源未正确读取其他资源的更新值

Terraform资源未正确读取其他资源的更新值,terraform,terraform-provider-kubernetes,Terraform,Terraform Provider Kubernetes,我不知道这是地形问题还是提供商有bug 我正在使用kubernetes_部署和kubernetes_配置图 在kubernetes_部署中,我有: template { metadata { labels = { config_version = kubernetes_config_map.myconfig.metadata[0].resource_version 情况就是这样: 我修改kubernetes\u config\u映射资源正在使用的配置文件 然后运行应用程

我不知道这是地形问题还是提供商有bug

我正在使用kubernetes_部署和kubernetes_配置图

在kubernetes_部署中,我有:

template {
  metadata {
    labels = {
      config_version = kubernetes_config_map.myconfig.metadata[0].resource_version
情况就是这样:

我修改kubernetes\u config\u映射资源正在使用的配置文件 然后运行应用程序 Terraform看到配置映射资源更改,但 kubernetes_部署资源未显示任何更改 申请后,我会再次运行申请 现在kubernetes_部署会看到更改的值并将其注册为更改 这取决于是否有显式表达式


为什么会这样?kubernetes_部署应该看到值已更改,并将其注册为更改。

我没有注意发生了什么

我认为这是kubernetes_config_映射资源中的一个bug

修改配置映射数据时,kubernetes_config_映射资源仅显示数据属性中的更改,这是导致我的问题的错误行为

如果数据被修改,则资源的版本必须并且将始终更改,但资源不会注册此更改。因此,查看该属性的从属资源看不到任何更改

太糟糕了,因为这将是一个非常明确的方法

幸运的是,在修复该错误之前,我可以使用数据属性的散列:

template {
  metadata {
    labels = {
      config_hash = md5(kubernetes_config_map.myconfig.data)

这实际上是提供者有意为之,因为在修改ConfigMap或Secret时,Kubernetes中的部署不会重新启动。在Terraform和Kubernetes中,有几种方法可以获得所需的行为:

将Secret或ConfigMap装载为卷,并在应用程序代码中使用热重新加载机制,例如,或类似的sidecar容器。 运行确保部署使用最新配置的控制器,如或。 向部署或守护程序添加注释,该注释是配置映射和密码中数据的散列。以下是一个例子:
3的缺点是,对于使用特定configmap/secret的每个部署,都必须复制此代码。它还会在差异中产生一些噪音,对于未设置此设置的进行配置更改的人来说,这些噪音可能不是直观的。

这确实似乎是提供程序中缺少的行为。如您所说,如果数据的更改会导致resource_version发生更改,那么原则上,在这种情况下,提供者可以将resource_version参数标记为在计划阶段应用后已知,这将获得您期望的行为。也许您可以在提供者的存储库中报告这一点,看看是否有可能实现该行为。
    annotations = {
        config_change = sha1(jsonencode(merge(
            kubernetes_config_map.test_config.data,
            kubernetes_secret.test_secret.data
        )))
    }