Kubernetes Network(Kubernetes 網絡)一

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

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章