terraform资源无法正确读取另一个资源的更新值

时间:2020-06-02 15:24:34

标签: terraform terraform-provider-kubernetes

我不知道这是否是terraform问题,或者提供程序存在错误

我正在使用kubernetes_deployment和kubernetes_config_map

在kubernetes_deployment中,我有这个:

template {
  metadata {
    labels = {
      config_version = kubernetes_config_map.myconfig.metadata[0].resource_version

这是发生了什么

  1. 我修改kubernetes_config_map资源正在使用的配置文件 并运行Apply
  2. Terraform看到配置映射资源更改,但是 kubernetes_deployment资源没有显示任何更改
  3. 申请后,我将再次申请
  4. 现在kubernetes_deployment看到更改的值并将其注册为更改

无论有没有明确的depends_on,都会发生这种情况。

为什么会这样? kubernetes_deployment应该会看到该值已更改并将其注册为更改

2 个答案:

答案 0 :(得分:1)

这实际上是提供程序中的有意design decision,因为修改ConfigMap或Secret后,Kubernetes中的部署不会currently重新启动。在Terraform和Kubernetes中,有几种获得所需行为的方法:

  1. 将Secret或ConfigMap挂载为卷,并在应用程序代码(例如viper)或类似weaveworks/watch的sidecar容器中使用热重载机制。
  2. 运行一个控制器,以确保部署使用最新的配置,例如stakater/reloaderpusher/wave
  3. 在Deployment或Daemonset中添加注释,它是config_map和secret中数据的哈希值。这是一个示例:
    annotations = {
        config_change = sha1(jsonencode(merge(
            kubernetes_config_map.test_config.data,
            kubernetes_secret.test_secret.data
        )))
    }

#3的缺点是您必须为使用特定configmap / secret的每个部署复制此代码。它还会在差异中产生一些噪音,对于没有进行此设置的更改配置的人来说可能不是直接直观的。

答案 1 :(得分:0)

我没有注意发生的事情

认为这是kubernetes_config_map资源中的错误

修改配置映射数据时,kubernetes_config_map资源仅显示“ data”属性的变化,这是导致我的问题的错误行为。

如果修改了数据,则resource_version必须且将始终更改,但是资源不会记录此更改。由于存在这种依赖资源,因此查看该属性不会看到任何更改。

太糟糕了,因为那是实现这一目标的真正清晰的方法。

幸运的是,在修复该错误之前,我可以使用data属性的哈希值:

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