一、K8S提供三大接口
1.1容器運(yùn)行時(shí)接口CRI
解決了什么問(wèn)題?
容器鏡像(帶有應(yīng)用程序規(guī)范的文件)必須以標(biāo)準(zhǔn)化,安全和隔離的方式啟動(dòng)
-
標(biāo)準(zhǔn)化,因?yàn)闊o(wú)論它們?cè)诤翁庍\(yùn)行,都需要標(biāo)準(zhǔn)的操作規(guī)則。
-
安全,因?yàn)槟悴幌M魏尾粦?yīng)該訪問(wèn)它的人,對(duì)它操作。
-
隔離,因?yàn)槟悴幌M麘?yīng)用程序影響其他應(yīng)用,或受其他應(yīng)用程序的影響(例如,在同一節(jié)點(diǎn)的其他應(yīng)用程序崩潰導(dǎo)致自身故障)。隔離基本上起保護(hù)作用。此外,還需要為應(yīng)用程序提供資源限制,例如 CPU、存儲(chǔ)和內(nèi)存
工具
- docker
- containerd
- podman
- cri-0
1.2云原生網(wǎng)絡(luò)接口CNI
云原生網(wǎng)絡(luò)是什么
- 在現(xiàn)有網(wǎng)絡(luò)之上創(chuàng)建一個(gè)專門用于應(yīng)用程序通信的虛擬網(wǎng)絡(luò),稱為覆蓋網(wǎng)絡(luò)( overlay network )。
解決了什么問(wèn)題
- 提供一個(gè)專用的通信網(wǎng)絡(luò),將獨(dú)立的容器彼此私下通信
- 使用軟件來(lái)控制、檢查和修改數(shù)據(jù)流。管理和保護(hù)容器間的連接。滿足各容器之間的隔離要求
- 如果向擴(kuò)展容器網(wǎng)絡(luò)和網(wǎng)絡(luò)策略,云原生網(wǎng)絡(luò)的可編程性和聲明性使這成為可能。
如何解決
- 使用Flannel、calico、cilium等工具
1.3云原生存儲(chǔ)接口CSI
什么是存儲(chǔ)
- 存儲(chǔ),即存放應(yīng)用程序持久數(shù)據(jù)的位置,通常稱為持久卷。能夠輕松訪問(wèn)持久卷,對(duì)于應(yīng)用程序可靠運(yùn)行至關(guān)重要。通常,當(dāng)我們說(shuō)持久數(shù)據(jù)時(shí),是指想要確保我們?cè)趹?yīng)用重新啟動(dòng)時(shí)不會(huì)消失的任何數(shù)據(jù)。
解決了什么問(wèn)題
-
要存儲(chǔ)數(shù)據(jù),就要需要硬件(具體來(lái)說(shuō)是磁盤)。磁盤與其他任何硬件一樣,都受基礎(chǔ)結(jié)構(gòu)約束。這是第一個(gè)挑戰(zhàn)
-
第二個(gè)挑戰(zhàn)是,存儲(chǔ)接口。以前,每個(gè)基礎(chǔ)架構(gòu)都有自己的存儲(chǔ)解決方案和自己的接口,這使可移植性變得非常困難。
-
第三個(gè)挑戰(zhàn)是,現(xiàn)在的應(yīng)用為了受益于云的彈性,必須以自動(dòng)化方式配置存儲(chǔ)。
-
云原生存儲(chǔ)是針對(duì)這種新的云原生挑戰(zhàn)量身定制的
如何解決的
云原生存儲(chǔ)工具,可幫助
a)為容器提供云原生存儲(chǔ)選項(xiàng)
b)標(biāo)準(zhǔn)化容器與存儲(chǔ)提供者之間的接口
c)通過(guò)備份和還原操作提供數(shù)據(jù)保護(hù)
工具
- ceph
- nfs
- gfs
- s3
二、Flannel網(wǎng)絡(luò)插件
2.1K8S中Pod網(wǎng)絡(luò)通信
Pod 內(nèi)容器與容器之間的通信
在同一個(gè) Pod 內(nèi)的容器(Pod 內(nèi)的容器是不會(huì)跨宿主機(jī)的)共享同一個(gè)網(wǎng)絡(luò)命令空間,相當(dāng)于它們?cè)谕慌_(tái)機(jī)器上一樣,可以用
localhost 地址訪問(wèn)彼此的端口。
同一個(gè) Node 內(nèi) Pod 之間的通信
每個(gè) Pod 都有一個(gè)真實(shí)的全局 IP 地址,同一個(gè) Node 內(nèi)的不同 Pod 之間可以直接采用對(duì)方 Pod 的 IP 地址進(jìn)行通信,Pod1 與 Pod2 都是通過(guò) Veth 連接到同一個(gè) docker0 網(wǎng)橋,網(wǎng)段相同,所以它們之間可以直接通信
。
不同 Node 上 Pod 之間的通信
Pod 地址與 docker0 在同一網(wǎng)段,docker0 網(wǎng)段與宿主機(jī)網(wǎng)卡是兩個(gè)不同的網(wǎng)段,且不同 Node 之間的通信只能通過(guò)宿主機(jī)的物理網(wǎng)卡進(jìn)行。 要想實(shí)現(xiàn)不同 Node 上 Pod 之間的通信,就必須想辦法通過(guò)主機(jī)的物理網(wǎng)卡 IP 地址進(jìn)行尋址和通信。因此要滿足兩個(gè)條件:Pod 的 IP 不能沖突;將 Pod 的 IP 和所在的 Node 的 IP 關(guān)聯(lián)起來(lái),通過(guò)這個(gè)關(guān)聯(lián)讓不同 Node 上 Pod 之間直接通過(guò)內(nèi)網(wǎng) IP 地址通信。
2.2Overlay Network
疊加網(wǎng)絡(luò),在二層或者三層基礎(chǔ)網(wǎng)絡(luò)上疊加的一種虛擬網(wǎng)絡(luò)技術(shù)模式,該網(wǎng)絡(luò)中的主機(jī)通過(guò)虛擬鏈路隧道連接起來(lái)(類似于VPN)。
2.3VXLAN
將源數(shù)據(jù)包封裝到UDP中,并使用基礎(chǔ)網(wǎng)絡(luò)的IP/MAC作為外層報(bào)文頭進(jìn)行封裝,然后在以太網(wǎng)上傳輸,到達(dá)目的地后由隧道端點(diǎn)解封裝并將數(shù)據(jù)發(fā)送給目標(biāo)地址。
2.4Flannel
Flannel 的功能是讓集群中的不同節(jié)點(diǎn)主機(jī)創(chuàng)建的 Docker 容器都具有全集群唯一的虛擬 IP 地址。 Flannel 是
Overlay 網(wǎng)絡(luò)的一種,也是將 TCP 源數(shù)據(jù)包封裝在另一種網(wǎng)絡(luò)包里面進(jìn)行路由轉(zhuǎn)發(fā)和通信,目前支持 udp、vxlan、 host-GW 3種數(shù)據(jù)轉(zhuǎn)發(fā)方式。
三、Flannel udp 模式的工作原理
- 數(shù)據(jù)從 node01 上 Pod 的源容器中發(fā)出后,經(jīng)由所在主機(jī)的 docker0 虛擬網(wǎng)卡轉(zhuǎn)發(fā)到 flannel.1 虛擬網(wǎng)卡,flanneld 服務(wù)監(jiān)聽(tīng)在 flannel.1 虛擬網(wǎng)卡的另外一端。
- Flannel 通過(guò) Etcd 服務(wù)維護(hù)了一張節(jié)點(diǎn)間的路由表。源主機(jī) node01 的 flanneld 服務(wù)將原本的數(shù)據(jù)內(nèi)容封裝到 UDP 中后根據(jù)自己的路由表通過(guò)物理網(wǎng)卡投遞給目的節(jié)點(diǎn) node02 的 flanneld 服務(wù),數(shù)據(jù)到達(dá)以后被解包,然后直接進(jìn)入目的節(jié)點(diǎn)的 flannel.1 虛擬網(wǎng)卡,之后被轉(zhuǎn)發(fā)到目的主機(jī)的 docker0 虛擬網(wǎng)卡,最后就像本機(jī)容器通信一樣由 docker0 轉(zhuǎn)發(fā)到目標(biāo)容器。
3.1ETCD 之 Flannel 提供說(shuō)明
- 存儲(chǔ)管理Flannel可分配的IP地址段資源
- 監(jiān)控 ETCD 中每個(gè) Pod 的實(shí)際地址,并在內(nèi)存中建立維護(hù) Pod 節(jié)點(diǎn)路由表
- 由于 udp 模式是在用戶態(tài)做轉(zhuǎn)發(fā),會(huì)多一次報(bào)文隧道封裝,因此性能上會(huì)比在內(nèi)核態(tài)做轉(zhuǎn)發(fā)的 vxlan 模式差。
四、vxlan 模式
vxlan 是一種overlay(虛擬隧道通信)技術(shù),通過(guò)三層網(wǎng)絡(luò)搭建虛擬的二層網(wǎng)絡(luò),跟 udp 模式具體實(shí)現(xiàn)不太一樣:
- (1)udp模式是在用戶態(tài)實(shí)現(xiàn)的,數(shù)據(jù)會(huì)先經(jīng)過(guò)tun網(wǎng)卡,到應(yīng)用程序,應(yīng)用程序再做隧道封裝,再進(jìn)一次內(nèi)核協(xié)議棧,而vxlan是在內(nèi)核當(dāng)中實(shí)現(xiàn)的,只經(jīng)過(guò)一次協(xié)議棧,在協(xié)議棧內(nèi)就把vxlan包組裝好
- (2)udp模式的tun網(wǎng)卡是三層轉(zhuǎn)發(fā),使用tun是在物理網(wǎng)絡(luò)之上構(gòu)建三層網(wǎng)絡(luò),屬于ip in udp,vxlan模式是二層實(shí)現(xiàn), overlay是二層幀,屬于mac in udp
- (3)vxlan由于采用mac in udp的方式,所以實(shí)現(xiàn)起來(lái)會(huì)涉及mac地址學(xué)習(xí),arp廣播等二層知識(shí),udp模式主要關(guān)注路由
4.1Flannel vxlan 模式的工作原理
- vxlan在內(nèi)核當(dāng)中實(shí)現(xiàn),當(dāng)數(shù)據(jù)包使用vxlan設(shè)備發(fā)送數(shù)據(jù)時(shí),會(huì)打上vlxan的頭部信息,在發(fā)送出去,對(duì)端解包,flannel.1網(wǎng)卡把原始報(bào)文發(fā)送到目的服務(wù)器。
五、部署 flannel
5.1node01節(jié)點(diǎn)上操作
#上傳 cni-plugins-linux-amd64-v0.8.6.tgz 和 flannel.tar 到 /opt 目錄中
cd /opt/
docker load -i flannel.tar
mkdir /opt/cni/bin
tar zxvf cni-plugins-linux-amd64-v0.8.6.tgz -C /opt/cni/bin
5.2 在 master01 節(jié)點(diǎn)上操作
#上傳 kube-flannel.yml 文件到 /opt/k8s 目錄中,部署 CNI 網(wǎng)絡(luò)
cd /opt/k8s
kubectl apply -f kube-flannel.yml
kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
kube-flannel-ds-hjtc7 1/1 Running 0 7s
kubectl get nodes
NAME STATUS ROLES AGE VERSION
192.168.80.11 Ready <none> 81m v1.20.11
六、Calico
6.1K8s組網(wǎng)方案對(duì)比
flannel方案
需要在每個(gè)節(jié)點(diǎn)上把發(fā)向容器的數(shù)據(jù)包進(jìn)行封裝后,再用隧道將封裝后的數(shù)據(jù)包發(fā)送到運(yùn)行著目標(biāo)Pod的node節(jié)點(diǎn)上。目標(biāo)node節(jié)點(diǎn)再負(fù)責(zé)去掉封裝,將去除封裝的數(shù)據(jù)包發(fā)送到目標(biāo)Pod上。數(shù)據(jù)通信性能則大受影響。
calico方案
Calico不使用隧道或NAT來(lái)實(shí)現(xiàn)轉(zhuǎn)發(fā),而是把Host當(dāng)作Internet中的路由器,使用BGP同步路由,并使用iptables來(lái)做安全訪問(wèn)策略,完成跨Host轉(zhuǎn)發(fā)來(lái)。
6.2Calico 工作原理
Calico 是通過(guò)路由表來(lái)維護(hù)每個(gè) pod 的通信。Calico 的 CNI 插件會(huì)為每個(gè)容器設(shè)置一個(gè) veth pair 設(shè)備, 然后把另一端接入到宿主機(jī)網(wǎng)絡(luò)空間,由于沒(méi)有網(wǎng)橋,CNI 插件還需要在宿主機(jī)上為每個(gè)容器的 veth pair 設(shè)備配置一條路由規(guī)則,用于接收傳入的IP包。
有了這樣的 veth pair 設(shè)備以后,容器發(fā)出的IP包就會(huì)通過(guò) veth pair 設(shè)備到達(dá)宿主機(jī),然后宿主機(jī)根據(jù)路由規(guī)則的下一跳地址, 發(fā)送給正確的網(wǎng)關(guān),然后到達(dá)目標(biāo)宿主機(jī),再到達(dá)目標(biāo)容器。
這些路由規(guī)則都是 Felix 維護(hù)配置的,而路由信息則是 Calico BIRD 組件基于 BGP 分發(fā)而來(lái)。calico 實(shí)際上是將集群里所有的節(jié)點(diǎn)都當(dāng)做邊界路由器來(lái)處理,他們一起組成了一個(gè)全互聯(lián)的網(wǎng)絡(luò),彼此之間通過(guò) BGP 交換路由,這些節(jié)點(diǎn)我們叫做 BGP Peer。
目前比較常用的時(shí)flannel和calico,flannel的功能比較簡(jiǎn)單,不具備復(fù)雜的網(wǎng)絡(luò)策略配置能力,calico是比較出色的網(wǎng)絡(luò)管理插件,但具備復(fù)雜網(wǎng)絡(luò)配置能力的同時(shí),往往意味著本身的配置比較復(fù)雜,所以相對(duì)而言,比較小而簡(jiǎn)單的集群使用flannel,考慮到日后擴(kuò)容,未來(lái)網(wǎng)絡(luò)可能需要加入更多設(shè)備,配置更多網(wǎng)絡(luò)策略,則使用calico更好。
6.3部署 Calico
在 master01 節(jié)點(diǎn)上操作文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-688885.html
#上傳 calico.yaml 文件到 /opt/k8s 目錄中,部署 CNI 網(wǎng)絡(luò)
cd /opt/k8s
vim calico.yaml
#修改里面定義Pod網(wǎng)絡(luò)(CALICO_IPV4POOL_CIDR),與前面kube-controller-manager配置文件指定的cluster-cidr網(wǎng)段一樣
- name: CALICO_IPV4POOL_CIDR
value: "192.168.0.0/16"
kubectl apply -f calico.yaml
kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-659bd7879c-4h8vk 1/1 Running 0 58s
calico-node-nsm6b 1/1 Running 0 58s
calico-node-tdt8v 1/1 Running 0 58s
#等 Calico Pod 都 Running,節(jié)點(diǎn)也會(huì)準(zhǔn)備就緒
kubectl get nodes
node02 節(jié)點(diǎn)部署文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-688885.html
//在 node01 節(jié)點(diǎn)上操作
cd /opt/
scp kubelet.sh proxy.sh root@192.168.80.12:/opt/
scp -r /opt/cni root@192.168.80.12:/opt/
//在 node02 節(jié)點(diǎn)上操作
#啟動(dòng)kubelet服務(wù)
cd /opt/
chmod +x kubelet.sh
./kubelet.sh 192.168.80.12
//在 master01 節(jié)點(diǎn)上操作
kubectl get csr
NAME AGE SIGNERNAME REQUESTOR CONDITION
node-csr-BbqEh6LvhD4R6YdDUeEPthkb6T_CJDcpVsmdvnh81y0 10s kubernetes.io/kube-apiserver-client-kubelet kubelet-bootstrap Pending
node-csr-duiobEzQ0R93HsULoS9NT9JaQylMmid_nBF3Ei3NtFE 85m kubernetes.io/kube-apiserver-client-kubelet kubelet-bootstrap Approved,Issued
#通過(guò) CSR 請(qǐng)求
kubectl certificate approve node-csr-BbqEh6LvhD4R6YdDUeEPthkb6T_CJDcpVsmdvnh81y0
kubectl get csr
NAME AGE SIGNERNAME REQUESTOR CONDITION
node-csr-BbqEh6LvhD4R6YdDUeEPthkb6T_CJDcpVsmdvnh81y0 23s kubernetes.io/kube-apiserver-client-kubelet kubelet-bootstrap Approved,Issued
node-csr-duiobEzQ0R93HsULoS9NT9JaQylMmid_nBF3Ei3NtFE 85m kubernetes.io/kube-apiserver-client-kubelet kubelet-bootstrap Approved,Issued
#加載 ipvs 模塊
for i in $(ls /usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o "^[^.]*");do echo $i; /sbin/modinfo -F filename $i >/dev/null 2>&1 && /sbin/modprobe $i;done
#使用proxy.sh腳本啟動(dòng)proxy服務(wù)
cd /opt/
chmod +x proxy.sh
./proxy.sh 192.168.80.12
#查看群集中的節(jié)點(diǎn)狀態(tài)
kubectl get nodes
到了這里,關(guān)于【云原生】K8S二進(jìn)制搭建二:部署CNI網(wǎng)絡(luò)組件的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!