一、確定最佳的網(wǎng)絡(luò)選項(xiàng)
Calico支持多個(gè)容器網(wǎng)絡(luò)選項(xiàng),用于可伸縮性、網(wǎng)絡(luò)性能和與現(xiàn)有基礎(chǔ)設(shè)施的互操作性。
1. 值
不同的網(wǎng)絡(luò)實(shí)現(xiàn)更適合不同的環(huán)境。Calico提供了幾種不需要封裝的基于IP路由的網(wǎng)絡(luò)實(shí)現(xiàn)。如果您的部署需要封裝,Calico提供覆蓋網(wǎng)絡(luò)(IP in IP或VXLAN)。Calico還支持使用其他Kubernetes網(wǎng)絡(luò)選項(xiàng)來(lái)執(zhí)行策略。本文檔幫助您為集群選擇最佳的網(wǎng)絡(luò)選項(xiàng)。
2. 概念
2.1 關(guān)于calico networking
Calico提供了一些方法,允許pod連接到其他pod、主機(jī)和外部網(wǎng)絡(luò)(例如internet)。
Calico網(wǎng)絡(luò):
- 使用Calico的IP地址管理(IPAM)將IP地址分配給pods
- 編寫(xiě)本地節(jié)點(diǎn)的路由表
- 將路由分配給其他節(jié)點(diǎn)和網(wǎng)絡(luò)設(shè)備
2.2 關(guān)于BGP
Calico支持使用邊界網(wǎng)關(guān)協(xié)議(BGP)將路由信息共享到網(wǎng)絡(luò)中。Calico支持節(jié)點(diǎn)到節(jié)點(diǎn)的全網(wǎng)格部署(有和沒(méi)有路由反射器),以及BGP直接對(duì)機(jī)架(ToR)路由器頂部的現(xiàn)場(chǎng)部署;允許流量直接路由到工作負(fù)載,而不需要NAT或封裝。
2.3 其它Kubernetes 網(wǎng)絡(luò)選項(xiàng)
Calico可以使用許多其他Kubernetes網(wǎng)絡(luò)選項(xiàng)執(zhí)行網(wǎng)絡(luò)策略強(qiáng)制。
Flannel
Amazon AWS VPC CNI
Azure CNI
Google cloud networking
下表顯示了使用Calico時(shí)常見(jiàn)的網(wǎng)絡(luò)選項(xiàng)。

