記 K8s 集群中 Flannel 的兩個(gè)問(wèn)題
自建的K8s集群的坑不少, 尤其是到了Node數(shù)量越來(lái)越多之后, 問(wèn)題也逐漸顯露了出來(lái), 博客主要介紹我們使用flannel之后遇到的兩個(gè)問(wèn)題以及解決方案, 問(wèn)題其實(shí)不嚴(yán)重, 只是涉及到了底層的結(jié)構(gòu), 改動(dòng)時(shí)候要小心.
1.flannel的OOM問(wèn)題
官方給出的配置
下面這張圖是官方的配置, 可以看到, 默認(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
我們遇到的問(wèn)題
當(dāng)我們的機(jī)器數(shù)量超過(guò)100個(gè)以后, flannel會(huì)以O(shè)OM的形式一直掛掉..
Feb??9?04:52:44??kernel:?[37630249.323630]?Memory?cgroup?out?of?memory:?Kill?process?33838?(flanneld)?score?1653?or?sacrifice?child
通過(guò)Prometheus采集到的數(shù)據(jù)也可以看到, 容器的內(nèi)存使用情況很不樂(lè)觀:

也沒(méi)什么好的解決方案, 只能調(diào)整資源限制了.
2.flannel指定網(wǎng)卡問(wèn)題
問(wèn)題背景
因?yàn)槲覀兪褂玫臋C(jī)器比較混雜, 機(jī)器的網(wǎng)卡也各不相同, 在開(kāi)始搭建集群時(shí)就遇到了下面的問(wèn)題.
>?我們虛擬機(jī)中的網(wǎng)卡,?僅有`10`開(kāi)頭的內(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
>?物理機(jī)中的網(wǎng)卡,?既有`59`開(kāi)頭的公網(wǎng)地址,?也有`10`開(kāi)頭的內(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
這樣帶來(lái)的問(wèn)題就是flannel通信問(wèn)題, 如果多個(gè)網(wǎng)卡, 且啟動(dòng)時(shí)未指定, flannel會(huì)找一個(gè)缺省的網(wǎng)卡, 對(duì)于虛擬機(jī)來(lái)講沒(méi)有關(guān)系, 但是對(duì)于物理機(jī), flannel會(huì)找到eth0這個(gè)外網(wǎng)網(wǎng)卡, flannel使用錯(cuò)誤的網(wǎng)卡發(fā)送數(shù)據(jù), 抓包的數(shù)據(jù)可以看出 flannel使用了公網(wǎng)的網(wǎng)卡發(fā)送內(nèi)網(wǎng)數(shù)據(jù), 會(huì)被交換機(jī)丟棄, 具體圖片就不貼了, IP屬于公司機(jī)密.
具體的修改方法是確保flannel使用了正確的網(wǎng)卡, 需要在啟動(dòng)時(shí)指定參數(shù)--iface與--iface-regex: 我們的虛擬機(jī)數(shù)量少, 物理機(jī)數(shù)量多. 除了eth1, 還有bond1這種網(wǎng)卡名, 因此針對(duì)虛擬機(jī), 統(tǒng)一將其eth0改名變成eth1, 而后指定了-iface-regex=eth1|bond1這樣的配置, 對(duì)于后續(xù)增加物理機(jī)更友好.
問(wèn)題到這里似乎就結(jié)束了, 但是隨著flannel經(jīng)常發(fā)生OOM重啟, 暴露了我們的設(shè)置問(wèn)題.
我們發(fā)現(xiàn)flannel OOM后無(wú)法正常重啟
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????????????????????
為什么一開(kāi)始沒(méi)出現(xiàn), 但是重啟又會(huì)發(fā)生呢, 問(wèn)題出在了正則表達(dá)式上. K8s在機(jī)器上啟動(dòng)容器時(shí), 會(huì)創(chuàng)建虛擬的網(wǎng)卡. 這些網(wǎng)卡的名字類似veth17f90f70@if3, 這樣網(wǎng)卡名稱的也會(huì)被正則表達(dá)式匹配到, 導(dǎo)致flannel無(wú)法啟動(dòng), 臨時(shí)的解決方案就是把機(jī)器上的容器移走, vethxxx網(wǎng)卡會(huì)自動(dòng)刪除, flannel也就自動(dòng)恢復(fù)了.
當(dāng)然根本的解決方案是修改正則配置: - -iface-regex="^(bond1|eth1)$" 使flannel更加精準(zhǔn)的匹配網(wǎng)卡名稱.
flannel 配置更新與驗(yàn)證
更新準(zhǔn)備
因?yàn)椴惶私鈌lannel是否處理流量, 更新flannel時(shí)有點(diǎn)害怕, 直到看到了這里的架構(gòu).

flannel的功能主要是負(fù)責(zé)機(jī)器上路由表的修改, 也就是說(shuō), 只要不增刪機(jī)器, flannel掛掉也沒(méi)關(guān)系, 因?yàn)槁酚杀聿恍枰薷?
更新
我們有100多臺(tái)節(jié)點(diǎn), 整個(gè)集群更新過(guò)程大概持續(xù)了1個(gè)多小時(shí), 更新過(guò)程中服務(wù)完全正常.
驗(yàn)證可用性
內(nèi)存使用情況:

為了驗(yàn)證flannel是否可用, 我們將一臺(tái)node刪除, 觀察到其他機(jī)器上的路由表也同步進(jìn)行了修改.
總結(jié)
問(wèn)題出現(xiàn)不可怕, 重要的是加好監(jiān)控及時(shí)報(bào)警, 我們之前一直對(duì)kube-system的監(jiān)控沒(méi)有做到很好, flannel一直啟動(dòng)不成功的問(wèn)題是我檢查時(shí)發(fā)現(xiàn)的, 使用別人提供的yaml文件前, 要注意下資源設(shè)置的, 類似Prometheus也有這種問(wèn)題的, 它對(duì)內(nèi)存的要求很高 預(yù)算充足就不要自建集群了, 有不少運(yùn)維問(wèn)題的, 萬(wàn)一出現(xiàn)一個(gè)解決不了的就很麻煩, 類似上次那篇文章: 記一次Kubernetes機(jī)器內(nèi)核問(wèn)題排查
希望我們的經(jīng)驗(yàn)?zāi)軒椭绞褂肒8s的各位讀者。
原文鏈接: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/
