用terraform部署应用程序找不到我的服务帐户秘密

时间:2019-07-19 07:00:59

标签: kubernetes terraform google-kubernetes-engine

实际上可以在部署了Terraform的应用程序中使用kubernates秘密。我看到一些奇怪的行为。

我用适当的节点池,配置映射和机密定义一个集群。机密包含服务帐户密钥json数据。 然后,我可以使用kubectl apply -f myapp-deploy.yaml部署我的应用程序,它可以正常工作。这说明群集非常好,包括密钥和配置。 但是,当我尝试使用terraform进行部署时,在获取服务帐户时出现错误:

2019-07-19 06:20:45.497  INFO [myapp,,,] 1 --- [main] b.c.PropertySourceBootstrapConfiguration : Located property source: SecretsPropertySource {name='secrets.myapp.null'} 
2019-07-19 06:20:45.665  WARN [myapp,,,] 1 --- [main] io.fabric8.kubernetes.client.Config      : Error reading service account token from: [/var/run/secrets/kubernetes.io/serviceaccount/token]. Ignoring.
2019-07-19 06:20:45.677  INFO [myapp,,,] 1 --- [main] n.c.m.s.myappApplication          : The following profiles are active: test-dev

中间一行很有趣,它似乎是试图从错误的位置读取服务帐户。

我已经将相关设置从yaml文件移到了tf文件,但是也许我错过了一些东西。 yaml文件如下所示:

...
          env:
          - name: GOOGLE_APPLICATION_CREDENTIALS
            value: "/var/run/secret/cloud.google.com/myapp-sa.json"
          volumeMounts:
            - name: "service-account"
              mountPath: "/var/run/secret/cloud.google.com"
          ports:
            - containerPort: 8080
      volumes:
        - name: "service-account"
          secret:
            secretName: "myapp"
...

这个Yaml基本上可以正常工作。 现在,我的tf文件中的等效内容如下:

...
          env {
            name  = "GOOGLE_APPLICATION_CREDENTIALS"
            value = "/var/run/secret/cloud.google.com/myapp-sa.json"
          }
          volume_mount {
            name       = "myapp-sa"
            mount_path = "/var/run/secret/cloud.google.com"
            sub_path = ""
          }
        }
        volume {
          name = "myapp-sa"
          secret {
            secret_name = "myapp"
          }
        }
...

这给出了以上错误。似乎决定在/var/run/secrets/kubernetes.io/serviceaccount/token中查找服务帐户令牌,而不是我告诉的位置。但仅当由 terraform 部署时。我正在将相同的映像部署到具有相同 configmap 的相同群集中。我的tf某处出了点问题。我尝试从yaml部署导入,但是看不到任何我错过的重要内容。

FWIW,这是在GKE上运行的Spring Boot应用程序。

希望有人知道答案。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我找到了解决方法。 terraform 部署会添加一个automount_service_account_token = false,但是yaml的默认值是true,这一切都与众不同。

该开关位于我的tf文件中kubernetes_deployment的template.spec部分中,现在看起来像以下代码片段:

...
      spec {
        restart_policy = "Always"
        automount_service_account_token = true
        container {
          port {
            container_port = 8080
            protocol       = "TCP"
          }
...

设置automount_service_account_token = true是解决问题的方法,并且可以很好地解决此问题。