自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Ensp 模擬 Calico 跨網(wǎng)段 Bgp 網(wǎng)絡(luò)

開源
之前詳細(xì)介紹了calico的ipip、vxlan、bgp模式, 但是所有的k8s節(jié)點都是同網(wǎng)段的, 本篇使用ensp和workstation在自己家里就可以模擬測試跨網(wǎng)段k8s集群calico方案的純bgp模式。

[[437697]]

之前詳細(xì)介紹了calico的ipip、vxlan、bgp模式, 但是所有的k8s節(jié)點都是同網(wǎng)段的, 本篇使用ensp和workstation在自己家里就可以模擬測試跨網(wǎng)段k8s集群calico方案的純bgp模式。

架構(gòu)搭建

本測試搭建的是"每機柜獨立自治系統(tǒng)"架構(gòu), 參考:The *AS Per Rack* model[1]

跨網(wǎng)段k8s集群架構(gòu)

整個架構(gòu)分為ensp部分和workstation部分, ensp部分主要是搭建出R1和R2的ebgp關(guān)系以及分別在R1和R2上添加各自網(wǎng)段內(nèi)的k8s節(jié)點的bgp peer,workstation部分為構(gòu)建跨網(wǎng)端的k8s集群。因為192.168.219.0/24網(wǎng)段的主機加入集群需要依賴ensp中的路由, 操作的順序是先搭建出ensp的網(wǎng)絡(luò)部分再將新節(jié)點加到k8s中繼而配置bgp?,F(xiàn)有k8s集群有三臺服務(wù)器均通過橋接聯(lián)網(wǎng), 一臺master節(jié)點兩臺普通節(jié)點, 分別如下

  • k8s-master:10.30.81.127
  • k8s-node1:10.30.81.128
  • k8s-node2:10.30.81.130

ensp配置

按照上圖搭建出ensp部分的網(wǎng)絡(luò)設(shè)備連接拓?fù)洌?然后分別配置R1、R2和兩朵云, R1和R2上配置如下

  1. :' 
  2.  R1上配置 
  3. # 接口ip配置 
  4. int g0/0/0 
  5. ip a 20.20.20.10 24 
  6. int g0/0/1  
  7. ip a 10.30.81.118 24 
  8. int g0/0/2 
  9. ip a 30.30.30.10 24 
  10.  
  11. # 設(shè)置靜態(tài)路由, 跳到下一個網(wǎng)段 
  12. ip route-static 192.168.219.0 24 20.20.20.20 
  13. ip route-static 192.168.219.0 24 30.30.30.20 
  14.  
  15. # bgp配置, 把同AS內(nèi)的ibgp peer也配置了 
  16. bgp 64512  
  17. peer 10.30.81.127 as-number 64512  
  18. peer 10.30.81.128 as-number 64512  
  19. peer 10.30.81.130 as-number 64512  
  20. peer 192.168.219.10 as-number 64513  
  21. peer 192.168.219.10 ebgp-max-hop 5  
  22. peer 192.168.219.10 connect-interface g0/0/1 
  23. peer 10.30.81.127 reflect-client 
  24. peer 10.30.81.128 reflect-client 
  25. peer 10.30.81.130 reflect-client 
  26.  
  27. display bgp peer 
  28. display bgp ip-routing 
  29. display ip interface br 
  30. display ip routing-table 
  31.  
  32. :' 
  33.  R2上配置 
  34. # 接口ip配置 
  35. int g0/0/0 
  36. ip a 192.168.219.10 24 
  37. int g0/0/1  
  38. ip a 20.20.20.20 24 
  39. int g0/0/2 
  40. ip a 30.30.30.20 24 
  41.  
  42. # 設(shè)置靜態(tài)路由, 跳到下一個網(wǎng)段 
  43. ip route-static 10.30.81.0 24 20.20.20.10 
  44. ip route-static 10.30.81.0 24 30.30.30.10 
  45.  
  46.  
  47. # bgp配置, 把同AS內(nèi)的ibgp peer也配置了 
  48. bgp 64513 
  49. peer 10.30.81.118 as-number 64512  
  50. peer 10.30.81.118 ebgp-max-hop 5  
  51. peer 10.30.81.118 connect-interface g0/0/0 
  52. peer 192.168.219.20 as-number 64513  
  53. peer 192.168.219.40 as-number 64513  
  54. peer 192.168.219.20 reflect-client 
  55. peer 192.168.219.40 reflect-client 
  56.  
  57. display bgp peer 
  58. display bgp ip-routing 
  59. display ip interface br 
  60. display ip routing-table 

