處理一次k8s、calico無法分配podIP的心路歷程

2020-10-13 宜信技術學院


又一次偷偷化解了可能發生的重大事故。不想看過程的可以直接跳到末尾看處理方案。

一個網絡錯誤


某天,上kplcloud構建一個測試應用,構建完成之後發現新pod一直啟動失敗,並且拋出了以下錯誤信息:

Failed create pod sandbox: rpc error: code = Unknown desc = NetworkPlugin cni failed to set up pod "xxxxxx-fc4cb949f-gpkm2_xxxxxxx" network: netplugin failed but error parsing its diagnostic message "": unexpected end of JSON input

會k8s的運維同學不在,突然出問題了怎麼辦?

試著開始解決問題。

一、有沒有可能是鏡像拉取失敗,開始找問題:

  1. 登錄集群所有伺服器查看空間是否佔滿(然而並沒有佔滿)
  2. 查詢集群所有伺服器網絡情況(也沒有問題)
  3. 再啟一個pod試試?(起不來)

這就尷尬了......,有沒有可能是calico的問題?

二、查看伺服器報錯信息

嘗試以下命令看伺服器的報錯信息:

$ journalctl -exf

確實有一些錯誤信息:

這個錯誤太廣泛了,繼續嘗試從其他地方找找問題。

此時已經開始在思考如何跑路的問題了...

要不嘗試重啟能否解決?

風險太大,不能冒險。雖然很多時候重啟能解決大部分問題,但重啟docker、k8s在這種情況下不是最佳選擇。

繼續搜刮日誌,猜測是無法分配IP的問題,那目標轉向calico

從calico-node上面找問題

查詢ip池是否用完。

使用calicoamd命令查詢calico是否正常正常運行

$ calicoctl get ippools -o wideCIDR NAT IPIP172.20.0.0/16 true false$ calicoctl node status

似乎是沒啥問題。

開始場外求助......

無果

既然calico-node都運行正常,應該不會是calico-etcd的問題吧。

試試calico-etcd

本著有疑問就查證試試的態度,下面開始對calico-etcd進行一頓騷操作。

為了減少代碼量方便閱讀,以下etcdctl所需要加的證書及endpoints,就不一一添加了,大家參考一下就好:

ETCDCTL_API=3 etcdctl --cacert=/etc/etcd/ssl/ca.pem \--cert=/etc/etcd/ssl/etcd.pem \--key=/etc/etcd/ssl/etcd-key.pem \--endpoints=http://10.xx.xx.1:2379,http://10.xx.xx.2:2379,http://10.xx.xx.3:2379

calico並沒有問題,試試calico 所使用的 ETCD是否正常,進入calico-etcd集群:

$ ETCDCTL_API=3 etcdctl member listbde98346d77cfa1: name=node-1 peerURLs=http://10.xx.xx.1:2380 clientURLs=http://10.xx.xx.1:2379 isLeader=true299fcfbf514069ed: name=node-2 peerURLs=http://10.xx.xx.2:2380 clientURLs=http://10.xx.xx.2:2379 isLeader=false954e5cdb2d25c491: name=node-3 peerURLs=http://10.xx.xx.3:2380 clientURLs=http://10.xx.xx.3:2379 isLeader=false

似乎集群也運行正常,get數據也正常。

一切看起來都感覺是多麼的正常,似乎沒有什麼毛病。

算了,算了,還是先寫會兒簡歷吧,換換腦子。

那嘗試向ETCD寫入一條數據試試?

$ ETCDCTL_API=3 etcdctl put /hello worldError: etcdserver: mvcc: database space exceeded

✨報了一個錯:

Error: etcdserver: mvcc: database space exceeded???

似乎是找到原因了,既然定位到問題所在,那接下來就好辦了。(不用跑路了(⁎⁍̴̛ᴗ⁍̴̛⁎))把簡歷先放一放。

感謝google,我從etcd官網找到了一些線索及解決方案,後面我貼上官網介紹,先解決問題:

使用etcdctl endpoint status查詢etcd各個節點的使用狀態:

$ ETCDCTL_API=3 etcdctl endpoint statushttp://10.xx.xx.1:2379, 299fcfbf514069ed, 3.2.18, 2.1 GB, false, 7, 8701663http://10.xx.xx.2:2379, bde98346d77cfa1, 3.2.18, 2.1 GB, true, 7, 8701683http://10.xx.xx.3:2379, 954e5cdb2d25c491, 3.2.18, 2.1 GB, false, 7, 8701687

上面可以看到集群空間已經使用了2.1GB了,這個值需要留意一下。

查詢etcd是否有告警信息使用命令etcdctl alarm list:

$ ETCDCTL_API=3 etcdctl alarm listmemberID:2999344297460918765 alarm:NOSPACE

顯示了一個alerm:NOSPACE,這個表示沒空間了,那是沒什麼空間呢?磁碟還是內存?先查詢一下。

似乎磁碟、內存空間都足夠的。從官網的信息了解到應該是etcd配額的問題,Etcd v3 的默認的 backend quota 2GB,也就是說etcd默認最大的配額是2GB,如果超過了則無法再寫入數據,要麼把舊數據刪除,要麼把數據壓縮了。

參考官方的解決方案

ETCD官網參考:https://etcd.io/docs/v3.2.17/op-guide/maintenance/

  1. 獲取etcd的舊版本號$ ETCDCTL_API=3 etcdctl endpoint status --write-out="json" | egrep -o '"revision":[0-9]*' | egrep -o '[0-9].*' 5395771 5395771 5395771
  2. 壓縮舊版本$ ETCDCTL_API=3 etcdctl compact 5395771 compacted revision 5395771
  3. 整理碎片$ ETCDCTL_API=3 etcdctl defrag Finished defragmenting etcd member[http://10.xx.xx.1:2379] Finished defragmenting etcd member[http://10.xx.xx.2:2379] Finished defragmenting etcd member[http://10.xx.xx.3:2379]
  4. 關閉告警$ ETCDCTL_API=3 etcdctl alarm disarm memberID:2999344297460918765 alarm:NOSPACE $ ETCDCTL_API=3 etcdctl alarm list
  5. 測試數據是否可寫入$ ETCDCTL_API=3 etcdctl put /hello world OK $ ETCDCTL_API=3 etcdctl get /hello OK

回到k8s這邊,刪除那個失敗的pod,並查看是否可正常分配ip。

一切正確,完美。

為了避免後續再出現類似問題,需要設置自動壓縮,啟動自動壓縮功能需要在etcd啟動參考上加上xxxxx=1

https://skyao.gitbooks.io/learning-etcd3/content/documentation/op-guide/maintenance.html

etcd默認不會自動 compact,需要設置啟動參數,或者通過命令進行compact,如果變更頻繁建議設置,否則會導致空間和內存的浪費以及錯誤。Etcd v3 的默認的 backend quota 2GB,如果不 compact,boltdb 文件大小超過這個限制後,就會報錯:」Error: etcdserver: mvcc: database space exceeded」,導致數據無法寫入。

產生這麼多垃圾數據的原因就是因為頻繁的調度,我們集群有大量CronJob在執行,並且執行的非常活躍,每次產生新的Pod都會被分配到ip。有可能是因為pod時間太短或沒有及時註銷而導致calico-etcd產生了大量垃圾數據。

尾巴


因calico-etcd集群的的使用配額滿了,在創建pod時calico所分配的IP無法寫入到etcd裡,從而導致pod創建失敗也就無法註冊到CoreDNS了。

為了不踩坑,監控是非常重要的,我們有etcd集群的監控,卻忽略了etcd配額的監控,幸運的是當時並沒有應用重啟動或升級,沒有造成損失。

最後的建議就是,沒事上去點點,說不定會有您意想不到的驚喜(驚嚇)。


作者:宜信技術學院王聰

相關焦點

  • 《蹲坑學K8S》之19-4:部署Calico網絡
    對於控制平面,它每個節點上會運行兩個主要的程序,一個是Felix,它會監聽ECTD中心的存儲,從它獲取事件,比如說用戶在這臺機器上加了一個IP,或者是分配了一個容器等。接著會在這臺機器上創建出一個容器,並將其網卡、IP、MAC都設置好,然後在內核的路由表裡面寫一條,註明這個IP應該到這張網卡。
  • 《蹲坑學K8S》之19-5:二進位部署Calico網絡
    二進位部署kubernetes完畢後,查看群集狀態為NotReady,現在開始二進位部署calico/manifests/calico-etcd.yaml 2、下載鏡像[root@k8s-master ~] docker pull calico/cni:v3.14.0[root@k8s-master ~] docker pull calico/node:v3.14.0[root@k8s-master ~] cat /usr
  • k8s集群構建:官方推薦之KubeAdm安裝
    前面文章介紹了rancher安裝k8s集群方式,詳情參見()。本文將介紹官方推薦方式:kubeAdm安裝k8s集群。集群機器- 192.168.0.114 : master01節點。注意master節點CPU至少分配2核。
  • 容器編排系統k8s之Service資源
    Service資源在k8s上主要用來解決pod訪問問題;我們知道在k8s上pod由於各種原因重建,對於重建後的podip地址和名稱都是變化的,這樣一來使得我們訪問pod就變得有些不便;為了解決pod訪問能有一個固定的端點,在k8s上就是用service來解決的;簡單來講,service對象就是工作在節點上的一組iptables或ipvs規則,用於將到達service對象ip
  • 免翻牆安裝k8s 1.15.1
    imagesdocker pull calico/node:v3.8.2 docker pull calico/cni:v3.8.2docker pull calico/typha:v3.8.26.2 修改images的tagdocker tag calico/node:v3.8.2 quay.io/calico/node:v3.8.2docker
  • 乾貨|帶您了解k8s
    一、Docker編排工具Docker的第一類編排工具:1)docker compose(docker原生):只能對一個主機上的容器進行編排,無法編排多個主機上的容器;2)docker swarm(docker原生):可以對多個主機上的容器進行編排。
  • 使用kubeadm的方式搭建K8S高可用集群
    為例hostnamectl set-hostname k8s-master01(1)、配置主機hosts映射10.1.10.100 k8s-master0110.1.10.101 k8s-master0210.1.10.102 k8s-master0310.1.10.103&
  • Rancher Calico BGP 對接 F5
    但是,在下一次升級 K8S 集群的時候可能會導致網絡驅動自定義配置丟失。如果對網絡組件有特殊配置,建議在通過 Rancher UI 創建集群的時候,編輯集群 YAML文件或者 RKE 配置文件中設置網絡驅動為 none。以此來關閉集群原有網絡驅動部署功能,在集群創建好之後通過手動部署網絡驅動,部署 YAML文件見附件。
  • 教你一次性成功安裝K8S集群(基於一主兩從模式)
    作者個人研發的在高並發場景下,提供的簡單、穩定、可擴展的延遲消息隊列框架,具有精準的定時任務和延遲隊列處理功能。自開源半年多以來,已成功為十幾家中小型企業提供了精準定時調度方案,經受住了生產環境的考驗。
  • 記一次Gitlab-CI集成K8S實錄
    docker、Kubernetes、Harbor、Prometheus等集群環境不是本文關注的重點,這裡只是記錄Gitlab-CI集成K8S的試驗,依賴現成的K8S集群環境,但曾經被還原過一次,導致一些配置丟失。
  • 男人的洗澡心路歷程
    今天刷某某蝦小視頻,看到一個外國小姐姐的洗頭心路歷程,覺得有點意思,不如和大家分享一下中國直男們的洗澡心路歷程吧。首先來說,男人們不愛洗澡,幾乎是一種標杆。比如那一條內褲穿兩個禮拜的「傳說」,之所以在傳說上打引號,那是因為半個月算什麼,一條內褲穿一個學期的室友每個學校都會有。
  • K8S的CNI插件對比:flannel vs. calico
    我們知道在單個節點上的的容器之間通信是通過內部的容器網絡進行通信,比如docker通過docker0網橋連接各容器子網,k8s作為一種分布式容器編排框架,那容器之間是怎麼完成通信的呢?k8s 是一個分布式的容器編排框架,k8s 本身沒有對容器之間的通信網絡進行實現,而是通過 CNI 定義了容器網絡的接口的形式,讓其他組件實現CNI來實現容器間的網絡通信,那麼CNI主要解決什麼問題呢?第一,如何保證每個Pod擁有一個集群內唯一的IP位址?
  • 一個女人由愛到不愛的心路歷程
    一個女人由愛到不愛的心路歷程,其實並不遙遠,有時候只是一瞬間一剎那,只是經歷了一件很簡單的事情,就讓一個女人從愛到不愛。這似乎就是所謂的「壓死駱駝的最後一根稻草。」一個女人從愛到不愛,或許只是一瞬間的事情,但在這之前必然是經過了漫長的積累,和無限的失望,才會讓她霎時心如死灰。
  • papi醬回來了 以rapper風格講述產假期間一個新手媽媽的心路歷程
    papi醬回來了 以rapper風格講述產假期間一個新手媽媽的心路歷程時間:2020-09-08 11:55   來源:今日頭條   責任編輯:莫小煙 川北在線核心提示:原標題:papi醬回來了 以rapper風格講述產假期間一個新手媽媽的心路歷程 papi醬(原名姜逸磊)在個人社交平臺發布了產後首次營業視頻papi醬的周一放送
  • 《西遊記》最高境界:一個人覺悟的心路歷程,磨練心智,堅守信念
    西遊記主要講一個人覺悟的心路歷程。一個人的心路有多遠?十萬八千裡!就是孫悟空一個跟頭的功夫,就是一個人的一念之差。一念是佛,一念是魔;一念是菩薩,一念是妖精;一念向善,一念向惡。一念就是十萬八千裡,結果相差甚遠。今天修什麼行?
  • 從容走自己的路 MKC車主王憶聊心路歷程
    第1/2頁:網通社2017年7月12日報導 從容走自己的路 MKC車主王憶聊心路歷程
  • 路亞人拒絕套路講述心路歷程
    路亞人的心路歷程,希望對小白菜鳥有所感悟幫助!拒絕套路! 言歸正傳,訴說心路歷程。我是山東的釣友,起初我是臺釣人士,後來忘記了具體時間了解到了路亞,在網上大量搜索相關介紹還有視頻,害人最深的應該就是那些視頻吧,看的血脈膨脹,激情澎湃,刺激,爽,就這個feel 倍兒爽 ,倍兒爽,爽爽爽爽!眼睛爽了。
  • 存憑留史 薪火相傳 ---一位基層派出所檔案管理員的心路歷程
    存憑留史 薪火相傳 ---一位基層派出所檔案管理員的心路歷程 2020-10-30 16:36 來源:澎湃新聞·澎湃號·政務
  • 自媒體創作者的心路歷程,不負當下,未來可期!
    分享自己的歷程吧:大學土木工程系畢業,從事建築行業近20年。雖然收入逐年提高,但是未來的生活質量(包含家庭幸福感、收入、未來生活質量)不是自己想要的。所以毅然決然的辭去了自己的工作。第四個項目做一個優質自媒體創作者,開啟自己的奮鬥歷程!展望未來:幼教行業看好,兩年內可以盈利。自媒體創作信心滿滿,未來兩年+V沒有問題,粉絲破百萬是目標。學習、奮鬥、機遇:自媒體可以讓人加快成長,眼界開闊,認識更多的朋友,及時得到更多的信息,機遇會隨時而來。
  • 奧特曼:託雷基亞黑化的心路歷程 圓古這次說得很明白了
    因此光明和黑暗是沒有界限的,既然站在光明的一邊無法獲得強大的力量,為何不墮入黑暗。託雷基亞想清楚了這些,因此就出現了後面吸收邪神的力量,獲得了強大的力量,後半生就是為了證明自己的這個觀點,與光之國奧特曼作對,讓光之國的奧特曼知道,光明是會輕易墮入黑暗的,因此不存在光明與黑暗,也沒有絕對的正義和邪惡。在銀格2中,塔爾塔羅斯阻止了託雷基亞後續去吸收邪神,直接把他帶走了。