3. 基本說(shuō)明
本節(jié)提供更多關(guān)于Calico的內(nèi)置網(wǎng)絡(luò)選項(xiàng)的細(xì)節(jié):
- Unencapsulated, peered with physical infrastructure
- Unencapsulated, not peered with physical infrastructure
- IP in IP or VXLAN encapsulation
3.1 Unencapsulated, peered with physical infrastructure
Calico可以與你的路由器使用BGP對(duì)等。這提供了出色的性能和易于調(diào)試的非封裝流量,以及廣泛的網(wǎng)絡(luò)拓?fù)浜瓦B接選項(xiàng)。
您的集群可以跨越多個(gè)L2子網(wǎng),而不需要封裝
集群外的資源可以直接與pod通信,而不需要NAT
如果你想的話,你甚至可以把pod直接暴露在互聯(lián)網(wǎng)上!
3.2 Unencapsulated, not peered with physical infrastructure
此選項(xiàng)還提供了接近主機(jī)到主機(jī)的性能級(jí)別,并允許網(wǎng)絡(luò)直接看到流量。
當(dāng)所有節(jié)點(diǎn)都在一個(gè)L2子網(wǎng)上時(shí),如果底層網(wǎng)絡(luò)不強(qiáng)制執(zhí)行IP地址檢查,Calico可以在節(jié)點(diǎn)之間路由pod流量,而不需要封裝。如果您的網(wǎng)絡(luò)由多個(gè)L2子網(wǎng)組成,那么您可以使用路由器在BGP上進(jìn)行對(duì)等,或者使用跨子網(wǎng)封裝來(lái)僅封裝跨子網(wǎng)邊界的流量。
如果不允許在集群外部進(jìn)行工作負(fù)載訪問(wèn)或使用基礎(chǔ)設(shè)施進(jìn)行對(duì)等訪問(wèn),就無(wú)法在pod和不屬于Calico集群的目的地之間路由流量。
3.3 IP in IP or VXLAN encapsulation
如果可能,我們建議運(yùn)行Calico沒(méi)有網(wǎng)絡(luò)覆蓋/封裝。這提供了最高的性能和最簡(jiǎn)單的網(wǎng)絡(luò);離開(kāi)您的工作負(fù)載的包是連接到網(wǎng)絡(luò)上的包。
但是,當(dāng)運(yùn)行在底層網(wǎng)絡(luò)上時(shí),有選擇地使用覆蓋(IP中的IP或VXLAN中的IP)是非常有用的,因?yàn)榈讓泳W(wǎng)絡(luò)不容易知道工作負(fù)載IP。Calico可以對(duì):所有的流量,沒(méi)有流量,或者只對(duì)跨越子網(wǎng)邊界的流量進(jìn)行封裝。
IP中的IP或VXLAN封裝也可以在子網(wǎng)之間選擇性地使用——這提供了子網(wǎng)中未封裝的流量的性能優(yōu)勢(shì),適用于織物包含多個(gè)L2網(wǎng)絡(luò)且無(wú)法進(jìn)行對(duì)等連接的環(huán)境。例如,如果您在AWS中跨多個(gè)VPC/子網(wǎng)使用Calico網(wǎng)絡(luò),Calico可以選擇性地只封裝在VPC/子網(wǎng)之間路由的流量,而不封裝在每個(gè)VPC/子網(wǎng)中運(yùn)行。
二、配置BGP路由反射及對(duì)等體
1. BGP協(xié)議配置
apiVersion: projectcalico.org/v3
kind: BGPConfiguration
metadata:
name: default
spec:
logSeverityScreen: Info
nodeToNodeMeshEnabled: true
asNumber: 63400
serviceClusterIPs:
- cidr: 10.96.0.0/12
serviceExternalIPs:
- cidr: 192.168.20.99/32
2. 關(guān)閉默認(rèn)的BGP node-to-node mesh