按如上配置好后R1和R2, 并且配置好兩朵云后, 在R2上ping 10.30.81.118是可以成功的了, 并且我們也可以觀察到R1和R2已經(jīng)建立起了EBGP關(guān)系。但是從R2上ping k8s集群的任何一臺主機都不通, 而是會報host unreachable, 因為k8s節(jié)點主機上并沒有回程路由, 它們并不知道將icmp的replay包發(fā)往往R1, 因此需要在三臺主機上添加路由

  1. # 此時添加如下路由也不會有效, 因為從R2上發(fā)出來的ping包源ip不是192.1168.219.0/24網(wǎng)段的 
  2. route add -n 192.168.219.0/24 gw 10.30.81.118 dev ens33 
  3. echo route add -n 192.168.219.0/24 gw 10.30.81.118 dev ens33 >> /etc/rc.local 
  4. ip route add 192.168.219.0/24 via 10.30.81.118 dev ens33 
  5.  
  6. # 添加如下路由才會在R2上ping通現(xiàn)有k8s集群節(jié)點。 可以在ping通后刪除掉, 因為R2只是中間節(jié)點而已 
  7. route add -n 20.20.20.0/24 gw 10.30.81.118 dev ens33 
  8. route add -n 30.30.30.0/24 gw 10.30.81.118 dev ens33 

在k8s所有節(jié)點添加了如上的路由就可以在R2上ping通所有的k8s節(jié)點了

新機器加入k8s集群

創(chuàng)建虛機并配置它的網(wǎng)絡(luò)為nat模式,配置它們的網(wǎng)卡和路由, 注意不要讓它們有10.30.81.0/24網(wǎng)段的路由指向vmnet8。網(wǎng)卡配置如下

  1. # 網(wǎng)卡配置如下 
  2. [root@k8s-node4 ~]# cat ifcfg-ens33 
  3. TYPE=Ethernet 
  4. DNS1=8.8.8.8 
  5. IPADDR=192.168.219.40 
  6. NETMASK=255.255.255.0 
  7. GATEWAY=192.168.219.10 
  8. BOOTPROTO=static 
  9. DEFROUTE=yes 
  10. IPV4_FAILURE_FATAL=no 
  11. NAME=ens33 
  12. UUID=6ef9b5bf-31c1-43b9-89d6-b8e89ab3c9c3 
  13. DEVICE=ens33 
  14. ONBOOT=yes 
  15.  
  16. # 下面的路由可以不加 
  17. route add -net 10.30.81.0/24 gw 192.168.219.10 dev ens33 

之后就是節(jié)點加入k8s的準(zhǔn)備

系統(tǒng)配置, 如下

  1. echo "Stop Firewalld" 
  2. systemctl stop firewalld 
  3. systemctl disable firewalld 
  4. sed -ie 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config 
  5. setenforce 0 
  6.  
  7. echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf 
  8. echo "net.bridge.bridge-nf-call-ip6tables = 1" >>/etc/sysctl.conf 
  9. echo "net.bridge.bridge-nf-call-iptables = 1" >>/etc/sysctl.conf 
  10. echo "net.bridge.bridge-nf-call-arptables = 1" >>/etc/sysctl.conf 
  11. swapoff -a 
  12. echo swapoff -a >> /etc/rc.local 
  13. sysctl  -p 

