Kubernetes pod secret /var/run/secrets 缺失

标签 kubernetes terraform minikube traefik

TL;博士:

通过 terraform 创建的 Kubernetes pod 没有 /var/run/secrets文件夹,而是根据 hello-minikube 创建的 pod教程可以 - 为什么会这样,我该如何解决?

动机:我需要 traefik 才能与 k8s 集群通信。

细节

我已经建立了一个带有 minikube 的本地 Kubernetes 集群,并设置了 terraform 以使用该集群。

要设置 traefik,您需要创建一个 IngressDeploymentnot yet supported by terraform .基于该问题中发布的解决方法,我使用一个更简单的模块通过 terraform 执行 yaml 文件:

# A tf-module that can create Kubernetes resources from YAML file descriptions.
variable "name" {}
variable "file_name" { }
resource "null_resource" "kubernetes_resource" {
  triggers {
    configuration = "${var.file_name}"
  }
  provisioner "local-exec" {
    command = "kubectl apply -f ${var.file_name}"
  }
}

以这种方式创建的资源在 k8s 仪表板中正确显示。

但是,入口 Controller 的 pod 日志:
time="2017-12-30T13:49:10Z" 
level=error 
msg="Error starting provider *kubernetes.Provider: failed to create in-cluster
    configuration: open /var/run/secrets/kubernetes.io/serviceaccount/token:
    no such file or directory" 

(为可读性添加了换行符)
/bin/bash进入 pod ,我意识到没有一个有路径/var/run/secrets , hello-minikube 除外来自 minikube tutorial 的 pods ,它是由两个 kubectl 创建的命令:
$ kubectl run hello-minikube --image=k8s.gcr.io/echoserver:1.4 --port=8080
$ kubectl expose deployment hello-minikube --type=NodePort

与 terraform issue 中的脚本相比,我删除了 kubectl参数如 --certificate-authority=${var.cluster_ca_certificate} ,但话又说回来,我在设置 hello-minikube 时没有提供这个或者,原始脚本不能按原样工作,因为我不知道如何从 ~/.kube/config 访问提供者详细信息在地形中。

我试图找出 hello-minikube正在做一些花哨的事情,但我找不到它的源代码。

我是否必须做一些特定的事情才能使 token 可用?根据traefic issue 611 ,InCluster 配置应该是自动化的,但就目前而言,我被卡住了。

版本

主机系统是 Windows 10 机器
> minikube version
minikube version: v0.24.1

> kubectl version
Client Version: version.Info{Major:"1", Minor:"9", GitVersion:"v1.9.0", GitCommit:"925c127ec6b946659ad0fd596fa959be43f0cc05", GitTreeState:"clean", BuildDate:"2017-12-15T21:07:38Z", GoVersion:"go1.9.2", Compiler:"gc", Platform:"windows/amd64"}
Server Version: version.Info{Major:"1", Minor:"8", GitVersion:"v1.8.0", GitCommit:"0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4", GitTreeState:"clean", BuildDate:"2017-11-29T22:43:34Z", GoVersion:"go1.9.1", Compiler:"gc", Platform:"linux/amd64"}

有关的

有一些相关的问题和 github 问题,但它们也没有帮助我解决问题。
  • How do I access the Kubernetes api from within a pod container?
  • Why would /var/run/secrets/kubernetes.io/serviceaccount/token be an empty file in a Pod?
  • https://github.com/datawire/telepresence/issues/353
  • https://github.com/openshift/origin/issues/13865
  • 最佳答案

    首先,感谢您提供 惊人的写出问题;我会用这个问题作为其他人应该如何提问的模板!

    你能查一下automountServiceAccountToken PodSpec 中的字段看看是不是true ?

    我知道的唯一其他 build 性问题是它是否 serviceAccountName指向现有的 S.A.;我希望一个虚假的会轰炸部署,但不确定在这种情况下会发生什么

    关于Kubernetes pod secret /var/run/secrets 缺失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48035208/

    相关文章:

    kubernetes - 您如何为 Minikube 上的入口 Controller 指定自定义端口?

    kubernetes - aws-load-balancer-controller 错误 : cannot get the logs from *v1. 入口 : selector for *v1. 入口未实现

    Kubernetes 部署上的 Django : Best practices for DB Migrations

    windows - 在 windows 上为 terraform 预先提交

    amazon-web-services - Terraform:如何在根目录下创建 api 网关 POST 方法?

    kubernetes - Ubuntu 升级到 19.10 后 Minikube 将无法工作

    kubernetes - NodePort 类型服务在集群外部不可访问

    docker - 使 Kubernetes 服务可从外部访问

    python - 如何在 kubeflow 管道中传递环境变量?

    Terraform - 使用 splat 运算符不工作从模块创建输出