k8s The connection to the server was refused 問題解決記錄

2021-03-02 YP小站
連結:https://www.jianshu.com/p/6edc9f171df1前言

最近公司的 k8s 集群出現了一個問題:在執行任何 kubectl 命令時都會出現以下錯誤,本文就記錄一下該問題的溯源過程以及解決方式,希望對大家有幫助:

The connection to the server 192.168.100.170:6443 was refused - did you specify the right host or port?

問題溯源

相信很多朋友都遇到過這個問題,6443 是 k8s APIServer 的默認埠,出現訪問被拒絕肯定是 kubelet 有問題或者被防火牆攔截了,這裡先看一下這個埠上的 kubelet 是不是還或者:

$ netstat -pnlt | grep 6443

運行之後什麼都沒有返回,也就是說 APIServer 完全沒有提供服務,那我們就去查看一下 kubelet 的日誌,大家都知道使用 kubeadm 搭建的 k8s集群裡,APIServer 都是在 docker 裡運行的,這裡我們先找到對應的容器,記得加 -a,因為該容器可能已經處於非正常狀態了:

$ docker ps -a | grep apiserver
# 輸出f40d97ee2be6 40a63db91ef8 "kube-apiserver --au…" 2 minutes ago Exited (255) 2 minutes ago k8s_kube-apiserver_kube-apiserver-master1_kube-system_7beef975d93d634ecee05282d3d3a9ac_7184b866fe71e33 registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.1 "/pause" 2 days ago Up 2 days k8s_POD_kube-apiserver-master1_kube-system_7beef975d93d634ecee05282d3d3a9ac_0

這裡能看到兩個容器,可以看到 容器的狀態已經是 Exited 了,注意下面的pause容器,這個只是用來引導 APIServer 的,並不是服務的實際運行容器,所以看不到日誌,所以查看日誌時不要輸錯容器 id 了。接下來查看 APIServer 的日誌:

$ docker logs -f f40d97ee2be6
# 輸出I1230 01:39:42.942786 1 server.go:557] external host was not specified, using 192.168.100.171I1230 01:39:42.942924 1 server.go:146] Version: v1.13.1I1230 01:39:43.325424 1 plugins.go:158] Loaded 8 mutating admission controller(s) successfully in the following order: NamespaceLifecycle,LimitRanger,ServiceAccount,NodeRestriction,Priority,DefaultTolerationSeconds,DefaultStorageClass,MutatingAdmissionWebhook.I1230 01:39:43.325451 1 plugins.go:161] Loaded 6 validating admission controller(s) successfully in the following order: LimitRanger,ServiceAccount,Priority,PersistentVolumeClaimResize,ValidatingAdmissionWebhook,ResourceQuota.I1230 01:39:43.326327 1 plugins.go:158] Loaded 8 mutating admission controller(s) successfully in the following order: NamespaceLifecycle,LimitRanger,ServiceAccount,NodeRestriction,Priority,DefaultTolerationSeconds,DefaultStorageClass,MutatingAdmissionWebhook.I1230 01:39:43.326340 1 plugins.go:161] Loaded 6 validating admission controller(s) successfully in the following order: LimitRanger,ServiceAccount,Priority,PersistentVolumeClaimResize,ValidatingAdmissionWebhook,ResourceQuota.F1230 01:40:03.328865 1 storage_decorator.go:57] Unable to create storage backend: config (&{ /registry [https://127.0.0.1:2379] /etc/kubernetes/pki/apiserver-etcd-client.key /etc/kubernetes/pki/apiserver-etcd-client.crt /etc/kubernetes/pki/etcd/ca.crt true 0xc0004bd440 <nil> 5m0s 1m0s}), err (dial tcp 127.0.0.1:2379: connect: connection refused)

從最後一行可以看到,是 APIServer 在嘗試創建存儲時出現了問題,導致無法正確啟動服務,由於 k8s 是使用 etcd 作為存儲的,所以我們再來查看 etcd 的日誌。

注意,我這裡 etcd 也是運行在 docker 裡的,如果你是直接以 service 的形式運行的話需要使用 systemctl status etcd 來查看日誌,下面是 docker 的 etcd 日誌查看:

# 查看 etcd 容器,注意 etcd 也有對應的 pause 容器$ docker ps -a | grep etcd
# 輸出1b8b522ee4e8 3cab8e1b9802 "etcd --advertise-cl…" 7 minutes ago Exited (2) 6 minutes ago k8s_etcd_etcd-master1_kube-system_1051dec0649f2b816946cb1fea184325_942c9440543462e registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.1 "/pause" 2 days ago Up 2 days k8s_POD_etcd-master1_kube-system_1051dec0649f2b816946cb1fea184325_0

