0.前言
參考文檔:https://github.com/containernetworking/cni
Pod網(wǎng)絡(luò)插件,為了實現(xiàn)Pod網(wǎng)絡(luò)而需要的插件、組件。由于Kubernetes通過開放的CNI接口來允許插件的接入,所以它又稱之為CNI網(wǎng)絡(luò)插件。
為了解決跨主機容器間通信問題,市面上存在很多解決方案,為了兼容和規(guī)范這些解決方案,Kubernetes僅設(shè)計了網(wǎng)絡(luò)模型,卻將Pod網(wǎng)絡(luò)的實現(xiàn)交給了CNI網(wǎng)絡(luò)插件,并允許網(wǎng)絡(luò)插件通過標(biāo)準(zhǔn)的CNI(Container Network Interface,容器網(wǎng)絡(luò)接口)連接到容器管理系統(tǒng)。
CNI網(wǎng)絡(luò)插件主要解決的就是容器跨主機通信問題而存在的,并使跨主機間運行的Pod位于同一個網(wǎng)絡(luò)平面,其大致解決步驟通常有兩步:分配設(shè)置自定義容器網(wǎng)絡(luò)(PodIP在集群中全局唯一性)和實現(xiàn)容器網(wǎng)絡(luò)通信(處理方法通常有路由、覆蓋網(wǎng)絡(luò){Vxlan、IPIP}等等)。
每個Pod都會創(chuàng)建一個名叫“pause”的根容器,其他運行的業(yè)務(wù)容器都是復(fù)制該容器的網(wǎng)絡(luò),這個容器就是Kubernetes為了自定義網(wǎng)絡(luò)等特殊功能而存在的。
CNI網(wǎng)絡(luò)插件分為以下四種:
MAIN,主要的,創(chuàng)建接口,主要網(wǎng)絡(luò)的實現(xiàn)。如:bridge、ipvlan、loopback、macvlan、ptp、vlan、host-device。
Windows,特用于Windows的MAIN插件。如:win-bridge、win-overlay。
IPAM,僅提供IP地址分配功能。如:dhcp、host-local、static。
META,其他插件,通過調(diào)用第三方插件來實現(xiàn)網(wǎng)絡(luò)功能。如:tuning、portmap、bandwidth、sbr、firewall、flannel。
光單獨靠一種CNI網(wǎng)絡(luò)插件是無法實現(xiàn)完整的Pod網(wǎng)絡(luò)通信和更高級的網(wǎng)絡(luò)策略功能的,第三方組織可以靈活的組合這些CNI插件實現(xiàn)基本Pod網(wǎng)絡(luò)功能和更高級功能,所以市面上流行出來很多解決方案。
在現(xiàn)今,比較常用的流行的Pod網(wǎng)絡(luò)解決方案有Flannel和Calico(支持網(wǎng)絡(luò)策略功能)、Canal(由Flannel實現(xiàn)網(wǎng)絡(luò)通信+Calico提供網(wǎng)絡(luò)策略)。
1.Calico概述
參考文檔:https://projectcalico.docs.tigera.io/
Calico是一款廣泛采用、久經(jīng)考驗的開源網(wǎng)絡(luò)和網(wǎng)絡(luò)安全解決方案,適用于Kubernetes、虛擬機和裸機工作負載。與Flannel對比,Calico除了支持基本網(wǎng)絡(luò)功能的實現(xiàn)之外,它還支持全套Kubernetes網(wǎng)絡(luò)策略功能,以及在其之上擴展網(wǎng)絡(luò)策略。
1.1.Calico組件
Calico主要由以下組件組成:
1.1.1.CNI Plugin
CNI網(wǎng)絡(luò)插件,Calico通過CNI網(wǎng)絡(luò)插件與kubelet關(guān)聯(lián),從而實現(xiàn)Pod網(wǎng)絡(luò)。
1.1.2.Calico Node
Calico節(jié)點代理是運行在每個節(jié)點上的代理程序,負責(zé)管理節(jié)點路由信息、策略規(guī)則和創(chuàng)建Calico虛擬網(wǎng)絡(luò)設(shè)備。
Calico Node主要由以下子模塊程序組成:
Felix,Calico代理程序。運行在每個節(jié)點上的守護進程,它主要負責(zé)管理節(jié)點上網(wǎng)絡(luò)接口、為節(jié)點創(chuàng)建路由信息和ACL規(guī)則、以及報告當(dāng)前節(jié)點網(wǎng)絡(luò)的健康狀態(tài)給控制器等工作。
BIRD-BGP客戶端,BIRD是一個項目的簡稱,全稱為BIRD Internet Routing Daemon,BIRD是一個類UNIX系統(tǒng)下旨在開發(fā)一個功能齊全的IP路由守護進程,它是一個路由軟件,可以實現(xiàn)多種路由協(xié)議,如BGP、OSPF、RIP等。在Calico中,BIRD是一個BGP客戶端,用于使用BGP協(xié)議廣播給其他主機動態(tài)的學(xué)習(xí)路由規(guī)則。更多了解BIRD可參考:https://bird.network.cz/。
BIRD-Route Reflector(可擴展的組件),BGP客戶端在每個節(jié)點上運行,其隨著節(jié)點數(shù)量越來越多,一個BGP客戶端需要連接更多數(shù)量的其他BGP客戶端,其網(wǎng)絡(luò)連接的數(shù)量非常多且網(wǎng)絡(luò)會變得復(fù)雜。在節(jié)點之外,允許將BIRD程序配置成“Route Reflector”路由反射器工作方式,BGP客戶端可以直接連接到“Route Reflector”路由反射器,而不是很多數(shù)量的其他BGP客戶端,從而減少網(wǎng)絡(luò)連接的數(shù)量,以提高BGP網(wǎng)絡(luò)的性能。
1.1.3.Calico Controller
Calico網(wǎng)絡(luò)策略控制器。允許創(chuàng)建“NetworkPolicy”資源對象,并根據(jù)資源對象里面對網(wǎng)絡(luò)策略定義,在對應(yīng)節(jié)點主機上創(chuàng)建針對于Pod流出或流入流量的IPtables規(guī)則。
1.1.4.Calico Typha(可選的擴展組件)
Typha是Calico的一個擴展組件,用于Calico通過Typha直接與Etcd通信,而不是通過kube-apiserver。通常當(dāng)K8S的規(guī)模超過50個節(jié)點的時候推薦啟用它,以降低kube-apiserver的負載。每個Pod/calico-typha可承載100~200個Calico節(jié)點的連接請求,最多不要超過200個。
1.2.Calico網(wǎng)絡(luò)實現(xiàn)
Calico支持兩種類型網(wǎng)絡(luò)工作模式(后端機制):
如果物理主機在同一2層網(wǎng)絡(luò)中,則建議采用使用BGP動態(tài)路由通信方式;如果物理主機是跨子網(wǎng)通信的話,可能由于到達目標(biāo)主機的跳數(shù)太多導(dǎo)致性能下降,所以建議使用覆蓋網(wǎng)絡(luò)模式。
1.2.1.動態(tài)路由模式(dynamic routing)
采用BGP動態(tài)路由協(xié)議自動學(xué)習(xí)來自其他AS自治系統(tǒng)上的路由條目,即其他節(jié)點主機上的路由條目。
類似于Flannel的Host-GW模式,不過它沒有不能跨子網(wǎng)的限制。
想要更多了解BGP動態(tài)路由技術(shù),可以參考其他網(wǎng)絡(luò)資料,這里就不過多的闡述了。
1.2.2.覆蓋網(wǎng)絡(luò)模式(overlay network)
采用IPIP或VXLAN協(xié)議封裝底層網(wǎng)絡(luò),然后通過上層物理覆蓋網(wǎng)絡(luò)通信。
將底層的Pod網(wǎng)絡(luò)源目IP+數(shù)據(jù)封裝到上層物理網(wǎng)絡(luò)源目IP的數(shù)據(jù)包中,由同一個網(wǎng)絡(luò)的物理主機通過直連路由完成數(shù)據(jù)包的傳輸和解封裝,以實現(xiàn)底層Pod網(wǎng)絡(luò)通信。
Calico對于覆蓋網(wǎng)絡(luò)的工作模式有:
IPIP,使用IPIP封裝協(xié)議。當(dāng)IPIP啟用的時候不允許啟用VXLAN。
VXLAN,使用VXLAN封裝協(xié)議。當(dāng)VXLAN啟用的時候不允許啟用IPIP。
IPIPCrossSubnet,當(dāng)物理主機是跨子網(wǎng)的情況下才使用IPIP覆蓋網(wǎng)絡(luò)通信方式,正常情況下使用BGP路由模式。
VXLANCrossSubnet,當(dāng)物理主機是跨子網(wǎng)的情況下才使用VXLAN覆蓋網(wǎng)絡(luò)通信方式,正常情況下使用BGP路由模式。
None,不使用IPIP或VXLAN覆蓋網(wǎng)絡(luò)模式。
IPIP比VxLAN的數(shù)據(jù)包頭更小,但安全性較差。
虛接口:IPIP默認創(chuàng)建的三層虛接口通常叫“tunl0”,而VXLAN默認創(chuàng)建的三層虛接口叫“vxlan.calico”。三層虛接口通常負責(zé)數(shù)據(jù)包的封裝和解封裝工作。
1.3.了解Calico對CIDR子網(wǎng)的劃分(blockSize)
CIDR,Classless Inter-Domain Routing,無類別域間路由,在Kubernetes中指基于CIDR的網(wǎng)絡(luò)劃分方案,為Pod分配的子網(wǎng)范圍(如:10.244.0.0/12)。
通常默認情況下,PodIP地址范圍(--pod-network-cidr)為10.244.0.0/16,它擁有16^2=256*256=65536個地址(包括網(wǎng)絡(luò)地址+廣播地址)可拆分成獨立子網(wǎng)。
Calico為每個節(jié)點都會創(chuàng)建一個獨立子網(wǎng),即從CIDR大的地址池中劃分較小范圍的地址池給到每個節(jié)點。
Calico可以通過修改配置blockSize塊大小來設(shè)置每個節(jié)點分配的獨立子網(wǎng)的范圍池大小。這邊默認值IPV4=26,IPV6=122。
二進制掩碼26(11111111 11111111 11111111 11000000)轉(zhuǎn)換成十進制掩碼即=255.255.255.192,即每個節(jié)點的子網(wǎng)可以有64個IP地址,減去廣播地址和網(wǎng)絡(luò)地址,可為Pod分配的有效IP地址有62個。
1.4.Calico網(wǎng)絡(luò)策略
Calico使用IPtables實現(xiàn)網(wǎng)絡(luò)策略功能,在Kubernetes中可以創(chuàng)建“NetworkPolicy”資源對象傳給Calico的控制器,由Calico Node根據(jù)NetworkPolicy定義的規(guī)則在相關(guān)節(jié)點上創(chuàng)建對應(yīng)的IPtables規(guī)則,以實現(xiàn)對Pod出入口網(wǎng)絡(luò)流量的安全策略限制。
2.安裝Calico
Calico有兩種安裝方式:
使用calico.yaml清單文件安裝
使用Tigera Calico Operator安裝Calico(官方最新指導(dǎo))
Tigera Calico Operator,Calico操作員是一款用于管理Calico安裝、升級的管理工具,它用于管理Calico的安裝生命周期。從Calico-v3.15版本官方開始使用此工具。
Calico安裝要求:
x86-64, arm64, ppc64le, or s390x processor
2個CPU
2GB運行內(nèi)存
10GB硬盤空間
RedHat Enterprise Linux 7.x+, CentOS 7.x+, Ubuntu 16.04+, or Debian 9.x+
確保Calico可以管理主機上的cali和tunl接口。
2.1.使用calico.yaml清單文件安裝Calico
參考文檔:https://projectcalico.docs.tigera.io/archive/v3.14/getting-started/kubernetes/quickstart
當(dāng)前主機環(huán)境:
主機系統(tǒng):CentOS Linux release 7.6.1810 (Core)
Kubernetes版本:v1.23.0
Calico版本:v3.23.0
其他提示:默認的calico.yaml清單文件無需手動配置Pod子網(wǎng)范圍(如果需要,可通過CALICO_IPV4POOL_CIDR指定),默認使用kube-controller-manager的“--cluster-cidr”啟動項的值,即kubeadm init時指定的“--pod-network-cidr”或清單文件中使用“podSubnet”的值。
1、配置Docker鏡像加速
鏡像加速由阿里云“容器加速器”提供。
由于安裝清單中所使用的鏡像來源于國外站點,所以需要配置為國內(nèi)鏡像源才能正常下載鏡像到國內(nèi)主機。
創(chuàng)建配置文件“/etc/docker/daemon.json”,并寫入以下內(nèi)容:
[root@localhost ~]# mkdir -p /etc/docker
[root@localhost ~]# cat /etc/docker/daemon.json 《《EOF
{
“registry-mirrors”: [
“https://7mimmp7p.mirror.aliyuncs.com”,
“https://registry.docker-cn.com”,
“http://hub-mirror.c.163.com”,
“https://docker.mirrors.ustc.edu.cn”
],
“exec-opts”: [“native.cgroupdriver=systemd”],
“l(fā)og-driver”: “json-file”,
“l(fā)og-opts”: {
“max-size”: “100m”
},
“storage-driver”: “overlay2”,
“storage-opts”: [
“overlay2.override_kernel_check=true”
]
}
EOF
重啟docker服務(wù)即可:
[root@localhost ~]# sudo systemctl daemon-reload
[root@localhost ~]# sudo systemctl restart docker
2、配置NetworkManager
如果主機系統(tǒng)使用NetworkManager來管理網(wǎng)絡(luò)的話,則需要配置NetworkManager,以允許Calico管理接口。
NetworkManger操作默認網(wǎng)絡(luò)命名空間接口的路由表,這可能會干擾Calico代理正確路由的能力。
在所有主機上操作:
[root@k8s-master01 ~]# cat 》 /etc/NetworkManager/conf.d/calico.conf 《《EOF
[keyfile]
unmanaged-devices=interface-name:cali*;interface-name:tunl*;interface-name:vxlan.calico;interface-name:wireguard.cali
EOF
3、下載calico.yaml
[root@k8s-master01 ~]# wget https://docs.projectcalico.org/v3.23/manifests/calico.yaml --no-check-certificate
4、修改calico.yaml
由于默認的Calico清單文件中所使用的鏡像來源于docker.io國外鏡像源,上面我們配置了Docker鏡像加速,應(yīng)刪除docker.io前綴以使鏡像從國內(nèi)鏡像加速站點下載。
[root@k8s-master01 ~]# cat calico.yaml |grep ‘image:’
image: docker.io/calico/cni:v3.23.0
image: docker.io/calico/cni:v3.23.0
image: docker.io/calico/node:v3.23.0
image: docker.io/calico/kube-controllers:v3.23.0
[root@k8s-master01 ~]# sed -i ‘s#docker.io/##g’ calico.yaml
[root@k8s-master01 ~]# cat calico.yaml |grep ‘image:’
image: calico/cni:v3.23.0
image: calico/cni:v3.23.0
image: calico/node:v3.23.0
image: calico/kube-controllers:v3.23.0
5、應(yīng)用calico.yaml
[root@k8s-master01 ~]# kubectl apply -f calico.yaml
Pod-Calico在“kube-system”名稱空間下創(chuàng)建并運行起來:
[root@k8s-master01 ~]# kubectl get pod -n kube-system |grep calico
calico-kube-controllers-77d9858799-c267f 1/1 Running 0 92s
calico-node-6jw5q 1/1 Running 0 92s
calico-node-krrn6 1/1 Running 0 92s
calico-node-mgk2g 1/1 Running 0 92s
calico-node-wr2pv 1/1 Running 0 92s
2.2.使用Tigera Calico Operator安裝Calico
這種是官方文檔最新指導(dǎo)的安裝方式。
Tigera Calico Operator通常會安裝最新版本的Calico版本,并使用最新的功能。
1、配置NetworkManager
如果主機系統(tǒng)使用NetworkManager來管理網(wǎng)絡(luò)的話,則需要配置NetworkManager,以允許Calico管理接口。
NetworkManger操作默認網(wǎng)絡(luò)命名空間接口的路由表,這可能會干擾Calico代理正確路由的能力。
在所有主機上操作:
[root@k8s-master01 ~]# cat 》 /etc/NetworkManager/conf.d/calico.conf 《《EOF
[keyfile]
unmanaged-devices=interface-name:cali*;interface-name:tunl*;interface-name:vxlan.calico;interface-name:wireguard.cali
EOF
2、使用tigera-operator.yaml清單文件安裝Tigera Calico operator
參考文檔:https://github.com/tigera/operator
tigera-operator.yaml清單文件用于安裝Tigera Calico operator。
operator的鏡像來源于quay.io。
[root@k8s-master01 ~]# wget https://projectcalico.docs.tigera.io/manifests/tigera-operator.yaml -O calico-tigera-operator.yaml --no-check-certificate
[root@k8s-master01 ~]# cat calico-tigera-operator.yaml |grep ‘image:’
image: quay.io/tigera/operator:v1.27.0
[root@k8s-master01 ~]# kubectl apply -f calico-tigera-operator.yaml
[root@k8s-master01 ~]# kubectl get pod -n tigera-operator -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
tigera-operator-566769dc67-mrnhs 1/1 Running 0 5m39s 192.168.124.132 k8s-node01 《none》 《none》
3、下載并配置custom-resources.yaml清單文件
custom-resources.yaml用于自定義通過Tigera Calico operator安裝和配置Calico,它會創(chuàng)建由operator實現(xiàn)的Installation資源對象。
在自定義Calico之前可以通過“https://projectcalico.docs.tigera.io/reference/installation/api#operator.tigera.io/v1.Installation”先了解安裝配置。
注:這邊需要修改一下Pod分配子網(wǎng)范圍(CIDR),該地址需要與kubeadm初始化集群時的“podSubnet”字段或“--pod-network-cidr”參數(shù)中填寫的值相同。
[root@k8s-master01 ~]# wget https://projectcalico.docs.tigera.io/manifests/custom-resources.yaml -O calico-custom-resources.yaml --no-check-certificate
[root@k8s-master01 ~]# vim calico-custom-resources.yaml
apiVersion: operator.tigera.io/v1
kind: Installation
metadata:
name: default
spec:
# Configures Calico networking.
calicoNetwork:
# Note: The ipPools section cannot be modified post-install.
ipPools:
- blockSize: 26
cidr: 10.244.0.0/16
encapsulation: VXLANCrossSubnet
natOutgoing: Enabled
nodeSelector: all()
4、應(yīng)用custom-resources.yaml清單文件
[root@k8s-master01 ~]# kubectl apply -f calico-custom-resources.yaml
5、查看Calico是否運行
Tigera Calico Operator會自動創(chuàng)建一個名叫“calico-system”的名稱空間來運行Calico。
[root@k8s-master01 ~]# kubectl get namespace
NAME STATUS AGE
calico-system Active 3m10s
default Active 5m55s
kube-node-lease Active 5m57s
kube-public Active 5m57s
kube-system Active 5m57s
tigera-operator Active 3m20s
[root@k8s-master01 ~]# kubectl get pod -n calico-system
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-7dfc6fb85-ktww2 0/1 Pending 0 8m33s
calico-node-2t4dp 0/1 Init:ImagePullBackOff 0 8m34s
calico-node-mmflx 0/1 Init:ImagePullBackOff 0 8m34s
calico-node-r94tt 0/1 Init:ImagePullBackOff 0 8m34s
calico-node-w7plh 0/1 Init:ImagePullBackOff 0 7m36s
calico-typha-5fb57458cc-g89qp 0/1 ImagePullBackOff 0 8m34s
calico-typha-5fb57458cc-t5xcm 0/1 ImagePullBackOff 0 8m28s
[root@k8s-master01 ~]# kubectl describe pod calico-kube-controllers-7dfc6fb85-ktww2 -n calico-system
Normal BackOff 69s (x2 over 3m41s) kubelet Back-off pulling image “docker.io/calico/pod2daemon-flexvol:v3.23.0”
Warning Failed 69s (x2 over 3m41s) kubelet Error: ImagePullBackOff
可以看到所有Calico相關(guān)的Pod由于在國內(nèi)環(huán)境下都無法正常下載由docker.io提供的鏡像:
[root@k8s-master01 ~]# kubectl describe pod -n calico-system |grep ‘Events’ -A 10 |grep -Eo ‘“docker.io/calico/.*”’ |sort |uniq
“docker.io/calico/cni:v3.23.0”
“docker.io/calico/kube-controllers:v3.23.0”
“docker.io/calico/node:v3.23.0”
“docker.io/calico/pod2daemon-flexvol:v3.23.0”
“docker.io/calico/typha:v3.23.0”
嘗試手動從quay.io下載鏡像。quay.io是一個公共鏡像倉庫。
所有主機上操作:
[root@k8s-master01 ~]# docker pull quay.io/calico/cni:v3.23.0
[root@k8s-master01 ~]# docker pull quay.io/calico/kube-controllers:v3.23.0
[root@k8s-master01 ~]# docker pull quay.io/calico/node:v3.23.0
[root@k8s-master01 ~]# docker pull quay.io/calico/pod2daemon-flexvol:v3.23.0
[root@k8s-master01 ~]# docker pull quay.io/calico/typha:v3.23.0
這個時候發(fā)現(xiàn)Calico相關(guān)Pod都已正常運行了:
[root@k8s-master01 ~]# kubectl get pod -n calico-system
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-7dfc6fb85-vbn6q 1/1 Running 0 64m
calico-node-29h89 1/1 Running 0 64m
calico-node-9c54r 1/1 Running 1 (10m ago) 64m
calico-node-ntzvt 1/1 Running 0 64m
calico-node-s5bz9 1/1 Running 0 64m
calico-typha-5dd57768f4-79clk 1/1 Running 1 (10m ago) 27m
calico-typha-5dd57768f4-dk9ph 1/1 Running 0 64m
3.Calico清單詳解-calico.yaml(使用calico.yaml清單文件安裝Calico安裝方式必讀)
參考文檔:https://docs.projectcalico.org/archive/v3.14/getting-started/kubernetes/installation/config-options#other-configuration-options
calico.yaml清單文件主要用于運行calico-node和calico-kube-controllers服務(wù),其清單安裝以下Kubernetes資源:
使用DaemonSet在每個主機上安裝calico/node容器;
使用DaemonSet在每個主機上安裝Calico CNI二進制文件和網(wǎng)絡(luò)配置;
使用Deployment運行calico/kube-controller;
Secert/calico-etcd-secrets提供可選的Calico連接到etcd的TLS密鑰信息;
ConfigMap/calico-config提供安裝Calico時的配置參數(shù)。
在calico.yaml清單文件中,Calico默認的工作模式是IPIP。
在安裝Calico之前配置Calico通常有以下項:
3.1.配置PodIP范圍(PodCIDR)
要更改用于Pod的默認IP范圍,請修改calico.yaml清單文件中“CALICO_IPV4POOL_CIDR”部分。
kind: DaemonSet
apiVersion: apps/v1
metadata:
name: calico-node
namespace: kube-system
labels:
k8s-app: calico-node
spec:
template:
spec:
containers:
- name: calico-node
image: calico/node:v3.14.2
env:
。..
# - name: CALICO_IPV4POOL_CIDR
# value: “192.168.0.0/16”
。..
CALICO_IPV4POOL_CIDR
設(shè)置PodIP范圍。
此項用于設(shè)置安裝Calico時要創(chuàng)建的默認IPv4池,PodIP將從該范圍中選擇。
Calico安裝完成后修改此值將再無效。
默認情況下calico.yaml中“CALICO_IPV4POOL_CIDR”是注釋的,如果kube-controller-manager的“--cluster-cidr”不存在任何值的話,則通常取默認值“192.168.0.0/16,172.16.0.0/16,。.,172.31.0.0/16”。
當(dāng)使用kubeadm時,PodIP的范圍應(yīng)該與kubeadm init的清單文件中的“podSubnet”字段或者“--pod-network-cidr”選項填寫的值相同。
3.2.配置IPIP(默認)
默認情況下,清單啟用跨子網(wǎng)所使用的封裝協(xié)議是IPIP。
當(dāng)集群的節(jié)點都處于同一個2層網(wǎng)絡(luò)中時,我們期望修改Calico的工作模式為BGP或其他時,可以設(shè)置“CALICO_IPV4POOL_IPIP”的“value: Never”以禁用IPIP。默認IPIP是啟用的“value: Always”。
kind: DaemonSet
apiVersion: apps/v1
metadata:
name: calico-node
namespace: kube-system
labels:
k8s-app: calico-node
spec:
template:
spec:
containers:
- name: calico-node
image: calico/node:v3.14.2
env:
。..
# Enable IPIP
- name: CALICO_IPV4POOL_IPIP
value: “Always”
。..
CALICO_IPV4POOL_IPIP
設(shè)置Calico覆蓋網(wǎng)絡(luò)IPV4池所要使用的封裝協(xié)議為IPIP。
可設(shè)置的值:
Always,永久啟用。
CrossSubnet,當(dāng)物理主機是跨子網(wǎng)通信的話才啟用,如果物理主機在同一2層網(wǎng)絡(luò)中則使用BGP動態(tài)路由通信方式。
Never,從不啟用,即禁用。
如果該項的值設(shè)置為“Never”以外的值,則不應(yīng)設(shè)置“CALICO_IPV4POOL_VXLAN”。
Calico覆蓋網(wǎng)絡(luò)支持IPIP、VXLAN兩種協(xié)議,僅能啟用其中一種。
VXLAN協(xié)議禁止啟用由“CALICO_IPV4POOL_VXLAN”項控制。
3.3.切換IPIP為VXLAN
默認情況下,Calico清單啟用IPIP封裝。如果你期望Calico使用VXLAN封裝模式,則需要在安裝時候做以下操作:
1、將“CALICO_IPV4POOL_IPIP ”設(shè)置為“Never”,將“CALICO_IPV4POOL_VXLAN”設(shè)置為“Always”。
kind: DaemonSet
apiVersion: apps/v1
metadata:
name: calico-node
namespace: kube-system
labels:
k8s-app: calico-node
spec:
template:
spec:
containers:
- name: calico-node
image: calico/node:v3.14.2
env:
。..
# Enable IPIP
- name: CALICO_IPV4POOL_IPIP
value: “Never”
- name: CALICO_IPV4POOL_VXLAN
value: “Always”
。..
2、如果你只想集群僅使用基于VXLAN協(xié)議的覆蓋網(wǎng)絡(luò)模式,用不到BGP動態(tài)路由模式的話,即為了節(jié)省一點資源,可以選擇完全禁用Calico基于BGP的網(wǎng)絡(luò):
將“calico_backend: ”bird“”修改為“calico_backend: ”vxlan“”,這將禁用BIRD。
從calico/node的readiness/liveness檢查中去掉“- -bird-ready”和“- -bird-live”。
livenessProbe:
exec:
command:
- /bin/calico-node
- -felix-live
# - -bird-live
readinessProbe:
exec:
command:
- /bin/calico-node
# - -bird-ready
- -felix-ready
CALICO_IPV4POOL_VXLAN
設(shè)置Calico覆蓋網(wǎng)絡(luò)IPV4池所要使用的封裝協(xié)議為VXLAN。
可設(shè)置的值:
Always,永久啟用。
CrossSubnet,當(dāng)物理主機是跨子網(wǎng)通信的話才啟用,如果物理主機在同一2層網(wǎng)絡(luò)中則使用BGP動態(tài)路由通信方式。
Never,從不啟用,即禁用。
如果該項的值設(shè)置為“Never”以外的值,則不應(yīng)設(shè)置“CALICO_IPV4POOL_VXLAN”。
Calico覆蓋網(wǎng)絡(luò)支持IPIP、VXLAN兩種協(xié)議,僅能啟用其中一種。
VXLAN協(xié)議禁止啟用由“CALICO_IPV4POOL_VXLAN”項控制。
3.4.其他配置項
在清單文件的開始有ConfigMap描述Calico的配置內(nèi)容,其重要的配置項解讀如下:
kind: ConfigMap
apiVersion: v1
metadata:
name: calico-config
namespace: kube-system
data:
typha_service_name: “none”
calico_backend: “bird”
veth_mtu: “1440”
cni_network_config: |-
{
“name”: “k8s-pod-network”,
“cniVersion”: “0.3.1”,
“plugins”: [
{
“type”: “calico”,
“l(fā)og_level”: “info”,
“datastore_type”: “kubernetes”,
“nodename”: “__KUBERNETES_NODE_NAME__”,
“mtu”: __CNI_MTU__,
“ipam”: {
“type”: “calico-ipam”
},
“policy”: {
“type”: “k8s”
},
“kubernetes”: {
“kubeconfig”: “__KUBECONFIG_FILEPATH__”
}
},
{
“type”: “portmap”,
“snat”: true,
“capabilities”: {“portMappings”: true}
},
{
“type”: “bandwidth”,
“capabilities”: {“bandwidth”: true}
}
]
}
typha_service_name: “none”
Typha是Calico的一個擴展組件,用于Calico通過Typha直接與Etcd通信,而不是通過kube-apiserver。通常當(dāng)K8S的規(guī)模超過50個節(jié)點的時候推薦啟用它,以降低kube-apiserver的負載。
支持值:
none,關(guān)閉Typha功能。
calico_typha,啟用Typha功能。
calico_backend: “bird”
設(shè)置Calico使用的后端機制。支持值:
bird,開啟BIRD功能,根據(jù)Calico-Node的配置來決定主機的網(wǎng)絡(luò)實現(xiàn)是采用BGP路由模式還是IPIP、VXLAN覆蓋網(wǎng)絡(luò)模式。
vxlan,純VXLAN模式,僅能夠使用VXLAN協(xié)議的覆蓋網(wǎng)絡(luò)模式。
veth_mtu: “0”
設(shè)置虛擬接口“calicoxxxxx”的MTU值,默認情況下MTU是自動檢測的,不需要顯示的設(shè)置此字段。
可以通過提供一個非零值來設(shè)置它。
MTU,Maximum Transmission Unit,最大傳輸單元,網(wǎng)絡(luò)設(shè)備一次發(fā)送數(shù)據(jù)包大小,單位為Byte,MTU值約小則傳輸速率約高,此值應(yīng)由系統(tǒng)設(shè)置的最合理的值,通常不需要我們手動設(shè)置,最大值為1500。
cni_network_config:
在每個節(jié)點上都要安裝的CNI網(wǎng)絡(luò)插件配置。保持默認就好。
4.Calico清單詳解-custom-resources.yaml(使用Tigera Calico Operator安裝Calico安裝方式必讀)
custom-resources.yaml清單文件通過Tigera Calico Operator安裝Calico的自定義清單文件。
在安裝Calico之前,我們可以通過修改該清單的內(nèi)容自定義配置Calico。
參考文檔:https://projectcalico.docs.tigera.io/reference/installation/api
# This section includes base Calico installation configuration.
# For more information, see: https://projectcalico.docs.tigera.io/v3.23/reference/installation/api#operator.tigera.io/v1.Installation
apiVersion: operator.tigera.io/v1
kind: Installation
metadata:
name: default
spec:
# Configures Calico networking.
calicoNetwork:
# Note: The ipPools section cannot be modified post-install.
ipPools:
- blockSize: 26
cidr: 10.244.0.0/16
encapsulation: VXLANCrossSubnet
natOutgoing: Enabled
nodeSelector: all()
---
# This section configures the Calico API server.
# For more information, see: https://projectcalico.docs.tigera.io/v3.23/reference/installation/api#operator.tigera.io/v1.APIServer
apiVersion: operator.tigera.io/v1
kind: APIServer
metadata:
name: default
spec: {}
spec.calicoNetwork
配置Calico網(wǎng)絡(luò)。
spec.calicoNetwork.bgp
開啟或禁用BGP路由功能。支持值:Enabled, Disabled。
spec.calicoNetwork.ipPools
IPPool,為由節(jié)點篩選器指定節(jié)點上創(chuàng)建Pod分配的單個或多個地址池,以及要使用的Pod網(wǎng)絡(luò)的實現(xiàn)方法。
spec.calicoNetwork.ipPools.blockSize(int32)
塊大小,子網(wǎng)劃分技術(shù),指從CIDR(如:10.244.0.0/16)里面為每個節(jié)點拆分一個獨立的子網(wǎng)塊范圍大?。ㄈ纾?0.244.32.128/26)。默認IPV4=26,IPV6=122。二進制掩碼26轉(zhuǎn)換成十進制掩碼即=255.255.255.192,即每個節(jié)點的子網(wǎng)可以有64個IP地址,減去廣播地址和網(wǎng)絡(luò)地址,可為Pod分配的有效IP地址有62個。
spec.calicoNetwork.ipPools.cidr(string)
Pod網(wǎng)絡(luò)IP范圍。
spec.calicoNetwork.ipPools.encapsulation
設(shè)置Pod網(wǎng)絡(luò)要使用的封裝協(xié)議類型,支持:
IPIP,使用IPIP封裝協(xié)議。
VXLAN,使用VXLAN封裝協(xié)議。
IPIPCrossSubnet,當(dāng)物理主機是跨子網(wǎng)的情況下才使用IPIP覆蓋網(wǎng)絡(luò)通信方式,正常情況下使用BGP路由模式。
VXLANCrossSubnet,當(dāng)物理主機是跨子網(wǎng)的情況下才使用VXLAN覆蓋網(wǎng)絡(luò)通信方式,正常情況下使用BGP路由模式。
None,不使用IPIP或VXLAN封裝。
spec.calicoNetwork.ipPools.natOutgoing
NAT傳出,對傳出的流量啟用或禁用NAT功能。支持值:Enabled, Disabled。
spec.calicoNetwork.ipPools.nodeSelector(string)
節(jié)點選擇器,使用它選擇該IPPool池會影響那些節(jié)點的Pod。默認值為“all()”,保持默認就好。
5.完全卸載Calico網(wǎng)絡(luò)插件
1、刪除安裝清單中的所有資源對象
任一臺Master上操作:
[root@k8s-master01 ~]# kubectl delete -f calico.yaml
2、刪除tunl0虛擬網(wǎng)卡
如果使用了IPIP覆蓋網(wǎng)絡(luò)模式,則Calico會在每臺主機上創(chuàng)建一塊名叫tunl0的虛擬網(wǎng)卡設(shè)備。
在所有主機上操作:
[root@k8s-master01 ~]# modprobe -r ipip
3、刪除Calico相關(guān)CNI配置文件
在所有主機上操作:
[root@k8s-master01 ~]# rm -rf /var/lib/cni/ && rm -rf /etc/cni/net.d/*
4、重啟kubelet服務(wù)
在所有主機上操作:
[root@k8s-master01 ~]# systemctl restart kubelet
-
網(wǎng)絡(luò)
+關(guān)注
關(guān)注
14文章
7597瀏覽量
89196 -
插件
+關(guān)注
關(guān)注
0文章
335瀏覽量
22484
原文標(biāo)題:5.完全卸載Calico網(wǎng)絡(luò)插件
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論