記 K8s 集群中 Flannel 遇到的兩個問題

自建的 K8s 集群的坑不少, 尤其是到了 Node 數(shù)量越來越多之后, 問題也逐漸顯露了出來, 博客主要介紹我們使用flannel之后遇到的兩個問題以及解決方案, 問題其實不嚴(yán)重, 只是涉及到了底層的結(jié)構(gòu), 改動時候要小心.
問題 1 flannel 的 OOM 問題
官方給出的配置
下面這張圖是官方的配置, 可以看到, 默認(rèn)的資源設(shè)置僅給定了 50M 內(nèi)存

kubectl?-n?kube-system?describe?ds?kube-flannel-ds-amd64
????Limits:
??????cpu:?????100m
??????memory:??50Mi
????Requests:
??????cpu:?????100m
??????memory:??50Mi
我們遇到的問題
當(dāng)我們的機器數(shù)量超過 100 個以后, flannel 會以 OOM 的形式一直掛掉..
Feb??9?04:52:44??kernel:?[37630249.323630]?Memory?cgroup?out?of?memory:?Kill?process?33838?(flanneld)?score?1653?or?sacrifice?child
通過Prometheus采集到的數(shù)據(jù)也可以看到, 容器的內(nèi)存使用情況很不樂觀:

也沒什么好的解決方案, 只能調(diào)整資源限制了.
問題 2 flannel 指定網(wǎng)卡問題
問題背景
因為我們使用的機器比較混雜, 機器的網(wǎng)卡也各不相同, 在開始搭建集群時就遇到了下面的問題.
>?我們虛擬機中的網(wǎng)卡,?僅有`10`開頭的內(nèi)網(wǎng)地址
1:?lo:??mtu?65536?qdisc?noqueue?state?UNKNOWN?group?default?qlen?1
????link/loopback?00:00:00:00:00:00?brd?00:00:00:00:00:00
????inet?127.0.0.1/8?scope?host?lo
???????valid_lft?forever?preferred_lft?forever
2:?eth0:??mtu?1400?qdisc?pfifo_fast?state?UP?group?default?qlen?1000
????link/ether?52:xx:xx:xx:77:0c?brd?ff:ff:ff:ff:ff:ff
????inet?10.xxx.xxx.xxx/26?brd?10.xxx.xxx.xxx?scope?global?eth0
???????valid_lft?forever?preferred_lft?forever
>?物理機中的網(wǎng)卡,?既有`59`開頭的公網(wǎng)地址,?也有`10`開頭的內(nèi)網(wǎng)地址,?并且網(wǎng)卡名為eth1
1:?lo:??mtu?65536?qdisc?noqueue?state?UNKNOWN?group?default?qlen?1
????link/loopback?00:00:00:00:00:00?brd?00:00:00:00:00:00
????inet?127.0.0.1/8?scope?host?lo
???????valid_lft?forever?preferred_lft?forever
2:?eth0:??mtu?1500?qdisc?mq?state?UP?group?default?qlen?1000
????link/ether?8c:xx:xx:xx:xx:xx?brd?ff:ff:ff:ff:ff:ff
????inet?59.xxx.xxx.xxx/24?brd?59.xxx.xxx.xx?scope?global?eth0
???????valid_lft?forever?preferred_lft?forever
3:?eth1:??mtu?1500?qdisc?mq?state?UP?group?default?qlen?1000
????link/ether?8c:xx:xx:xx:xx:38?brd?ff:ff:ff:ff:ff:ff
????inet?10.xxx.xxx.xxx/24?brd?10.xxx.xxx.xxx?scope?global?eth1
???????valid_lft?forever?preferred_lft?forever
這樣帶來的問題就是 flannel 通信問題, 如果多個網(wǎng)卡, 且啟動時未指定, flannel 會找一個缺省的網(wǎng)卡, 對于虛擬機來講沒有關(guān)系, 但是對于物理機, flannel 會找到 eth0 這個外網(wǎng)網(wǎng)卡, flannel 使用錯誤的網(wǎng)卡發(fā)送數(shù)據(jù), 抓包的數(shù)據(jù)可以看出 flannel 使用了公網(wǎng)的網(wǎng)卡發(fā)送內(nèi)網(wǎng)數(shù)據(jù), 會被交換機丟棄, 具體圖片就不貼了, IP 屬于公司機密.
具體的修改方法是確保 flannel 使用了正確的網(wǎng)卡, 需要在啟動時指定參數(shù)--iface與--iface-regex: 我們的虛擬機數(shù)量少, 物理機數(shù)量多. 除了eth1, 還有bond1這種網(wǎng)卡名, 因此針對虛擬機, 統(tǒng)一將其eth0改名變成eth1, 而后指定了-iface-regex=eth1|bond1這樣的配置, 對于后續(xù)增加物理機更友好.
問題到這里似乎就結(jié)束了, 但是隨著 flannel 經(jīng)常發(fā)生 OOM 重啟, 暴露了我們的設(shè)置問題.
我們發(fā)現(xiàn) flannel OOM 后無法正常重啟
NAME????????????????????????????????????????????????????READY???STATUS?????????????RESTARTS???AGE?????IP???????????????NODE?????????????????????????????????NOMINATED?NODE???READINESS?GATES
kube-flannel-ds-amd64-54c5p?????????????????????????????0/1?????CrashLoopBackOff???1604???????516d????10.xx.xx.xx?xxxxx????????????????????
kube-flannel-ds-amd64-cmczh?????????????????????????????0/1?????CrashLoopBackOff???89?????????388d????10.xx.xx.xx?yyyyy????????????????????
為什么一開始沒出現(xiàn), 但是重啟又會發(fā)生呢, 問題出在了正則表達(dá)式上. K8s 在機器上啟動容器時, 會創(chuàng)建虛擬的網(wǎng)卡. 這些網(wǎng)卡的名字類似veth17f90f70@if3, 這樣網(wǎng)卡名稱的也會被正則表達(dá)式匹配到, 導(dǎo)致 flannel 無法啟動, 臨時的解決方案就是把機器上的容器移走, vethxxx網(wǎng)卡會自動刪除, flannel 也就自動恢復(fù)了.
當(dāng)然根本的解決方案是修改正則配置: - -iface-regex="^(bond1|eth1)$" 使 flannel 更加精準(zhǔn)的匹配網(wǎng)卡名稱.
flannel 配置更新與驗證
更新準(zhǔn)備
因為不太了解 flannel 是否處理流量, 更新 flannel 時有點害怕, 直到看到了這里的架構(gòu).