從已k8s集群節(jié)點中將kubeadm、kubelet、kubectl的二進制文件拷貝到/usr/bin目錄下,設(shè)置kubelet開機自啟,kubelet的配置如下

  1. [Unit] 
  2. Description=kubelet: The Kubernetes Node Agent 
  3. Documentation=https://kubernetes.io/docs/ 
  4. Wants=network-online.target 
  5. After=network-online.target 
  6.  
  7. [Service] 
  8. ExecStart=/usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --config=/var/lib/kubelet/config.yaml --network-plugin=cni --pod-infra-container-image=k8s.gcr.io/pause:3.2 --fail-swap-on=false 
  9. Restart=always 
  10. StartLimitInterval=0 
  11. RestartSec=10 
  12.  
  13. [Install] 
  14. WantedBy=multi-user.target 

安裝docker

從已有k8s集群節(jié)點中將calico相關(guān)的容器鏡像、kube-proxy鏡像導(dǎo)出并給導(dǎo)入到新節(jié)點中。集群已經(jīng)存在了, k8s控制平面的apiserver、etcd、controller-manager、scheduler鏡像可以不拷到新節(jié)點。

使用kubeadm將新節(jié)點加入k8s集群

驗證跨網(wǎng)段之間的通信是走了ensp網(wǎng)絡(luò)的, 從k8s-master上跟蹤到k8s-node3的路由路徑, 下一跳中存在20.20.20.20為R2的接口

  1. [root@k8s-master ~]# traceroute 192.168.219.20 
  2. traceroute to 192.168.219.20 (192.168.219.20), 30 hops max, 60 byte packets 
  3.  1  10.30.81.118 (10.30.81.118)  18.396 ms  79.412 ms  79.396 ms 
  4.  2  20.20.20.20 (20.20.20.20)  79.387 ms  79.380 ms  83.814 ms 
  5.  3  k8s-node3 (192.168.219.20)  108.104 ms  112.777 ms  117.847 ms 

通過如上搭建出了5節(jié)點的跨網(wǎng)段k8s集群, 如下

  1. [root@k8s-node4 ~]# kubectl get node  -o wide 
  2. NAME         STATUS   ROLES                  AGE   VERSION   INTERNAL-IP       
  3. k8s-master   Ready    control-plane,master   45d   v1.20.0   10.30.81.127      
  4. k8s-node1    Ready    <none>                 45d   v1.20.0   10.30.81.128      
  5. k8s-node2    Ready    <none>                 9d    v1.20.0   10.30.81.130      
  6. k8s-node3    Ready    <none>                 20h   v1.20.0   192.168.219.20    
  7. k8s-node4    Ready    <none>                 20h   v1.20.0   192.168.219.40    

calico配置bgp

配置bgp需要使用calicoctl工具, 自己準(zhǔn)備好, 配置bgp主要分為以下步驟

  1. 確認(rèn)calico部署是純BGP模式
  2. 關(guān)閉BGP默認(rèn)的full mesh模式
  3. 修改指定主機k8s-node3和k8s-node4的bgp as number值為64513
  4. 給所有主機打標(biāo)簽進行bgp as分組, 滿足bpg peer選擇特定的peer對等體
  5. 創(chuàng)建bgp peer, 通過第四步打的標(biāo)簽讓rr client與rr建立ibgp關(guān)系

確認(rèn)calico-node的如下兩個配置為Never

  1. name: CALICO_IPV4POOL_IPIP 
  2.      value: "Never" 
  3. name: CALICO_IPV4POOL_VXLAN 
  4.      value: "Never" 

calico的bgp模式默認(rèn)是full mesh的, 將其關(guān)閉

  1. calicoctl get bgpconfiguration default -o yaml  
  2. apiVersion: projectcalico.org/v3 
  3. items: 
  4. - apiVersion: projectcalico.org/v3 
  5.   kind: BGPConfiguration 
  6.   metadata: 
  7.     creationTimestamp: "2021-09-05T06:23:50Z" 
  8.     namedefault 
  9.     resourceVersion: "555583" 
  10.     uid: 9438105f-cdd8-4315-8694-6d4885c76c85 
  11.   spec: 
  12.     logSeverityScreen: Info 
  13.     nodeToNodeMeshEnabled: false   # 修改為false后calicoctl apply -f bgpconfiguration.yaml 
  14. kind: BGPConfigurationList 
  15. metadata: 
  16.   resourceVersion: "580613" 

