k8s安裝calico時(shí)如何選擇網(wǎng)卡問(wèn)題
1.了解calico的通信
默認(rèn)情況下calico使用的是IPIP模式進(jìn)行通信,所有節(jié)點(diǎn)之間建立tunl0隧道。
每創(chuàng)建一個(gè)pod在宿主機(jī)上都會(huì)產(chǎn)生一個(gè)以cali開(kāi)頭的虛擬接口,如下圖pod1生成了一個(gè)calixxxxx網(wǎng)卡,pod2生成了一個(gè)caliyyyyy虛擬網(wǎng)卡。
每個(gè)pod發(fā)出去的數(shù)據(jù)包會(huì)直接轉(zhuǎn)發(fā)到cali開(kāi)頭的網(wǎng)卡,這個(gè)接口跟pod里的網(wǎng)卡是veth pair的關(guān)系。
veth pair最直接的理解就是“網(wǎng)線直連”,pod1發(fā)出去的所有數(shù)據(jù)包,“閉著眼”轉(zhuǎn)發(fā)給calixxxxx,calixxxxx從其他地方收到的數(shù)據(jù)包“閉著眼”轉(zhuǎn)發(fā)給pod1。
cali開(kāi)頭的網(wǎng)卡會(huì)連接到tunl0上,pod1和pod2通信時(shí),pod1發(fā)出的數(shù)據(jù)包先到達(dá)calixxxxx,然后進(jìn)入vms71的tunl0接口,再然后到達(dá)隧道的另一端vms72的tunl0接口,然后轉(zhuǎn)發(fā)到caliyyyy,最終到達(dá)了pod2。所以tunl0隧道的作用就是封裝所有pod之間的流量。
現(xiàn)在的問(wèn)題是tunl0隧道所走的物理線路是哪條呢?默認(rèn)情況下calico會(huì)自動(dòng)選擇,但是如果有多張網(wǎng)卡的話我們想手動(dòng)選擇網(wǎng)卡,下面分成5種情況來(lái)看tunl0如何選擇物理線路。
2.實(shí)驗(yàn)準(zhǔn)備
本實(shí)驗(yàn)共兩臺(tái)節(jié)點(diǎn),如下。
[root@vms71 ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION vms71.rhce.cc Ready control-plane,master 54m v1.23.2 vms72.rhce.cc Ready <none> 54m v1.23.2 [root@vms71 ~]#
為了測(cè)試,特地把vms72上的網(wǎng)卡名做了修改,原來(lái)的ens32修改名為eth0,原來(lái)的ens33修改名為eth1。
vms71上ens32 ----- vms72上eth1 同一網(wǎng)段。 vms71上ens33 ----- vms72上eth0 同一網(wǎng)段。
同一網(wǎng)段的網(wǎng)卡,結(jié)合上圖,我這里并沒(méi)寫(xiě)錯(cuò)。
練習(xí)時(shí)會(huì)在vms71上創(chuàng)建pod1,在vms72上創(chuàng)建pod2,所編寫(xiě)的pod.yaml內(nèi)容如下
[root@vms71 ~]# cat pod.yaml apiVersion: v1 kind: Pod metadata: creationTimestamp: null labels: run: pod1 name: pod1 spec: nodeName: vms71.rhce.cc terminationGracePeriodSeconds: 0 containers: - image: localhost/centos:test imagePullPolicy: IfNotPresent command: ["sh","-c","sleep 1d"] name: pod1 resources: {} dnsPolicy: ClusterFirst restartPolicy: Always status: {} --- apiVersion: v1 kind: Pod metadata: creationTimestamp: null labels: run: pod2 name: pod2 spec: nodeName: vms72.rhce.cc terminationGracePeriodSeconds: 0 containers: - image: localhost/centos:test imagePullPolicy: IfNotPresent command: ["sh","-c","sleep 1d"] name: pod2 resources: {} dnsPolicy: ClusterFirst restartPolicy: Always status: {} [root@vms71 ~]#
第一種情況 指定網(wǎng)卡1
修改calico.yaml的內(nèi)容,找到IP_AUTODETECTION_METHOD
- name: IP_AUTODETECTION_METHOD value: "interface=ens33,eth0"
這里指定tunl0隧道所對(duì)應(yīng)的物理接口為ens33或者eth0。
在vms71上他會(huì)選擇ens33,在vms72上會(huì)選擇eth0。
安裝calico。
[root@vms71 ~]# kubectl apply -f calico.yaml configmap/calico-config created ...輸出... [root@vms71 ~]#
創(chuàng)建測(cè)試用的pod。
[root@vms71 ~]# kubectl apply -f pod.yaml pod/pod1 created pod/pod2 created [root@vms71 ~]# [root@vms71 ~]# kubectl get pods -owide NAME READY STATUS RESTARTS AGE IP NODE pod1 1/1 Running 0 14s 10.244.118.193 vms71.rhce.cc pod2 1/1 Running 0 14s 10.244.5.194 vms72.rhce.cc [root@vms71 ~]#
整個(gè)拓?fù)鋱D應(yīng)該如下。
進(jìn)入到pod1里去,然后通過(guò)traceroute訪問(wèn) pod2的IP即 10.244.5.194。
[root@vms71 ~]# kubectl exec -it pod1 -- bash [root@pod1 /]# [root@pod1 /]# traceroute 10.244.5.194 traceroute to 10.244.5.194 (10.244.5.194), 30 hops max, 60 byte packets 1 192-168-26-71.kubernetes.default.svc.cluster.local (192.168.26.71) 0.049 ms 0.009 ms 0.007 ms 2 10.244.5.192 (10.244.5.192) 0.477 ms 0.414 ms 0.378 ms 3 10.244.5.194 (10.244.5.194) 0.615 ms 0.577 ms 0.540 ms [root@pod1 /]# exit [root@vms71 ~]#
從這里可以看到在pod1發(fā)出去的包,直接到達(dá)隧道另一端即vms72上的tunl0,然后再轉(zhuǎn)發(fā)到pod2的。
那么vms71和vms72之間的隧道之間是怎么走的呢?
先查看vms71的路由。
[root@vms71 ~]# ip route | grep tunl0 10.244.5.192/26 via 192.168.30.72 dev tunl0 proto bird onlink [root@vms71 ~]#
凡是去往網(wǎng)段10.244.5.192/26的數(shù)據(jù)包都發(fā)送到192.168.30.72(這是vms72的eth0接口,也是隧道tunl0的另一端)。
查看vms72的路由。
[root@vms72 ~]# ip route | grep tunl0 10.244.118.192/26 via 192.168.30.71 dev tunl0 proto bird onlink [root@vms72 ~]# 凡是去往網(wǎng)段10.244. ```118.192/26的數(shù)據(jù)包都發(fā)送到192.168.30.71(這是vms71的ens33接口,也是隧道tunl0的另一端)。 刪除pod1和pod2。 ```shell [root@vms71 ~]# kubectl delete -f pod.yaml pod "pod1" deleted pod "pod2" deleted [root@vms71 ~]# 刪除calico。
[root@vms71 ~]# kubectl delete -f calico.yaml configmap "calico-config" deleted ...輸出... [root@vms71 ~]#
第二種情況 指定網(wǎng)卡2
修改calico.yaml的內(nèi)容,修改IP_AUTODETECTION_METHOD的值。
- name: IP_AUTODETECTION_METHOD value: "interface=ens32,eth1"
這里指定tunl0所使用的物理線路是ens32或者eth1,vms71上有ens32所以選擇ens32,vms72上有eth1則選擇eth1。
安裝calico。
[root@vms71 ~]# kubectl apply -f calico.yaml configmap/calico-config created ...輸出... [root@vms71 ~]#
創(chuàng)建pod。
[root@vms71 ~]# kubectl apply -f pod.yaml pod/pod1 created pod/pod2 created [root@vms71 ~]# [root@vms71 ~]# kubectl get pods -owide NAME READY STATUS RESTARTS AGE IP NODE pod1 1/1 Running 0 3s 10.244.118.193 vms71.rhce.cc pod2 1/1 Running 0 3s 10.244.5.194 vms72.rhce.cc [root@vms71 ~]#
兩個(gè)pod的IP保持和之前一樣。
進(jìn)入到pod1里去,然后通過(guò)traceroute訪問(wèn) pod2的IP即 10.244.5.194。
[root@vms71 ~]# kubectl exec -it pod1 -- bash [root@pod1 /]# traceroute 10.244.5.194 traceroute to 10.244.5.194 (10.244.5.194), 30 hops max, 60 byte packets 1 192-168-26-71.kubernetes.default.svc.cluster.local (192.168.26.71) 0.050 ms 0.009 ms 0.007 ms 2 10.244.5.192 (10.244.5.192) 0.493 ms 0.407 ms 0.365 ms 3 10.244.5.194 (10.244.5.194) 0.482 ms 0.468 ms 0.461 ms [root@pod1 /]# exit exit [root@vms71 ~]#
查看vms71的路由。
[root@vms71 ~]# ip route | grep tunl0 10.244.5.192/26 via 192.168.26.72 dev tunl0 proto bird onlink [root@vms71 ~]#
凡是去往網(wǎng)段10.244.5.192/26的數(shù)據(jù)包都發(fā)送到192.168.26.72(這是vms72的eth1接口,也是隧道tunl0的另一端)。
查看vms72的路由。
[root@vms72 ~]# ip route | grep tunl0 10.244.118.192/26 via 192.168.26.71 dev tunl0 proto bird onlink [root@vms72 ~]#
凡是去往網(wǎng)段10.244.118.192/26的數(shù)據(jù)包都發(fā)送到192.168.26.71(這是vms71的ens32接口,也是隧道tunl0的另一端)。
刪除pod1和pod2。
[root@vms71 ~]# kubectl delete -f pod.yaml pod "pod1" deleted pod "pod2" deleted [root@vms71 ~]#
刪除calico。
[root@vms71 ~]# kubectl delete -f calico.yaml configmap "calico-config" deleted ...輸出... [root@vms71 ~]#
第三種情況 跳過(guò)指定網(wǎng)卡
修改calico.yaml的內(nèi)容,修改IP_AUTODETECTION_METHOD的值
- name: IP_AUTODETECTION_METHOD value: "skip-interface=eth1,ens32"
tunl0選擇物理網(wǎng)卡時(shí)跳過(guò)eth1或者ens32。
在vms71上跳過(guò)ens32的話只能選擇ens33,在vms72上跳過(guò)eth1的話只能選擇eth0。
安裝calico。
[root@vms71 ~]# kubectl apply -f calico.yaml configmap/calico-config created ...輸出... [root@vms71 ~]#
先查看vms71的路由
[root@vms71 ~]# ip route | grep tunl0 10.244.5.192/26 via 192.168.30.72 dev tunl0 proto bird onlink [root@vms71 ~]#
凡是去往網(wǎng)段10.244.5.192/26的數(shù)據(jù)包都發(fā)送到192.168.30.72(這是vms72的eth0接口,也是隧道tunl0的另一端)。
先查看vms72的路由
[root@vms72 ~]# ip route | grep tunl0 10.244.118.192/26 via 192.168.30.71 dev tunl0 proto bird onlink [root@vms72 ~]#
凡是去往網(wǎng)段10.244.118.192/26的數(shù)據(jù)包都發(fā)送到192.168.30.71(這是vms71的ens33接口,也是隧道tunl0的另一端)。刪除calico。
[root@vms71 ~]# kubectl delete -f calico.yaml configmap "calico-config" deleted ...輸出... [root@vms71 ~]#
第四種情況 通過(guò)網(wǎng)絡(luò)連通性判斷
修改calico.yaml的內(nèi)容,修改IP_AUTODETECTION_METHOD的值。
- name: IP_AUTODETECTION_METHOD value: "can-reach=192.168.30.1"
tunl0要選擇能和192.168.30.1通信的那張網(wǎng)卡,在vms71上ens33網(wǎng)卡和192.168.30.1是同一個(gè)網(wǎng)段,能夠和192.168.30.1通信,被選中。
在vms72上eth0網(wǎng)卡和192.168.30.1是同一網(wǎng)段可以通信,被選中。
創(chuàng)建calico。
[root@vms71 ~]# kubectl apply -f calico.yaml configmap/calico-config created ...輸出... [root@vms71 ~]#
先查看vms71的路由
[root@vms71 ~]# ip route | grep tunl0 10.244.5.192/26 via 192.168.30.72 dev tunl0 proto bird onlink [root@vms71 ~]#
凡是去往網(wǎng)段10.244.5.192/26的數(shù)據(jù)包都發(fā)送到192.168.30.72(這是vms72的eth0接口,也是隧道tunl0的另一端)。
先查看vms72的路由
[root@vms72 ~]# ip route | grep tunl0 10.244.118.192/26 via 192.168.30.71 dev tunl0 proto bird onlink [root@vms72 ~]#
凡是去往網(wǎng)段10.244.118.192/26的數(shù)據(jù)包都發(fā)送到192.168.30.71(這是vms71的ens33接口,也是隧道tunl0的另一端)。
刪除calico。
[root@vms71 ~]# kubectl delete -f calico.yaml configmap "calico-config" deleted ...輸出... [root@vms71 ~]#
第五種情況 通過(guò)cidr判斷
修改calico.yaml的內(nèi)容,修改IP_AUTODETECTION_METHOD的值。
- name: IP_AUTODETECTION_METHOD value: "cidr=192.168.26.0/24"
tunl0選擇選擇192.168.26.0/24網(wǎng)段的網(wǎng)卡,vms71選中的是ens32,vms72上選中的應(yīng)該是eth1了,因?yàn)樗麄兌际菍儆?92.168.26.0/24網(wǎng)段的。
創(chuàng)建calico。
[root@vms71 ~]# kubectl apply -f calico.yaml configmap/calico-config created ...輸出... [root@vms71 ~]#
查看vms71的路由。
[root@vms71 ~]# ip route | grep tunl0 10.244.5.192/26 via 192.168.26.72 dev tunl0 proto bird onlink [root@vms71 ~]#
凡是去往網(wǎng)段10.244.5.192/26的數(shù)據(jù)包都發(fā)送到192.168.26.72(這是vms72的eth1接口,也是隧道tunl0的另一端)。
查看vms72的路由。
[root@vms72 ~]# ip route | grep tunl0 10.244.118.192/26 via 192.168.26.71 dev tunl0 proto bird onlink [root@vms72 ~]#
凡是去往網(wǎng)段10.244.118.192/26的數(shù)據(jù)包都發(fā)送到192.168.26.71(這是vms71的ens32接口,也是隧道tunl0的另一端)。
刪除calico。
[root@vms71 ~]# kubectl delete -f calico.yaml configmap "calico-config" deleted ...輸出... [root@vms71 ~]#
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Kubernetes中創(chuàng)建命名空間實(shí)現(xiàn)方法
這篇文章主要為大家介紹了Kubernetes中創(chuàng)建命名空間實(shí)現(xiàn)方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-112022最新青龍面板對(duì)接機(jī)器人的詳細(xì)過(guò)程(傻妞對(duì)接onebot(oicq)協(xié)議實(shí)現(xiàn)機(jī)器人功能)
這篇文章主要介紹了2022最新青龍面板對(duì)接機(jī)器人的詳細(xì)過(guò)程(傻妞對(duì)接onebot(oicq)協(xié)議實(shí)現(xiàn)機(jī)器人功能),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05K8s中的臨時(shí)容器Ephemeral?Containers使用
這篇文章主要介紹了K8s中的臨時(shí)容器Ephemeral?Containers使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07Kubernetes實(shí)現(xiàn)CI與CD配置教程
這篇文章主要為大家介紹了基于Kubernetes實(shí)現(xiàn)CI與CD配置教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05