0

我不知道这是 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 应该看到该值已更改并将其注册为更改。

4

2 回答 2

1

这实际上是提供者有意的设计决策,因为 Kubernetes 中的部署当前不会在修改 ConfigMap 或 Secret 时重新启动。在 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 的每个部署复制此代码。它还会在 diff 中产生一些噪音,这对于没有设置它的进行配置更改的人来说可能不会立即直观。

于 2020-07-20T23:46:03.350 回答
0

我没有注意正在发生的事情。

认为这是 kubernetes_config_map 资源中的一个错误。

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

如果数据被修改,那么 resource_version 必须并且总是会改变,但是资源不会注册这个改变。由于这个依赖资源查看该属性看不到任何变化。

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

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

template {
  metadata {
    labels = {
      config_hash = md5(kubernetes_config_map.myconfig.data)
于 2020-06-02T15:48:18.403 回答