將calico節(jié)點k8s-node3和k8s-node4的bgp as number設(shè)置為64513

  1. calicoctl get node k8s-node3 -o yaml > node3.yaml 
  2. apiVersion: projectcalico.org/v3 
  3. kind: Node 
  4. metadata: 
  5.   annotations: 
  6.     projectcalico.org/kube-labels: '{"beta.kubernetes.io/arch":"amd64","beta.kubernetes.io/os":"linux","kubernetes.io/arch":"amd64","kubernetes.io/hostname":"k8s-node3","kubernetes.io/os":"linux"}' 
  7.   creationTimestamp: "2021-09-04T14:03:35Z" 
  8.   labels: 
  9.     beta.kubernetes.io/arch: amd64 
  10.     beta.kubernetes.io/os: linux 
  11.     kubernetes.io/arch: amd64 
  12.     kubernetes.io/hostname: k8s-node3 
  13.     kubernetes.io/os: linux 
  14.   name: k8s-node3 
  15.   resourceVersion: "580885" 
  16.   uid: 64f44ad1-f537-43f3-9f0e-d5d5b80adba2 
  17. spec: 
  18.   addresses: 
  19.   - address: 192.168.219.20/24 
  20.     type: CalicoNodeIP 
  21.   - address: 192.168.219.20 
  22.     type: InternalIP 
  23.   bgp: 
  24.     asNumber: 64513                # 添加這一行 
  25.     ipv4Address: 192.168.219.20/24 
  26.   orchRefs: 
  27.   - nodeName: k8s-node3 
  28.     orchestrator: k8s 
  29. status: 
  30.   podCIDRs: 
  31.   - 10.244.4.0/24 

給節(jié)點打標(biāo)簽

  1. :' 
  2.  給as64512的節(jié)點打標(biāo)簽 
  3. kubectl label nodes k8s-master as-group=as64512 
  4. kubectl label nodes k8s-master as-id=as64512 
  5. kubectl label nodes k8s-node1 as-group=as64512 
  6. kubectl label nodes k8s-node1 as-id=as64512 
  7. kubectl label nodes k8s-node2 as-group=as64512 
  8. kubectl label nodes k8s-node2 as-id=as64512 
  9.  
  10. :' 
  11.  給as64513的節(jié)點打標(biāo)簽 
  12. kubectl label nodes k8s-node3 as-group=as64513 
  13. kubectl label nodes k8s-node3 as-id=as64513 
  14. kubectl label nodes k8s-node4 as-group=as64513 
  15. kubectl label nodes k8s-node4 as-id=as64513 
  16.  
  17. :' 
  18.  后面部署pod測試跨網(wǎng)段節(jié)點的pod間的通信使用 
  19. kubectl label nodes k8s-master node=master 
  20. kubectl label nodes k8s-node4 node=node4 
  21. kubectl label nodes k8s-node3 node=node3 
  22. kubectl label nodes k8s-node2 node=node2 
  23. kubectl label nodes k8s-node1 node=node1 

創(chuàng)建calico的bgp peer實例, 因為在ensp配置部分已經(jīng)在R1、R2上配置好了RR模式。在RR模式下我們選擇將所有的k8s節(jié)點都作為rr的client, 因此同意as下的k8s節(jié)點間不需要再建立ibgp對等體關(guān)系,剩下的則讓各自as的k8s節(jié)點分別和R1與R2建立ibgp關(guān)系即可

  1. :' 
  2.  區(qū)域as64513的k8s節(jié)點與R2建立rr關(guān)系 
  3. vim as64513_r2_peer.yaml 
  4. apiVersion: projectcalico.org/v3 
  5. kind: BGPPeer 
  6. metadata: 
  7.   name: as64513-to-r2-peer        ## 給BGPPeer取一個名稱,方便識別 
  8. spec: 
  9.   nodeSelector: rr-id == 'as64513'   ## 通過節(jié)點選擇器添加有rr-id == 'as64513'標(biāo)簽的節(jié)點 
  10.   peerIP: 192.168.219.10              
  11.   asNumber: 64513                  
  12.  
  13.  
  14. :' 
  15.  區(qū)域as64512的k8s節(jié)點與R1建立rr關(guān)系 
  16. vim as64512_r1_peer.yaml 
  17. apiVersion: projectcalico.org/v3 
  18. kind: BGPPeer 
  19. metadata: 
  20.   name: as64512-to-r1-peer        ## 給BGPPeer取一個名稱,方便識別 
  21. spec: 
  22.   nodeSelector: rr-id == 'as64512'   ## 通過節(jié)點選擇器添加有rr-id == 'as64512'標(biāo)簽的節(jié)點 
  23.   peerIP: 10.30.81.118              
  24.   asNumber: 64512 
  25.  
  26. calicoctl apply -f as64512_r1_peer.yaml 
  27. calicoctl apply -f as64513_r2_peer.yaml 

