实际上可以在部署了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应用程序。
希望有人知道答案。
感谢您的帮助。
答案 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
是解决问题的方法,并且可以很好地解决此问题。