Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kubernetes 使用terraform部署应用程序不需要';我找不到我的服务帐户密码_Kubernetes_Terraform_Google Kubernetes Engine - Fatal编程技术网

Kubernetes 使用terraform部署应用程序不需要';我找不到我的服务帐户密码

Kubernetes 使用terraform部署应用程序不需要';我找不到我的服务帐户密码,kubernetes,terraform,google-kubernetes-engine,Kubernetes,Terraform,Google Kubernetes Engine,在terraform部署的应用程序中使用kubernates秘密实际上是可能的吗。我看到一些奇怪的行为 我用适当的节点池、配置映射和秘密定义了一个集群。机密包含服务帐户密钥json数据。 然后,我可以使用kubectl apply-f myapp deploy.yaml来部署我的应用程序,它运行良好。这告诉我集群是好的,包括秘密和配置。 但是,当我尝试使用terraform部署时,我在服务帐户获取中遇到了一个错误: 2019-07-19 06:20:45.497 INFO [myapp,,,]

在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"
...
...
          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"
          }
        }
...
这个yaml基本上可以正常工作。 现在,我的tf文件中的等效项如下所示:

...
          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"
...
...
          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/servicecomport/token
中查找服务帐户令牌,而不是我告诉它的位置。但只有在地形部署时。我正在部署相同的映像,并使用相同的configmap部署到相同的集群中。我的tf有点问题。我已经尝试从yaml部署导入,但是我看不到任何重要的内容

FWIW这是一个在GKE上运行的Spring引导应用程序

希望有人知道答案

谢谢你的帮助。 更多信息:我打开了io.fabric8.kubernetes的调试,并重新运行了两个场景,即terraform和yaml文件。以下是相关的日志片段:

地形:

2019-07-23 23:03:39.189 DEBUG [snakecharmer,,,] 1 --- [           main] io.fabric8.kubernetes.client.Config      : Trying to configure client from Kubernetes config...
2019-07-23 23:03:39.268 DEBUG [snakecharmer,,,] 1 --- [           main] io.fabric8.kubernetes.client.Config      : Did not find Kubernetes config at: [/root/.kube/config]. Ignoring.
2019-07-23 23:03:39.274 DEBUG [snakecharmer,,,] 1 --- [           main] io.fabric8.kubernetes.client.Config      : Trying to configure client from service account...
2019-07-23 23:03:39.274 DEBUG [snakecharmer,,,] 1 --- [           main] io.fabric8.kubernetes.client.Config      : Found service account host and port: 10.44.0.1:443
2019-07-23 23:03:39.282 DEBUG [snakecharmer,,,] 1 --- [           main] io.fabric8.kubernetes.client.Config      : Did not find service account ca cert at: [/var/run/secrets/kubernetes.io/serviceaccount/ca.crt].
2019-07-23 23:03:39.285  WARN [snakecharmer,,,] 1 --- [           main] io.fabric8.kubernetes.client.Config      : Error reading service account token from: [/var/run/secrets/kubernetes.io/serviceaccount/token]. Ignoring.
2019-07-23 23:03:39.291 DEBUG [snakecharmer,,,] 1 --- [           main] io.fabric8.kubernetes.client.Config      : Trying to configure client namespace from Kubernetes service account namespace path...
2019-07-23 23:03:39.295 DEBUG [snakecharmer,,,] 1 --- [           main] io.fabric8.kubernetes.client.Config      : Did not find service account namespace at: [/var/run/secrets/kubernetes.io/serviceaccount/namespace]. Ignoring.
亚马尔:


看起来yaml部署在
/var/run/secrets/kubernetes.io/servicecomport/ca.crt
等处找到了它需要的东西,而地形部署则没有。就好像在**terraform**

中缺少一个幻影卷挂载一样,我找到了修复程序。terraformdeploy添加了一个
automount\u service\u account\u token=false
,但是yaml的默认值是
true
,这会产生很大的不同

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

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

设置
automount\u service\u account\u token=true
是一个修复程序,它可以正常运行。

我找到了修复程序。terraformdeploy添加了一个
automount\u service\u account\u token=false
,但是yaml的默认值是
true
,这会产生很大的不同

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

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

设置
automount\u service\u account\u token=true
是一个解决方案,它可以很好地解决这个问题。

非常感谢,我在这个问题上浪费了大约2天的时间。不客气。我浪费了差不多同样的时间:)非常感谢你,我在这个问题上浪费了大约两天。不客气。我也浪费了差不多:)