驗證bgp路由宣告和pod間通信

使用標(biāo)簽在各個節(jié)點行創(chuàng)建pod, 然后找跨網(wǎng)端的兩臺主機的pod進行ping通信并抓包。創(chuàng)建pod

  1. mkdir test_pod 
  2. cd test_pod 
  3.  
  4. vim master.yaml 
  5. apiVersion: v1 
  6. kind: Pod 
  7. metadata: 
  8.   name: master 
  9. spec: 
  10.   containers: 
  11.   - name: master 
  12.     image: larioy/nettool:latest 
  13.     imagePullPolicy: IfNotPresent 
  14.   nodeSelector: 
  15.     node: master 
  16.      
  17. sed s/master/node1/g master.yaml > node1.yaml 
  18. sed s/master/node2/g master.yaml > node2.yaml 
  19. sed s/master/node3/g master.yaml > node3.yaml 
  20. sed s/master/node4/g master.yaml > node4.yaml 
  21.  
  22. ls -l | grep -v grep | grep yaml | awk '{print $9}' | xargs -I {} kubectl apply -f {} 

看看創(chuàng)建出來的pod的分布情況

  1. [root@k8s-master ~]# kubectl get pod -o wide 
  2. NAME     READY   STATUS    RESTARTS   AGE     IP               NODE        
  3. master   1/1     Running   0          4h17m   10.244.235.192   k8s-master  
  4. node1    1/1     Running   0          4h17m   10.244.36.64     k8s-node1   
  5. node2    1/1     Running   0          4h17m   10.244.169.129   k8s-node2   
  6. node3    1/1     Running   0          4h17m   10.244.107.192   k8s-node3   
  7. node4    1/1     Running   0          4h17m   10.244.122.64    k8s-node4   

在bird客戶端看看學(xué)習(xí)到的bgp路由, 在k8s-master節(jié)點上操作, 其自身pod子網(wǎng)段為:10.244.235.192/26

rr路由宣告

在ensp網(wǎng)絡(luò)的R1上其應(yīng)該能學(xué)習(xí)到所有k8s節(jié)點的pod子網(wǎng)對應(yīng)的子網(wǎng)段路由

R1學(xué)習(xí)的bgp路由

接著通過跨網(wǎng)段節(jié)點的pod間通信抓包驗證, as64512的k8s-master節(jié)點的pod master與as64513的k8s-node3的pod node3間通信抓包, 在R2上抓包

  1. [root@k8s-master ~]# kubectl get pod -o wide | grep -E "node3|master"  
  2. master   1/1     Running   0          29m   10.244.235.192   k8s-master 
  3. node3    1/1     Running   0          29m   10.244.107.192   k8s-node3  
  4.  
  5. [root@k8s-master ~]# kubectl exec -it master -- ping 10.244.107.192 
  6. PING 10.244.107.192 (10.244.107.192): 56 data bytes 
  7. 64 bytes from 10.244.107.192: seq=0 ttl=60 time=49.314 ms 
  8. 64 bytes from 10.244.107.192: seq=1 ttl=60 time=28.744 ms 
  9. 64 bytes from 10.244.107.192: seq=2 ttl=60 time=48.422 ms 
  10. 64 bytes from 10.244.107.192: seq=3 ttl=60 time=39.144 ms 
  11. 64 bytes from 10.244.107.192: seq=4 ttl=60 time=32.472 ms 

R2抓包