缺省的節(jié)點(diǎn)到節(jié)點(diǎn)的BGP網(wǎng)格必須關(guān)閉,以啟用其他BGP拓?fù)?。為此,修改默認(rèn)的BGP配置資源。
- 運(yùn)行下面的命令去關(guān)閉BGP full-mesh
calicoctl patch bgpconfiguration default -p '{"spec": {"nodeToNodeMeshEnabled": false}}'
2. 配置全局的 BGP 對(duì)等體
- 下面的示例創(chuàng)建一個(gè)全局BGP對(duì)等點(diǎn),它將每個(gè)Calico節(jié)點(diǎn)配置為在AS 64567中使用192.20.30.40的對(duì)等點(diǎn)。
apiVersion: projectcalico.org/v3
kind: BGPPeer
metadata:
name: my-global-peer
spec:
peerIP: 192.20.30.40
asNumber: 64567
3. 配置每節(jié)點(diǎn)的 BGP peer
每個(gè)節(jié)點(diǎn)的BGP對(duì)等點(diǎn)應(yīng)用于集群中的一個(gè)或多個(gè)節(jié)點(diǎn)。您可以通過(guò)精確地指定節(jié)點(diǎn)的名稱或使用標(biāo)簽選擇器來(lái)選擇節(jié)點(diǎn)。
apiVersion: projectcalico.org/v3
kind: BGPPeer
metadata:
name: rack1-tor
spec:
peerIP: 192.20.30.40
asNumber: 64567
nodeSelector: rack == ‘rack-1’
4. 配置node作為路由反射器
Calico 可以配置扮演成一個(gè)路由反射器。每個(gè)節(jié)點(diǎn)要充當(dāng)路由反射器必須有一個(gè)集群ID——通常一個(gè)未使用的IPv4地址。
- 配置一個(gè)節(jié)點(diǎn)作為路由反射器,有個(gè)集群ID 244.0.0.1, 運(yùn)行如下命令:
calicoctl patch node c76085.xiodi.cn -p '{"spec": {"bgp": {"routeReflectorClusterID": "244.0.0.1"}}}'
- 常規(guī)情況下,給這個(gè)節(jié)點(diǎn)打上標(biāo)簽,標(biāo)明這個(gè)是路由反射器。允許它更容易通過(guò)BGPPeer resource選擇。
kubectl label node c76085.xiodi.cn route-reflector=true
- 現(xiàn)在使用標(biāo)簽器很容易配置路由反射器節(jié)點(diǎn)和非路由反射器節(jié)點(diǎn)。比如:
kind: BGPPeer
apiVersion: projectcalico.org/v3
metadata:
name: peer-with-route-reflectors
spec:
nodeSelector: all()
peerSelector: route-reflector == 'true'
- 針對(duì)一個(gè)節(jié)點(diǎn)查看BGP peering 狀態(tài)
您可以使用calicoctl查看一個(gè)特定節(jié)點(diǎn)的邊界網(wǎng)關(guān)協(xié)議連接的當(dāng)前狀態(tài)。這是用于確認(rèn)您的配置是根據(jù)需要的行為。
sudo calicoctl node status
- 改變默認(rèn)的global AS number
默認(rèn)的,所有的calico 節(jié)點(diǎn)使用64512 autonomous system, 除非特殊指定。下面的命令把它改成64513.
calicoctl patch bgpconfiguration default -p '{"spec": {"asNumber": “64513”}}'
- 針對(duì)特定的節(jié)點(diǎn)改變AS number,如下所示
calicoctl patch node node-1 -p '{"spec": {"bgp": {“asNumber”: “64514”}}}'
三、IPinIP模式
您可以配置每個(gè)IP池不同封裝配置。然而,你不能一個(gè)IP池內(nèi)混合封裝類型。
- Configure IP in IP encapsulation for only cross subnet traffic
- Configure IP in IP encapsulation for all inter workload traffic
- Configure VXLAN encapsulation for only cross subnet traffic
- Configure VXLAN encapsulation for all inter workload traffic
- IPv4/6 地址支持
IP in IP和 VXLAN只支持IPv4地址。
- 最佳實(shí)踐
Calico 只有一個(gè)選項(xiàng)來(lái)選擇性地封裝流量 ,跨越子網(wǎng)邊界。我們建議使用IP in IP的cross subnet選項(xiàng)把開(kāi)銷降到最低。
注意:切換封裝模式會(huì)導(dǎo)到正在連接的進(jìn)程中斷。
- 針對(duì)僅跨子網(wǎng)的流量配置IP in IP
IP in IP封裝可以選擇性的執(zhí)行, 并且僅用于通過(guò)子網(wǎng)邊界的通信量 。
開(kāi)啟這個(gè)功能,設(shè)置ipipMode為CrossSubnet
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
name: ippool-ipip-cross-subnet-1
spec:
cidr: 192.168.0.0/16
ipipMode: CrossSubnet
natOutgoing: true
- 針對(duì)workload間的流量配置IP in IP的封裝
ipipMode設(shè)置Always
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
name: ippool-ipip-1
spec:
cidr: 192.168.0.0/16
ipipMode: Always
natOutgoing: true
四、vxlan兩種模式解析
- 針對(duì)僅跨越子網(wǎng)的流量 ,配置VXLAN封裝
- 配置這個(gè)功能,設(shè)置vxlanMode為
CrossSubnet
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
name: ippool-vxlan-cross-subnet-1
spec:
cidr: 192.168.0.0/16
vxlanMode: CrossSubnet
natOutgoing: true
- 針對(duì)workload間的流量 配置VXLAN的封裝
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
name: ippool-vxlan-1
spec:
cidr: 192.168.0.0/16
vxlanMode: Always
natOutgoing: true
五、通過(guò)Mtu增加網(wǎng)絡(luò)性能
1. 確定MTU的大小
下表針對(duì)Calico環(huán)境列出了常見(jiàn)的MTU大小。 因?yàn)镸TU是endpoints間網(wǎng)絡(luò)路徑的全局屬性, 你應(yīng)該設(shè)定最低MTU的MTU包可能需要的任何路徑。
1.1 常見(jiàn)的MTU大小
| Network MTU | Calico MTU | Calico MTU with IP-in-IP (IPv4) | Calico MTU with VXLAN (IPv4) |
|---|---|---|---|
| 1500 | 1500 | 1480 | 1450 |
| 9000 | 9000 | 8980 | 8950 |
| 1460(GCE) | 1460 | 1440 | 1410 |
| 9001(AWS jumbo) | 9001 | 8981 | 8951 |
| 1450(OpenStack VXLAN) | 1450 | 1430 | 1400 |
1.2 針對(duì)overlay網(wǎng)絡(luò)推薦的MTU
額外的報(bào)頭用于在IP和VXLAN IP協(xié)議,降低了最小的MTU大小頭。在IP使用20-byte頭(IP, VXLAN使用50-byte頭)。因此,我們建議如下:
如果你使用在Pod網(wǎng)絡(luò)使用VXLAN,配置MTU大小“物理網(wǎng)絡(luò)MTU大小- 50”。
假如你使用
IP in IP, 配置MTU大小為“物理網(wǎng)絡(luò)大小-20”workload endpoint MTU和 tunnel MTU設(shè)置為相同的值。
1.3 針對(duì)flannel網(wǎng)絡(luò)的MTU
當(dāng)使用flannel的網(wǎng)絡(luò)時(shí),網(wǎng)絡(luò)接口的MTU應(yīng)該匹配flannel接口的MTU。 假如使用flannel的VXLAN, 使用上面的calico MTU with VXLAN列的大小。
2. 配置MTU針對(duì)workloads
當(dāng)你設(shè)置MTU,它適用于新工作負(fù)載。MTU變化應(yīng)用于現(xiàn)有的工作負(fù)載,必須重新啟動(dòng)calico nodes。
- 編輯calico-config ConfigMap FelixConfiguration設(shè)置值。例如:
kubectl patch configmap/Calico-config -n kube-system --type merge \
-p '{"data":{"veth_mtu": "1440"}}'
3. 針對(duì)overlay 網(wǎng)絡(luò)配置MTU
如果您使用的是IP in IP和/或VXLAN calico overlay 網(wǎng)絡(luò),設(shè)置隧道MTU匹配veth MTU配置的值。
- 編輯calico-config ConfigMap設(shè)置MTU在FelixConfiguration隧道值。例如:
# Configure the MTU to use
veth_mtu: "1440"
- 查看當(dāng)前tunnel MTU值
ip link show
IP在IP隧道作為tunlx出現(xiàn)(例如,tunl0),連同MTU大小。例如:

