Flanneld續(xù)租IP異常導(dǎo)致網(wǎng)絡(luò)問題分析
版本信息:
K8S版本:1.14.8Flannel版本:0.7.1
一、現(xiàn)象:
業(yè)務(wù)反饋有部署集群的節(jié)點(diǎn)上的pod無法做域名解析。pod到coredns pod網(wǎng)絡(luò)不通。登錄到節(jié)點(diǎn)查看日志發(fā)現(xiàn)flannel有如下報(bào)錯(cuò):

二、分析:
查看flannel.1和dockerd的bip,網(wǎng)段都不是172.30.103.0。而在etcd中存儲(chǔ)的是172.30.103.0網(wǎng)段。導(dǎo)致flannel網(wǎng)段和docker網(wǎng)段不一致無法通信。
繼續(xù)查看日志,發(fā)現(xiàn)Flanneld續(xù)租有問題:

這里需要介紹一下Flanneld續(xù)租SubNet的機(jī)制。

三、臨時(shí)解決方式:
1)需要重啟docker:刪除flannel.1網(wǎng)橋,重啟Flanneld和docker。
systemctl status flanneldps -ef | grep dockerdsystemctl stop flanneldifconfig flannel.1 downip link del flannel.1systemctl restart flanneldsystemctl restart docker
2)不需要重啟docker
1. etcd刪除新的網(wǎng)段配置;2. etcd加回來舊的網(wǎng)段配置;3. 重啟異常機(jī)器上flanneld;4. 若問題依舊可以設(shè)置定時(shí)重啟flanneld進(jìn)程重新續(xù)租。
3)設(shè)置etcd中對(duì)應(yīng)的TTL時(shí)間為0,即不過期。
# etcdctl -o extended get /k8s/network/subnets/172.30.103.0-24Key: /k8s/network/subnets/172.30.103.0-24Created-Index: 280421902Modified-Index: 280421902TTL: 0Index: 280421995{"PublicIP":"10.21.xxx.xxx","BackendType":"vxlan","BackendData":{"VtepMAC":"2a:a0:03:b8:34:5a"}}
4)設(shè)置flannel的啟動(dòng)參數(shù),縮短續(xù)租時(shí)間
-subnet-lease-renew-margin=720擴(kuò)展:
Flanneld網(wǎng)段擴(kuò)容方案:
Flannel子網(wǎng)有幾種獲取方式:
第一種是所有flanneld都直連etcd,自主決定要使用的子網(wǎng),搶占的方式。
第二種是部署flannel server(運(yùn)行在server模式的flannel),flanneld連接flannel server。
第三種是flanneld直連kube-apiserver,從kube-apiserver中獲取子網(wǎng)網(wǎng)段,-kube-subnet-mgr。
這里的方案適用于第一種方式:只要每個(gè)node上的子網(wǎng)前綴是不變的,調(diào)整flannel整個(gè)網(wǎng)段的前綴就是安全的,已有node分配的網(wǎng)段不會(huì)發(fā)生變化,新增node的網(wǎng)段不會(huì)與其它node的網(wǎng)段重疊。(通過分析0.7.0版本申請(qǐng)子網(wǎng)的代碼 tryAcquireLease --> allocateSubnet --> createSubnet 可知)
直接修改Flannel網(wǎng)段:
# etcdctl set /coreos.com/network/config '{"Network":"11.0.0.0/8"}'// 擴(kuò)容之后,新增node的網(wǎng)段情況如下:$ cat /run/flannel/subnet.envFLANNEL_NETWORK=11.0.0.0/8 // 網(wǎng)段前綴是/8FLANNEL_SUBNET=11.0.47.1/24FLANNEL_MTU=1426FLANNEL_IPMASQ=false// 已有node的上的網(wǎng)段還是以前的配置:$ cat /run/flannel/subnet.envFLANNEL_NETWORK=11.0.0.0/16 // 注意還是/16FLANNEL_SUBNET=11.0.98.1/24FLANNEL_MTU=1426FLANNEL_IPMASQ=false// Pod之間的通信不受影響,并且將已有node上的flannel重啟后,子網(wǎng)配置會(huì)自動(dòng)刷新:$ cat /run/flannel/subnet.envFLANNEL_NETWORK=11.0.0.0/8 // 前綴刷新FLANNEL_SUBNET=11.0.98.1/24 // 子網(wǎng)網(wǎng)段不變FLANNEL_MTU=1426FLANNEL_IPMASQ=false