如上跨節(jié)點k8s集群基于bgp實現(xiàn)了pod間的通信

手動維護bgp

實驗過程中在ENSP部分有關(guān)R1/R2的bgp配置都是手工進行維護的, 針對每機架一個AS的部署模式, 怎么監(jiān)控到一個AS內(nèi)的主機的上下線, 然后自動的更新RR上client的信息。

bgp架構(gòu)的思考

在本篇測試中只建立了"每機架作為一個獨立as"架構(gòu)的測試,該架構(gòu)中最上層是采用交換機連接, 因此要求所有不同網(wǎng)段中的RR要建立其ebgp關(guān)系, 不一定要全互聯(lián)但是要保證每個RR都可以從某一個RR學(xué)到其他剩余的RR宣告的BGP路由。"每機架作為一個獨立AS"架構(gòu)的另一種為最上層為路由器, 他們與所有RR都建立EBGP關(guān)系,這樣在RR之間就不需要再建立BGP關(guān)系了。另外就是考慮路由條目變多后, 哪種架構(gòu)更合適, 暫未涉及。

問題記錄

  • ensp使用云無法找到vmnet8網(wǎng)卡問題, 重裝winPcap,重裝ensp, 路由和同網(wǎng)段主機突然不通了可能是網(wǎng)卡找不到...
  • ensp路由設(shè)備無效問題:見ensp界面右上角菜單查找?guī)椭謨裕?刪掉頁面上的所有設(shè)備重新注冊, 還是失敗考慮重裝ensp...
  • workstation在nat模式下無法連接虛機:先查主機上vmnet8網(wǎng)卡的ip地址,在虛擬網(wǎng)絡(luò)編輯器中設(shè)置nat時, 設(shè)置的nat范圍需要和vmnet8的ip地址在同一網(wǎng)段且網(wǎng)關(guān)設(shè)置為vmnet8的ip
  • 新增k8s節(jié)點在安裝必備的工具時可以先切換回橋接聯(lián)網(wǎng),然后再切換回nat, 然后在加入k8s集群
  • ensp部分網(wǎng)絡(luò)配置不通可以直接在路由器R1和R2的兩端接口處抓包, 分析哪段不通, 哪段接到請求但是沒有響應(yīng)

本文為原創(chuàng)投稿文章,文章原文:https://larioy.gst.monster/2021/09/05/k8s-ji-chong-cni-fang-an-jie-xi/calico/ensp-mo-ni-calico-kua-wang-duan-bgp-wang-luo/

參考資料

[1]The AS Per Rack model: https://docs.projectcalico.org/reference/architecture/design/l3-interconnect-fabric

 

責(zé)任編輯:姜華 來源: k8s技術(shù)圈
相關(guān)推薦

2023-11-28 07:55:05

Calico容器網(wǎng)絡(luò)

2022-07-05 10:38:23

BGPCalicoMetalLB

2022-09-01 06:59:56

Kubernete云原生

2022-07-27 16:23:36

Kubernetes容器

2009-12-17 13:53:31

Route路由功能

2011-04-15 10:22:32

路由器軟路由網(wǎng)段

2018-01-18 14:50:56

Nginx實現(xiàn)CDSW

2013-07-11 10:08:05

2022-05-31 10:30:23

KubernetesCalico運維

2013-07-12 15:17:22

BGP組網(wǎng)BGP協(xié)議

2011-11-21 15:50:52

BGPBGP路由

2019-07-03 10:58:22

Kubernetes網(wǎng)絡(luò)插件

2021-05-06 08:03:07

IPIP網(wǎng)絡(luò)模式calicok8s

2010-08-26 12:12:19

LMHOSTS文件

2025-01-23 08:58:39

弱電網(wǎng)絡(luò)IT

2010-07-05 16:30:45

BGP協(xié)議

2013-12-13 16:19:16

華為eNSPWIFI

2010-08-20 10:50:09

路由器配置

2009-03-23 08:50:53

瀏覽器Expression

2022-08-18 08:00:00

BGP非網(wǎng)絡(luò)工程師漏洞
點贊
收藏

51CTO技術(shù)棧公眾號