Kube dns 无法连接到 Kubernetes api 进程

Kube dns 无法连接到 Kubernetes api 进程

使用 gcr.io/google_containers/k8s-dns-kube-dns-amd64:1.14.8 容器运行 kubernetes v1.10.0 amd kube-dns

当 kube-dns 容器启动时,它会在日志中显示以下内容:

I0610 06:47:06.051414       1 round_trippers.go:398] curl -k -v -XGET  -H "User-Agent: kube-dns/1.14.10 (linux/amd64)" -H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6Ikp... rest of barer token" -H "Accept: application/vnd.kubernetes.protobuf, */*" https://172.17.0.1:443/api/v1/services?resourceVersion=0
`E0610 06:47:05.058513       1 reflector.go:201] k8s.io/dns/pkg/dns/dns.go:189: Failed to list *v1.Endpoints: Get https://172.17.0.1:443/api/v1/endpoints?resourceVersion=0: x509: certificate signed by unknown authority (possibly because of "crypto/rsa: verification error" while trying to verify candidate authority certificate "10.16.23.40")`

10.16.23.40 是我主服务器的“真实”地址,172.17.0.1 是主服务器的服务地址。

我在 apiserver 上有一个自签名证书,如果使用 curl(从任何命令行)访问而不使用 -k,则可以理解它会抛出常见的验证错误。然而,kube-dns 的输出似乎暗示使用了 -k,尽管我找不到 curl 实际上存在于容器中的证据,这让我相信二进制 curl 实际上没有被调用,而 curl 命令只是被输出到“help”。round_trippers.go 中 toCurl 的存在似乎支持了这一理论。

查看输出,是的,该证书是自签名的,因此“由未知机构签名”有一定意义,但如果它使用 -k(或代码中的等效项)进行调用,那么这应该不是问题。

以下是证书中的一些相关内容:

Subject: C=UK, ST=Blah, L=Blah, O=system:nodes, OU=Blah, CN=10.16.23.40

X509v3 Subject Alternative Name: 
                DNS:kubernetes, DNS:kubernetes.default, DNS:kubernetes.default.svc, DNS:kubernetes.default.svc.cluster, DNS:kubernetes.default.svc.cluster.local, DNS:cluster.local, DNS:k8s.blah.net, IP Address:10.16.23.40, IP Address:172.17.0.1

当然,需要访问 apiserver 的所有其他内容(例如 kubectl)都可以顺利执行,并且不会出现任何类型的验证错误。

任何关于如何让 kube-dns 与 apiserver 通信的指点都将非常感激。

提前致谢

答案1

我发现问题实际上出在控制器管理器上。我在命令行上指定了 --master=,它覆盖了控制器管理器配置文件中的值。删除它后,重新启动控制器管理器 kube-dns 功能,并按预期运行。在与 api 服务器通信时出现的验证错误似乎有点误导。

相关内容