# 查看 etcd 日誌$ docker logs -f 1b8b522ee4e8
# 輸出2019-12-30 01:43:44.075758 I | raft: 92b79bbe6bd2706a is starting a new election at term 1657112019-12-30 01:43:44.075806 I | raft: 92b79bbe6bd2706a became candidate at term 1657122019-12-30 01:43:44.075819 I | raft: 92b79bbe6bd2706a received MsgVoteResp from 92b79bbe6bd2706a at term 1657122019-12-30 01:43:44.075832 I | raft: 92b79bbe6bd2706a [logterm: 82723, index: 84358879] sent MsgVote request to a25634eca298ea33 at term 1657122019-12-30 01:43:44.075844 I | raft: 92b79bbe6bd2706a [logterm: 82723, index: 84358879] sent MsgVote request to 645060e8e879847c at term 1657122019-12-30 01:43:45.075783 I | raft: 92b79bbe6bd2706a is starting a new election at term 1657122019-12-30 01:43:45.075818 I | raft: 92b79bbe6bd2706a became candidate at term 1657132019-12-30 01:43:45.075830 I | raft: 92b79bbe6bd2706a received MsgVoteResp from 92b79bbe6bd2706a at term 1657132019-12-30 01:43:45.075840 I | raft: 92b79bbe6bd2706a [logterm: 82723, index: 84358879] sent MsgVote request to 645060e8e879847c at term 1657132019-12-30 01:43:45.075849 I | raft: 92b79bbe6bd2706a [logterm: 82723, index: 84358879] sent MsgVote request to a25634eca298ea33 at term 1657132019-12-30 01:43:45.928418 E | etcdserver: publish error: etcdserver: request timed out2019-12-30 01:43:46.363974 I | etcdmain: rejected connection from "192.168.100.181:35914" (error "tls: failed to verify client's certificate: x509: certificate has expired or is not yet valid", ServerName "")2019-12-30 01:43:46.364006 I | etcdmain: rejected connection from "192.168.100.181:35912" (error "tls: failed to verify client's certificate: x509: certificate has expired or is not yet valid", ServerName "")2019-12-30 01:43:46.477058 I | etcdmain: rejected connection from "192.168.100.181:35946" (error "tls: failed to verify client's certificate: x509: certificate has expired or is not yet valid", ServerName "")2019-12-30 01:43:46.483326 I | etcdmain: rejected connection from "192.168.100.181:35944" (error "tls: failed to verify client's certificate: x509: certificate has expired or is not yet valid", ServerName "")2019-12-30 01:43:46.575790 I | raft: 92b79bbe6bd2706a is starting a new election at term 1657132019-12-30 01:43:46.575818 I | raft: 92b79bbe6bd2706a became candidate at term 1657142019-12-30 01:43:46.575829 I | raft: 92b79bbe6bd2706a received MsgVoteResp from 92b79bbe6bd2706a at term 1657142019-12-30 01:43:46.575839 I | raft: 92b79bbe6bd2706a [logterm: 82723, index: 84358879] sent MsgVote request to 645060e8e879847c at term 1657142019-12-30 01:43:46.575848 I | raft: 92b79bbe6bd2706a [logterm: 82723, index: 84358879] sent MsgVote request to a25634eca298ea33 at term 1657142019-12-30 01:43:46.595828 I | etcdmain: rejected connection from "192.168.100.181:35962" (error "tls: failed to verify client's certificate: x509: certificate has expired or is not yet valid", ServerName "")2019-12-30 01:43:46.597536 I | etcdmain: rejected connection from "192.168.100.181:35964" (error "tls: failed to verify client's certificate: x509: certificate has expired or is not yet valid", ServerName "")2019-12-30 01:43:46.709028 I | etcdmain: rejected connection from "192.168.100.181:35970" (error "tls: failed to verify client's certificate: x509: certificate has expired or is not yet valid", ServerName "")2019-12-30 01:43:46.714243 I | etcdmain: rejected connection from "192.168.100.181:35972" (error "tls: failed to verify client's certificate: x509: certificate has expired or is not yet valid", ServerName "")2019-12-30 01:43:46.928411 W | rafthttp: health check for peer a25634eca298ea33 could not connect: dial tcp 192.168.100.191:2380: getsockopt: connection refused...

可以看到 etcd 一直在循環輸出上面的錯誤日誌直到超時退出,從裡面可以提取到一條關鍵錯誤,就是 error "tls: failed to verify client's certificate: x509: certificate has expired or is not yet valid。這個錯誤對於經常維護 k8s 集群的朋友可能很熟悉了,又是證書到期了。

