Kubernetes利用CNI-bridge插件打通网络
使用CNI插件時,需要如下配置
1、將需要用到的cni組件(二進制可執行文件)放到/opt/cni/bin目錄下
2、在/etc/cni/net.d中增加cni的配置文件,配置文件中可以指定需要使用的cni組件及參數
3、kubelet啟動參數中networkPlugin設置為cni
4、創建網橋
5、添加本機網絡端口到網橋中
具體操作流程:
1、下載CNI插件
https://github.com/containernetworking/cni
2、構建cni組件
cd $GOPATH/src/github.com/containernetworking/plugins ./build_linux.sh3、將第2步生成的cni組件放到/opt/cni/bin目錄下
4、在/etc/cni/net.d中增加cni的配置文件
mkdir -p /etc/cni/net.dcat >/etc/cni/net.d/10-mynet.conf <<EOF {"cniVersion": "0.3.1","name": "mynet","plugins": [{"name": "mynet","type": "bridge","bridge": "cni0","isGateway": true, "ipam": {"type": "host-local","subnet": "192.168.204.2/24","rangeStart": "192.168.204.0","rangeEnd": "192.168.204.254","routes": [{ "dst": "0.0.0.0/0" }]}}] } EOF5、kubelet啟動參數中networkPlugin設置為cni
--network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/opt/cni/bin6、創建bridge網橋和添加添加本機網絡端口到網橋中
[root@node1 ~]# cat /etc/rc.local #!/bin/bash # THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES # # It is highly advisable to create own systemd services or udev rules # to run scripts during boot instead of using this file. # # In contrast to previous versions due to parallel execution during boot # this script will NOT be run after all other services. # # Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure # that this script will be executed during boot.touch /var/lock/subsys/local/usr/sbin/ip link add cni0 type bridge//添加網橋 /usr/sbin/ip link set ens33 master cni0// /usr/sbin/ifconfig ens33 192.168.204.143/24//主機網卡恢復IP /usr/sbin/ifconfig cni0 192.168.204.3/24//給網橋設置IP/usr/sbin/ip link add cni0 type bridge:創建網橋
Ip link set ens33 master cni0: 添加添加本機網絡端口到網橋中
1-4步將bridge搭建好了,但本機網卡eth0與bridge網橋是還沒有建立通信的。也就是說外界還是無法訪問通過bridge創建的容器。
所以當eth0加入bridge之后,從外面網絡收到的數據包將無條件的轉發給bridge,自己變成了一根網線。就可以訪問通過bridge創建的容器了。
bridge不區分接入進來的是物理設備還是虛擬設備,對它來說都一樣的,都是網絡設備。
ens33是本機網卡名稱,不同主機名稱會不同,ens33對應下圖的eth0,cni0對應bridge
驗證:
192.168.204.189是pod的ip
[root@master1 ~]# curl 192.168.204.189 <h1>This request was processed by host: first-deployment-5bc5c8cd58-p2kqk</h1>拓展:
CNI-bridge方式示意圖:
.png)
使用新建的bridge網橋代替docker0網橋(docker0也可以繼續保留,常規容器還是用docker0,而需要互通的容器可以借助于這個工具給docker容器新建虛擬網卡并綁定IP橋接到bridge)
bridge和主機eth0之間是也是利用veth pair這個技術:
https://blog.csdn.net/sld880311/article/details/77650937
https://segmentfault.com/a/1190000009491002#articleHeader6
查看網橋:
[root@node1 ~]# brctl show bridge name bridge id STP enabled interfaces cni0 8000.000c294220a7 no ens33veth1b8fe73aveth31fc4222veth5ed676bcvethf0b15c0b docker0 8000.0242814c9fe7 no查看路由:
[root@node1 ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.204.2 0.0.0.0 UG 0 0 0 cni0 172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0 192.168.204.0 0.0.0.0 255.255.255.0 U 0 0 0 cni0查看網卡:
[root@node1 ~]# ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master cni0 state UP qlen 1000link/ether 00:0c:29:42:20:a7 brd ff:ff:ff:ff:ff:ffinet 192.168.204.143/24 brd 192.168.204.255 scope global ens33valid_lft forever preferred_lft foreverinet6 fe80::7c8e:9fcd:f1c1:f52b/64 scope link valid_lft forever preferred_lft forever 3: cni0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP qlen 1000link/ether 00:0c:29:42:20:a7 brd ff:ff:ff:ff:ff:ffinet 192.168.204.3/24 brd 192.168.204.255 scope global cni0valid_lft forever preferred_lft foreverinet6 fe80::20c:29ff:fe42:20a7/64 scope link valid_lft forever preferred_lft forever 4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN link/ether 02:42:81:4c:9f:e7 brd ff:ff:ff:ff:ff:ffinet 172.17.0.1/16 brd 172.17.255.255 scope global docker0valid_lft forever preferred_lft forever創建刪除容器時,Bridge工作流程:
創建容器:
1)brdige組件創建一個指定名字的網橋,如果網橋已經存在,就使用已有的網橋;
2)創建vethpair,將node端的veth設備連接到網橋上;
3)從ipam獲取一個給容器使用的ip數據,并根據返回的數據計算出容器對應的網關;
4)進入容器網絡名字空間,修改容器中網卡名和網卡ip,以及配置路由,并進行arp廣播(注意我們只為vethpair的容器端配置ip,node端是沒有ip的);
5)如果IsGW=true,將網橋配置為網關,具體方法是:將第三步計算得到的網關IP配置到網橋上,同時根據需要將網橋上其他ip刪除。最后開啟網橋的ip_forward內核參數;
6)如果IPMasq=true,使用iptables增加容器私有網網段到外部網段的masquerade規則,這樣容器內部訪問外部網絡時會進行snat,在很多情況下配置了這條路由后容器內部才能訪問外網。(這里代碼中會做exist檢查,防止生成重復的iptables規則);
7)配置結束,整理當前網橋的信息,并返回給調用者。DEL命令
刪除容器:
1)根據命令執行的參數,確認要刪除的容器ip,調用ipam的del命令,將IP還回IP pool;
2)進入容器的網絡名字空間,根據容器IP將對應的網卡刪除;
3)如果IPMasq=true,在node上刪除創建網絡時配置的幾條iptables規則。
總結
以上是生活随笔為你收集整理的Kubernetes利用CNI-bridge插件打通网络的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spring boot结合FastDFS
- 下一篇: Magento数据库结构:EAV (转)