六、calico網(wǎng)絡(luò)地址轉(zhuǎn)換
1. 允許workloads 訪問(wèn) internet,私有IP地址
允許工作負(fù)載使用私有IP地址訪問(wèn)互聯(lián)網(wǎng),你可以用你現(xiàn)有NAT功能,或者你可以在Calico IPPool上開(kāi)啟natOutgoing。
在以下的示例中,我們創(chuàng)建一個(gè)Calicco IPPool,并開(kāi)啟natOutgoing 。Outbound NAT是在節(jié)點(diǎn)本地執(zhí)行的。
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
name: default-ipv4-ippool
spec:
cidr: 192.168.0.0/16
natOutgoing: true
2. 僅去nat那些指定的IP地址范圍
您可以創(chuàng)建額外的IPPools不用于IP地址管理,防止NAT某些CIDR塊。這是有用的,如果你想讓節(jié)點(diǎn)NAT網(wǎng)絡(luò)流量,但不是在某些內(nèi)部ip范圍。例如,如果您不想NAT流量10.0.0.0/8,您可以創(chuàng)建以下池。您必須確保集群之間的網(wǎng)絡(luò)和10.0.0.0/8可路由。
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
name: no-nat-10.0.0.0-8
spec:
cidr: 10.0.0.0/8
disabled: true
七、IP地址檢測(cè)剖析
針對(duì)calico節(jié)點(diǎn)配置IP自動(dòng)檢測(cè),確保路由使用正確的P地址。
1. 值
當(dāng)你安裝Calico在一個(gè)節(jié)點(diǎn)上時(shí),一個(gè)IP地址和子網(wǎng)被自動(dòng)檢測(cè)。Calico提供幾種方式去配置子網(wǎng)自動(dòng)檢測(cè),和支持配置指定的IPs。
擁有多個(gè)外部接口的主機(jī)
主機(jī)接口擁有多個(gè)IP地址
改變跨子網(wǎng)包的封裝
改變主機(jī)IP地址
2. 概念
2.1 自動(dòng)檢測(cè)節(jié)點(diǎn)IP地址和子網(wǎng)
針對(duì)節(jié)點(diǎn)間的路由,每個(gè)calico節(jié)點(diǎn)必須配置一個(gè)IPv4地址 和/或 一個(gè)IPV6地址,當(dāng)安裝一個(gè)calico在一個(gè)節(jié)點(diǎn)上時(shí),一個(gè)節(jié)點(diǎn)資源使用從主機(jī)檢測(cè)到的路由信息自動(dòng)創(chuàng)建。針對(duì)一些部署,你可能想要自動(dòng)的更新檢測(cè),確保節(jié)點(diǎn)獲取正確的IP地址。
- 在安裝后默認(rèn)的節(jié)點(diǎn)資源案例
apiVersion: projectcalico.org/v3
kind: Node
metadata:
name: node-hostname
spec:
bgp:
asNumber: 64512
ipv4Address: 10.244.0.1/24
ipv6Address: 2000:db8:85a3::8a2e:370:7335/120
ipv4IPIPTunnelAddr: 192.168.0.1
2.2 自動(dòng)檢測(cè)方法
默認(rèn)的,Calico使用first-found方法,也就是說(shuō)第一個(gè)接口第一個(gè)有效的IP地址(排除local interface,因?yàn)樗莇ocker bridge).你可以使用以下方法的任一一種改變默認(rèn)方法。
(1)使用一個(gè)能到達(dá)特定IP或domain的地址。
(2)使用正則的方式,去匹配接口(interface)
(3)使用正則的方式,去排除匹配的接口(skip interface)
2.3 手動(dòng)配置IP地址和子網(wǎng)
- 有兩種方式去手動(dòng)的配置IP地址和子網(wǎng)
(1) calico node container(start/restart),使用環(huán)境變量去設(shè)置節(jié)點(diǎn)的值
(2) 更新節(jié)點(diǎn)的資源
- 使用環(huán)境變量和節(jié)點(diǎn)的資源
因?yàn)槟憧梢酝ㄟ^(guò)配置環(huán)境變量和節(jié)點(diǎn)資源,去更改IP地址和子網(wǎng),下表描述了這些值如何同步的。
| If this environment variable… | Is… | Then… |
|---|---|---|
| IP/IP6 | Explicitly set | The specified values are used, and the Node resource is updated. |
| Set to autodetect | The requested method is used (first-found, can-reach, interface, skip-interface), and the Node resource is updated. | |
| Not set, but Node resource has IP/IP6 values | Node resource value is used. | |
| IP | Not set, and there is no IP value in Node resource | Autodetects an IPv4 address and subnet, and updates Node resource. |
| IP6 | Not set, and there is a notIP6 value in Node resource | No IP6 routing is performed on the node。 |
3. 動(dòng)作
3.1 改變自動(dòng)檢測(cè)方法
由于默認(rèn)的自動(dòng)檢測(cè)方法是first valid interface found(first-found). 去使用不同的自動(dòng)檢測(cè)方法,使用kubectl set env命令指定方法。
- IPv4
kubectl set env daemonset/calico-node -n kube-system IP_AUTODETECTION_METHOD=<autodetection-method>
- IPv6
kubectl set env daemonset/calico-node -n kube-system IP6_AUTODETECTION_METHOD=<autodetection-method>
- 設(shè)置檢測(cè)方法基于情況
(1)IP 或 domain name
kubectl set env daemonset/calico-node -n kube-system IP_AUTODETECTION_METHOD=can-reach=www.google.com
(2)包含匹配的接口
kubectl set env daemonset/calico-node -n kube-system IP_AUTODETECTION_METHOD=interface=eth.*
(3)排除匹配的接口
kubectl set env daemonset/calico-node -n kube-system IP_AUTODETECTION_METHOD=skip-interface=eth.*
3.2 針對(duì)節(jié)點(diǎn)手動(dòng)配置IP地址和子網(wǎng)
在下列情況下,您可能需要配置一個(gè)特定的IP子網(wǎng):
主機(jī)擁有多個(gè)外部的接口
主機(jī)接口擁有多個(gè)IP地址
改變跨子網(wǎng)數(shù)據(jù)包的封裝
改變主機(jī)IP地址
- 使用環(huán)境變量配置IP和子網(wǎng)
kubectl set env daemonset/calico-node -n kube-system IP=10.0.2.10/24 IP6=fd80:24e2:f998:72d6::/120
- 使用節(jié)點(diǎn)資源配置IP和子網(wǎng)
calicoctl patch node kind-control-plane \
--patch='{"spec":{"bgp": {"ipv4Address": "10.0.2.10/24", "ipv6Address": "fd80:24e2:f998:72d6::/120"}}}'
八、IP地址及封裝模式切換
針對(duì)安裝Calico到kubernetes集群中的每個(gè)節(jié)點(diǎn),每個(gè)manifest包含所有需要的資源。
它安裝如下的kubernetes資源:
在每個(gè)主機(jī)上使用Daemonset的方式安裝
calico/node容器。在每個(gè)主機(jī)上使用Daemonset的方式安裝Calico CNI和網(wǎng)絡(luò)的配置。
使用deployment的方式運(yùn)行
calico/kube-controllerscalico-etcd-secretssecret, 它提供到etcd存儲(chǔ)的TLS.calico-configConfigMap. 它包含安裝配置的參數(shù)。
1. 配置pod IP 范圍
Calico IPAM從IP pools中分配 IP地址。
如果要修改pods使用的默認(rèn)IP地址范圍,那么修改calico.yaml清單中的CALICO_IPV4POOL_CIDR。
2. 配置IP-in-IP
默認(rèn)情況下,清單支持跨子網(wǎng)的IP-in-IP封裝。許多用戶可能希望禁用IP-in-IP封裝,例如在以下情況下。
他們的集群運(yùn)行在正確配置的AWS VPC中。
它們的所有Kubernetes節(jié)點(diǎn)都連接到同一個(gè)第2層網(wǎng)絡(luò)。
他們打算使用BGP peer,使他們的基礎(chǔ)設(shè)施意識(shí)到pod IP地址。
如果要關(guān)閉IP-in-IP的封裝,修改清單中的CALICO-IPV4POOL_IPIP.
3. 從IP-in-IP到VXLAN的切換
默認(rèn)情況下,Calico清單支持IP-in-IP封裝。如果您所在的網(wǎng)絡(luò)阻塞了ip中的ip,比如Azure,您可能希望切換到Calico的VXLAN封裝模式。要做到這一點(diǎn),在安裝時(shí)(以便Calico創(chuàng)建默認(rèn)的IP池與VXLAN和沒(méi)有IP-in-IP配置必須撤消):
啟動(dòng)
calico for policy and networking清單使用
CALICO_IPV4POOL_VXLAN取代CALICO_IPV4POOL_IPIP的名字。新的變量值同樣保持為
Always-
完全的關(guān)閉Calico的基于BGP網(wǎng)絡(luò):
- 使用
calico_backend: "vxlan"代替calico_backend: "bird". 此步是關(guān)閉BIRD。 - 從calico/node readiness/liveness check中注釋掉
--bird-ready和bird-live行。(否則關(guān)閉BIRD,將會(huì)導(dǎo)致readniess/liveness檢查失?。?/li>
- 使用
livenessProbe:
exec:
command:
- /bin/calico-node
- -felix-live
# - -bird-live
readinessProbe:
exec:
command:
- /bin/calico-node
# - -bird-ready
- -felix-ready
k8s 操作
1.取消k8s master節(jié)點(diǎn)不可調(diào)度
kubectl taint nodes k8s-master node-role.kubernetes.io/master:NoSchedule-