這個集群有三臺 master,分別是 171、181和191,可以從錯誤信息前看到是在請求 181 時出現了證書驗證失敗的問題,我們登陸 181 機器來驗證錯誤:

# 進入 k8s 證書目錄$ cd /etc/kubernetes/pki
# 查看證書到期時間$ openssl x509 -in etcd/server.crt -noout -text |grep ' Not '
# 輸出Not Before: Dec 26 08:12:11 2018 GMTNot After : Dec 26 08:12:11 2019 GMT

經過排查,發現 k8s 的相關證書都沒事,但是 etcd 的證書都到期了。關於 k8s 需要的證書可以看這篇文章,接下來我們就來解決問題。

Kubeadm安裝的K8S集群1年證書過期問題的解決思路

問題解決

注意,由於 k8s 版本問題,這一部分的內容可能和你的不太一樣,我所使用的版本如下:

root@master1:~# kubelet --versionKubernetes v1.13.1
root@master1:~# kubeadm versionkubeadm version: &version.Info{Major:"1", Minor:"13", GitVersion:"v1.13.1", GitCommit:"eec55b9ba98609a46fee712359c7b5b365bdd920", GitTreeState:"clean", BuildDate:"2018-12-13T10:36:44Z", GoVersion:"go1.11.2", Compiler:"gc", Platform:"linux/amd64"}

如果版本相差過大的話請進行百度,相關的解決方案還是挺多的,下面解決方案請先配合 -h 使用,注意:以下操作會導致服務停止,請謹慎執行

備份原始文件
$ cd /etc $ cp -r kubernetes kubernetes.bak

重新生成證書

重新生成證書需要集群初始化時的配置文件,我的配置文件kubeadm.yaml如下:

kind: ClusterConfigurationapiVersion: kubeadm.k8s.io/v1beta1controlPlaneEndpoint: "192.168.100.170:6443"apiServer:  certSANS:  - master1  - master2  - master3  - 192.168.100.170  - 192.168.100.171  - 192.168.100.181  - 192.168.100.191

其中 192.168.100.170 是 VIP,171、181、191分別對應master1、master2、master3主機。接下來使用配置文件重新籤發證書,每個管理節點都要執行:

$ kubeadm init phase certs all --config=kubeadm.yaml

重新生成配置文件
$ kubeadm init phase kubeconfig all --config kubeadm.yaml

這個命令也需要每個管理節點都執行一次,被重新生成的配置文件包括下列幾個:

重啟管理節點的 k8s

重啟 etcd,apiserver,controller-manager,scheduler 容器,一般情況下 kubectl 都可以正常使用了,記得kubectl get nodes查看節點的狀態。

重新生成工作節點的配置文件

如果上一步查看的工作節點的狀態還是為 NotReady 的話,就需要重新進行生成,如果你根證書也更換了的話就會導致這個問題,工作節點的證書也會失效,直接備份並移除下面的證書並重啟 kubelet 即可:

$ mv /var/lib/kubelet/pki /var/lib/kubelet/pki.bak$ systemctl daemon-reload && systemctl restart kubelet

如果不行的話就直接把管理節點的/etc/kubernetes/pki/ca.crt複製到對應工作節點的相同目錄下然後再次啟動 kubelet。等待三分鐘左右應該就可以在管理節點上看到該工作節點的狀態變為Ready。

總結

k8s 的證書只有一年的設置確定有點坑,雖然為了讓使用者更新到最新版本的本意是好的。如果你現在 k8s 集群還是正常但是並沒有執行過證書更新操作的話,請及時查看你的證書到期時間,等到證書到期就為時已晚了。

參考Kubeadm安裝的K8S集群1年證書過期問題的解決思路Troubleshooting kubectl Error: The connection to the server x.x.x.x:6443 was refused – did you specify the right host or port?

