文章目錄
1.容器網絡基礎
1.1 Network Namespace
每一個容器默認都被隔離在自己的network namespace中,容器看到的網絡棧的內容有:
構成了容器發起和處理網絡請求的基本環境
- 網卡
- 迴環設備
- 路由表
- Iptables規則
1.2 容器間&跨節點容器如何通信?
- 容器之間通信
- 容器訪問外部網絡
- 跨節點容器間通信
-
網橋(Bridge)
虛擬交換機
MAC地址表 -
Veth Pair
連接不同net namespace的”網線“
-
Overlay網絡
在已有的宿主機網絡上,再通過軟件構建一個覆蓋在已有宿主機網絡之上的、可以把所有容器連通在一起的虛擬網絡。所以,這種技術就被稱爲:Overlay Network(覆蓋網絡)。
2.跨主機網絡
2.1 Flannel
Flannel 項目是 CoreOS 公司主推的容器網絡方案。事實上,Flannel 項目本身只是一個框架,真正爲我們提供容器網絡功能的,是 Flannel 的後端實現。
2.1.1 三種後端
- UDP
1)工作原理
拓撲結構
node1
容器1:100.96.1.2
docker0網橋設備:100.96.1.1
node2
容器2:100.96.2.3
docker0: 100.96.2.1
任務?讓node1容器1與node2容器2通信
過程分析
(1)容器1發起的ip包,源地址100.96.1.2 目的:100.96.2.3,通過路由發給網關docker0地址
(2)docker0收到後,根據宿主機路由表
flannel環境宿主機路由表
100.96.0.0/16 dev flannel0
100.96.1.0/24 dev docker0
10.168.0.0/24 dev eth0
根據第一條路由,將IP包發送給flanneld進程
(3)flanneld進程收到包
進行重新封裝,封裝在UDP下面,封裝好後從eth0發出去,node2接收
問題:怎麼知道容器所在節點的地址是什麼-----etcd: 100.96.1.0 --> 10.168.0.2、100.96.2.0 -> 10.168.0.3
(4)node2收到包,查看 dst port,根據目的端口把包轉發給相應的應用程序flanneld去處理
100.96.2.0 -> 10.168.0.3
(5)flannel0收到後,查看host網絡棧路由表,根據路由錶轉發
2)TUN工作圖
ip tun src 100.96.1.1 dst 100.96.2.1
- VXLAN
在現有的三層網絡之上,“覆蓋”一層虛擬的、由內核 VXLAN 模塊負責維護的二層網絡,使得連接在這個 VXLAN 二層網絡上的“主機”(虛擬機或者容器都可以)之間,可以像在同一個局域網(LAN)裏那樣自由通信。當然,實際上,這些“主機”可能分佈在不同的宿主機上,甚至是分佈在不同的物理機房裏。
1)VTEP
能夠在二層網絡上打通“隧道”,VXLAN 會在宿主機上設置一個特殊的網絡設備作爲“隧道”的兩端。這個設備就叫作 VTEP,即:VXLAN Tunnel End Point(虛擬隧道端點)
2)通信原理圖
內部數據幀
外部數據幀
3)VNI
Virtual Network Identifier
flannel.1中的1即是VNI值
4)FDB
Fowarding DataBase,由flanneld進程維護,包含目標”網橋“flannel.1 對應node的物理接口信息
flannel.1 dst 10.168.0.3
bridge fdb show
- host-gw
k8s的三層網絡解決方案
2.1.2 相關概念
- flannel設備
一種TUN 設備,用於在操作系統內核和用戶應用程序之間傳遞 IP 包 - 子網(Subnet)
由 Flannel 管理的容器網絡裏,一臺宿主機上的所有容器,都屬於該宿主機被分配的一個“子網”。
子網的信息保存在etcd中 - docker0
扮演二層交換機的角色,將數據包發送給正確的端口,進而通過 Veth Pair 設備進入到 container-2 的 Network Namespace 裏
2.1.3 更換網絡插件(在master上操作)
1)rm -rf /etc/cni/net.d/*
2)kubectl delete -f https://git.io/weave-kube-1.6
3)kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
有可能失敗,自行拷貝到文件中再apply
4)vi /etc/kubernetes/manifests/kube-controller-manager.yaml
- --allocate-node-cidrs=true # 是否應在雲提供商上分配和設置Pod的CIDR
- --cluster-cidr=10.244.0.0/16 # 集羣中Pod的CIDR範圍,要求--allocate-node-cidrs爲true
5)systemctl restart kubelet
6)拉取
docker pull quay-mirror.qiniu.com/coreos/flannel:v0.12.0-amd64
docker tag quay-mirror.qiniu.com/coreos/flannel:v0.12.0-amd64 quay.io/coreos/flannel:v0.12.0-amd64
docker rmi quay-mirror.qiniu.com/coreos/flannel:v0.12.0-amd64
7)kubectl -n kube-system get pod
ifconfig