Certificate

Kube dns 不會連接到 Kubernetes api 程序

  • June 14, 2018

使用 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 命令是只是輸出“幫助”。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 對話的指針將不勝感激。

提前致謝

我發現問題實際上出在控制器管理器中。我在命令行上指定了 –master= ,它覆蓋了控制器管理器配置文件中的值。刪除它,按預期重新啟動控制器管理器 kube-dns 功能。顯然與 api 伺服器交談時的驗證錯誤有點像紅鯡魚。

引用自:https://serverfault.com/questions/916012