kube-dns 无法打开 /var/run/secrets/kubernetes.io/serviceaccount/token:没有此文件或目录

kube-dns 无法打开 /var/run/secrets/kubernetes.io/serviceaccount/token:没有此文件或目录

我已经成功设置了一个 5 节点集群,2 个主节点,3 个从节点。使用此处的“自行设置”说明: https://kubernetes.io/docs/getting-started-guides/scratch/#preparing-certs

我可以运行 pods np,但 dns 不起作用。根据文档,一种方法是设置集群 DNS 服务:

https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/dns/

一切都很好,虽然我意识到附加组件管理器的工作是启动项目提供的 pod,但为了调试,我一直在手动启动它

kubectl 创建 -f kube-dns.yaml

一切都成功创建,最终部署会“生成”一个 pod,该 pod 又会生成容器等...然而 kube-dns 总是会失败并出现以下错误:

"Failed to create a kubernetes client: open /var/run/secrets/kubernetes.io/serviceaccount/token"

我知道这是 kubernetes 向容器提供的令牌,但我不明白为什么找不到它。

尤其是当所需的秘密似乎存在时:

# kubectl get serviceaccounts -n kube-system
NAME       SECRETS   AGE
default    2         13d
kube-dns   2         29m
bddcbpkbn1:~ # kubectl get secrets -n kube-system
NAME                   TYPE                                  DATA      AGE
default-token-6wnx5    kubernetes.io/service-account-token   2         44m
default-token-94kww    kubernetes.io/service-account-token   2         46m
kube-dns-token-mnbg2   kubernetes.io/service-account-token   2         28m
kube-dns-token-wrs8h   kubernetes.io/service-account-token   2         26m
#

有人能提供一些建议来说明为什么会失败,或者我该如何诊断这个问题吗?

顺便说一句,我已经禁用了活体检测参数,以确保它们不是问题的原因

编辑:关于这一点再多说一点,我可以找到docker inspect失败的容器,因此我已经这样做了并且发现/var/run/secrets/kubernetes.io/serviceaccount/token没有在任何地方提及,这使我相信 kubelet 并没有告诉 docker 挂载该卷,因为图像显然是期望的。

此外,按理说,令牌必须以某种形式存在于相关工作节点上,但似乎并非如此。具体来说,我在/var/lib/kubernetes/kubelet/pods/07ac2f2b-3969-11e8-906e-caef73f3b003/volumes/kubernetes.io~configmap/目录中查看,我可以看到一个kube-dns-config目录,它已安装在容器中,并在相关容器的 docker inspect 输出中提到。

因此,至少从这一点来看,问题出在 Kubernetes(以及潜在的 kubelet)而不是 Docker。

提前致谢

答案1

我发现了问题。

我没有包括

--admission-control=ServiceAccount

在 apiserver 命令行中。

相关内容