flannel 的功能主要是負(fù)責(zé)機器上路由表的修改, 也就是說, 只要不增刪機器, flannel 掛掉也沒關(guān)系, 因為路由表不需要修改.
更新
我們有 100 多臺節(jié)點, 整個集群更新過程大概持續(xù)了 1 個多小時, 更新過程中服務(wù)完全正常.
驗證可用性
內(nèi)存使用情況:

為了驗證 flannel 是否可用, 我們將一臺 node 刪除, 觀察到其他機器上的路由表也同步進(jìn)行了修改.
總結(jié)
問題出現(xiàn)不可怕, 重要的是加好監(jiān)控及時報警, 我們之前一直對 kube-system 的監(jiān)控沒有做到很好, flannel 一直啟動不成功的問題是我檢查時發(fā)現(xiàn)的, 使用別人提供的 yaml 文件前, 要注意下資源設(shè)置的, 類似 Prometheus 也有這種問題的, 它對內(nèi)存的要求很高 預(yù)算充足就不要自建集群了, 有不少運維問題的, 萬一出現(xiàn)一個解決不了的就很麻煩, 類似上次那篇文章: 記一次 Kubernetes 機器內(nèi)核問題排查[1]
希望我們的經(jīng)驗?zāi)軒椭绞褂?K8s 的各位讀者.
引用鏈接
記一次 Kubernetes 機器內(nèi)核問題排查: https://corvo.myseu.cn/2021/03/21/2021-03-21-記一次kubernetes機器內(nèi)核問題的排查/
原文鏈接:https://corvo.myseu.cn/2022/02/18/2022-02-18-%E8%AE%B0%E6%88%91%E4%BB%ACK8s%E9%9B%86%E7%BE%A4%E4%B8%ADflannel%E9%81%87%E5%88%B0%E7%9A%84%E4%B8%A4%E4%B8%AA%E9%97%AE%E9%A2%98/


你可能還喜歡
點擊下方圖片即可閱讀

云原生是一種信仰???
關(guān)注公眾號
后臺回復(fù)?k8s?獲取史上最方便快捷的 Kubernetes 高可用部署工具,只需一條命令,連 ssh 都不需要!


點擊?"閱讀原文"?獲取更好的閱讀體驗!
發(fā)現(xiàn)朋友圈變“安靜”了嗎?