相關焦點

  • 帶你從零看清 Node 源碼 createServer 和負載均衡整個過程
    this.on('connection', connectionListener); } else if (options == null || typeof options === 'object') { options = { ...options }; if (typeof connectionListener === 'function') { this.on
  • [英文版].NET5 Uses database as configuration central server
    Considering that these subsites have to connect to the database, the configuration information stored in the database, with the database as the configuration center server,is in line with my requirements
  • Linux-C 編程 / 網絡 / 超迷你的 web server
    這是一個很強大的心理暗示:只要擁有這些穩定不變的支撐點,你就有信心和足夠的能力去面對許多生活裡不穩定的東西,並解決掉它們。二、Linux-C 編程 / 超迷你的 web server0. 什麼是 web server?
  • 如何使用 K8s 兩大利器"審計"和"事件"幫你擺脫運維困境?
    概述下面幾個問題,相信廣大 K8s 用戶在日常集群運維中都曾經遇到過:集群中的某個應用被刪除了,誰幹的?Apiserver 的負載突然變高,大量訪問失敗,集群中到底發生了什麼?Kubernetes 審計日誌是 Kube-apiserver 產生的可配置策略的結構化日誌,記錄了對 Apiserver 的訪問事件。審計日誌提供 Metrics 之外的另一種集群觀測維度,通過查看、分析審計日誌,可以追溯對集群狀態的變更;了解集群的運行狀況;排查異常;發現集群潛在的安全、性能風險等等。
  • 手把手教你搭建3款遠程開發環境:Pycharm、Jupyter notebook以及code-server!
    後來有「好事者」覺得不過癮,搞了一個叫code-server的項目——把VScode搬上瀏覽器。沒錯,我們可以把code-server理解為Web服務版的VScode。它和Jupyter類似,可以在瀏覽器中打開和使用,但相比而言,code-server遠程的搭建更加簡單一些:第一步,下載code-server可以在如下地址選擇最新的code-server安裝包(Linux環境)並下載解壓,解壓的文件中除code-server之外可以都刪掉。
  • 高青k8球墨鑄鐵管現貨型號
    高青k8球墨鑄鐵管現貨型號k8球墨鑄鐵管可能會有人說現在鐵鑄管的性能應該不怎麼樣,至少在許多場合中鐵的金屬性能實在太差了,但經過離心機的特殊工藝處理以後,球墨鐵鑄管的性能得到了大大的提高,雖然說看起來還是鐵金屬製造的,但實際上已經具備了鋼一樣。還是需要做好室內外供水設施的防凍工作。
  • ABB機器人OPC server
    可以去以下地址下載opc server安裝包http://developercenter.robotstudio.com/downloads_opcserver4. 下載好安裝5. 打開robotstudio仿真啟動機器人(或者pc連上真實機器人)6.
  • 使用Haproxy輕鬆解決SMTP發信伺服器源IP暴露問題
    有兩種方法,一個是集成第三方郵件代發,技術成本較高,不推薦,需要了解的可以前往張戈博客了解,第二個就是今天技術宅提供的方法,使用Haproxy輕鬆解決SMTP發信伺服器源IP暴露問題!-y install haproxy將/etc/haproxy/haproxy.cfg中的內容清空,並添加以下內容:globalulimit-n 51200defaultslog globalmode tcpoption dontlognulltimeout connect 1000mstimeout client 150000mstimeout server
  • Let's Settle This – 網站幫你解決爭吵問題
    一個新網站正在致力於幫助人們在網上解決問題,重歸於好。Let's Settle This讓你們的爭吵從現實中有效地轉移到網際網路的數字街道上。為了在Netflix上看什麼和你對象吵架了?因為看不慣他們做的事情而和朋友爭吵了?在離婚條款上與你的配偶意見不一致?Just kidding. Well.
  • 聯想伺服器ThinkServer SR588太原售
    以安全、可靠、高效的產品解決方案,提高IT效力,提升企業競爭力,實現企業永續經營。ThinkServer伺服器恪守對品質和綠色的承諾,並以ThinkServer獨有的智節...本文屬於原創文章,如若轉載,請註明來源:聯想伺服器ThinkServer SR588太原售http://server.zol.com.cn/759/7593014.html
  • 華為FusionServer RH2288 V3現貨親民價
    最大CPU數量2顆製程工藝14nm三級緩存20MB總線規格QPI 8GT/s最大內存容量1TB硬碟接口類型SAS標配硬碟容量1.2TB硬碟描述2塊600GB-SAS 12Gb/sFusionServer RH2288 V3(Xeon E5-2620 v4*2/16GB*4/600GB*2)伺服器[參考價格] 價位面議(當天具體價格,請去電詳詢)[銷售商家] 陝西力成(華為授權經銷商) [店面地址] 西安市高新區科技路1號紫薇龍騰3號樓1806室   [聯繫電話] 13319185700  029-68910656[網店連結] http://s.zol.com.cn
  • 伺服器是整個網絡核心,Windows Server 2008如何查看網卡MAC地址
    今天介紹伺服器是整個網絡的核心,Windows server 2008 R2如何查看計算機網卡MAC地址。伺服器是整個網絡的核心,但接入網絡之前必須先對伺服器進行必要的網絡設置,如安裝網卡驅動程序、設置IP位址信息等。