缺少 Kubernetes pod 机密 /var/run/secrets
Kubernetes pod secrets /var/run/secrets missing
长话短说:
通过 terraform 创建的 Kubernetes pods 没有 /var/run/secrets
文件夹,但是根据 hello-minikube
教程创建的 pod 有 - 为什么,我该如何修复它?
动机:我需要 traefik 才能与 k8s 集群通信。
详情
我已经设置了一个带有 minikube 的本地 Kubernetes 集群,并设置了 terraform 以使用该集群。
要设置 traefik,您需要创建一个 Ingress
和一个 Deployment
,它们是 not 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 仪表板中正确显示。
但是,入口控制器的 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
进入pods,我发现其中none有一个路径/var/run/secrets
,除了来自 minikube tutorial 的 hello-minikube
pod,仅使用两个 kubectl
命令创建:
$ kubectl run hello-minikube --image=k8s.gcr.io/echoserver:1.4 --port=8080
$ kubectl expose deployment hello-minikube --type=NodePort
与 terraform 问题中的脚本相比,我删除了 kubectl
参数,如 --certificate-authority=${var.cluster_ca_certificate}
,但话又说回来,我在设置 hello-minikube
时也没有提供,并且原始脚本无法按原样工作,因为我无法弄清楚如何从 terraform 中的 ~/.kube/config
访问提供者详细信息。
我试图找出 hello-minikube
是否在做一些奇特的事情,但我找不到它的源代码。
我是否必须执行特定操作才能使令牌可用?根据 traefic issue 611,InCluster-configuration 应该是自动化的,但就目前而言,我被卡住了。
版本
主机系统是Windows10台机器
> 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 个问题,但它们也没有帮助我解决问题。
Why would /var/run/secrets/kubernetes.io/serviceaccount/token be an empty file in a Pod?
- https://github.com/openshift/origin/issues/13865
首先,感谢您提出 令人惊叹的 问题;我会用这个问题作为其他人应该如何提问的模板!
你能检查一下 PodSpec
中的 automountServiceAccountToken
字段,看看它是否是 true
吗?
我知道的唯一其他建设性问题是它的 serviceAccountName
是否指向现有的 S.A。我希望伪造的人会轰炸部署,但不确定在那种情况下会发生什么
长话短说:
通过 terraform 创建的 Kubernetes pods 没有 /var/run/secrets
文件夹,但是根据 hello-minikube
教程创建的 pod 有 - 为什么,我该如何修复它?
动机:我需要 traefik 才能与 k8s 集群通信。
详情
我已经设置了一个带有 minikube 的本地 Kubernetes 集群,并设置了 terraform 以使用该集群。
要设置 traefik,您需要创建一个 Ingress
和一个 Deployment
,它们是 not 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 仪表板中正确显示。
但是,入口控制器的 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
进入pods,我发现其中none有一个路径/var/run/secrets
,除了来自 minikube tutorial 的 hello-minikube
pod,仅使用两个 kubectl
命令创建:
$ kubectl run hello-minikube --image=k8s.gcr.io/echoserver:1.4 --port=8080
$ kubectl expose deployment hello-minikube --type=NodePort
与 terraform 问题中的脚本相比,我删除了 kubectl
参数,如 --certificate-authority=${var.cluster_ca_certificate}
,但话又说回来,我在设置 hello-minikube
时也没有提供,并且原始脚本无法按原样工作,因为我无法弄清楚如何从 terraform 中的 ~/.kube/config
访问提供者详细信息。
我试图找出 hello-minikube
是否在做一些奇特的事情,但我找不到它的源代码。
我是否必须执行特定操作才能使令牌可用?根据 traefic issue 611,InCluster-configuration 应该是自动化的,但就目前而言,我被卡住了。
版本
主机系统是Windows10台机器
> 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 个问题,但它们也没有帮助我解决问题。
Why would /var/run/secrets/kubernetes.io/serviceaccount/token be an empty file in a Pod?
- https://github.com/openshift/origin/issues/13865
首先,感谢您提出 令人惊叹的 问题;我会用这个问题作为其他人应该如何提问的模板!
你能检查一下 PodSpec
中的 automountServiceAccountToken
字段,看看它是否是 true
吗?
我知道的唯一其他建设性问题是它的 serviceAccountName
是否指向现有的 S.A。我希望伪造的人会轰炸部署,但不确定在那种情况下会发生什么