一、确定最佳的网络选项
Calico支持多个容器网络选项,用于可伸缩性、网络性能和与现有基础设施的互操作性。
1. 值
不同的网络实现更适合不同的环境。Calico提供了几种不需要封装的基于IP路由的网络实现。如果您的部署需要封装,Calico提供覆盖网络(IP in IP或VXLAN)。Calico还支持使用其他Kubernetes网络选项来执行策略。本文档帮助您为集群选择最佳的网络选项。
2. 概念
2.1 关于calico networking
Calico提供了一些方法,允许pod连接到其他pod、主机和外部网络(例如internet)。
Calico网络:
- 使用Calico的IP地址管理(IPAM)将IP地址分配给pods
- 编写本地节点的路由表
- 将路由分配给其他节点和网络设备
2.2 关于BGP
Calico支持使用边界网关协议(BGP)将路由信息共享到网络中。Calico支持节点到节点的全网格部署(有和没有路由反射器),以及BGP直接对机架(ToR)路由器顶部的现场部署;允许流量直接路由到工作负载,而不需要NAT或封装。
2.3 其它Kubernetes 网络选项
Calico可以使用许多其他Kubernetes网络选项执行网络策略强制。
-
Flannel
-
Amazon AWS VPC CNI
-
Azure CNI
-
Google cloud networking
下表显示了使用Calico时常见的网络选项。
网络选项
3. 基本说明
本节提供更多关于Calico的内置网络选项的细节:
- 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对等。这提供了出色的性能和易于调试的非封装流量,以及广泛的网络拓扑和连接选项。
-
您的集群可以跨越多个L2子网,而不需要封装
-
集群外的资源可以直接与pod通信,而不需要NAT
-
如果你想的话,你甚至可以把pod直接暴露在互联网上!
3.2 Unencapsulated, not peered with physical infrastructure
此选项还提供了接近主机到主机的性能级别,并允许网络直接看到流量。
当所有节点都在一个L2子网上时,如果底层网络不强制执行IP地址检查,Calico可以在节点之间路由pod流量,而不需要封装。如果您的网络由多个L2子网组成,那么您可以使用路由器在BGP上进行对等,或者使用跨子网封装来仅封装跨子网边界的流量。
如果不允许在集群外部进行工作负载访问或使用基础设施进行对等访问,就无法在pod和不属于Calico集群的目的地之间路由流量。
3.3 IP in IP or VXLAN encapsulation
如果可能,我们建议运行Calico没有网络覆盖/封装。这提供了最高的性能和最简单的网络;离开您的工作负载的包是连接到网络上的包。
但是,当运行在底层网络上时,有选择地使用覆盖(IP中的IP或VXLAN中的IP)是非常有用的,因为底层网络不容易知道工作负载IP。Calico可以对:所有的流量,没有流量,或者只对跨越子网边界的流量进行封装。
IP中的IP或VXLAN封装也可以在子网之间选择性地使用——这提供了子网中未封装的流量的性能优势,适用于织物包含多个L2网络且无法进行对等连接的环境。例如,如果您在AWS中跨多个VPC/子网使用Calico网络,Calico可以选择性地只封装在VPC/子网之间路由的流量,而不封装在每个VPC/子网中运行。
二、配置BGP路由反射及对等体
1. BGP协议配置
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. 关闭默认的BGP node-to-node mesh
BGP网格缺省的节点到节点的BGP网格必须关闭,以启用其他BGP拓扑。为此,修改默认的BGP配置资源。
- 运行下面的命令去关闭BGP full-mesh
calicoctl patch bgpconfiguration default -p '{"spec": {"nodeToNodeMeshEnabled":"false"}}'
2. 配置全局的 BGP 对等体
- 下面的示例创建一个全局BGP对等点,它将每个Calico节点配置为在AS 64567中使用192.20.30.40的对等点。
apiVersion: projectcalico.org/v3
kind: BGPPeer
metadata:
name: my-global-peer
spec:
peerIP: 192.20.30.40
asNumber: 64567
3. 配置每节点的 BGP peer
每个节点的BGP对等点应用于集群中的一个或多个节点。您可以通过精确地指定节点的名称或使用标签选择器来选择节点。
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 可以配置扮演成一个路由反射器。每个节点要充当路由反射器必须有一个集群ID——通常一个未使用的IPv4地址。
- 配置一个节点作为路由反射器,有个集群ID 244.0.0.1, 运行如下命令:
calicoctl patch node c76085.xiodi.cn -p '{"spec": {“bgp”: {"routeReflectorClusterID": “244.0.0.1”}}}'
- 常规情况下,给这个节点打上标签,标明这个是路由反射器。允许它更容易通过BGPPeer resource选择。
kubectl label node c76085.xiodi.cn route-reflector=true
- 现在使用标签器很容易配置路由反射器节点和非路由反射器节点。比如:
kind: BGPPeer
apiVersion: projectcalico.org/v3
metadata:
name: peer-with-route-reflectors
spec:
nodeSelector: all()
peerSelector: route-reflector == ‘true’
- 针对一个节点查看BGP peering 状态
您可以使用calicoctl查看一个特定节点的边界网关协议连接的当前状态。这是用于确认您的配置是根据需要的行为。
sudo calicoctl node status
- 改变默认的global AS number
默认的,所有的calico 节点使用64512 autonomous system, 除非特殊指定。下面的命令把它改成64513.
calicoctl patch bgpconfiguration default -p '{"spec": {"asNumber": “64513”}}'
- 针对特定的节点改变AS number,如下所示
calicoctl patch node node-1 -p '{"spec": {"bgp": {“asNumber”: “64514”}}}'
三、IPinIP模式
您可以配置每个IP池不同封装配置。然而,你不能一个IP池内混合封装类型。
- 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地址。
- 最佳实践
Calico 只有一个选项来选择性地封装流量 ,跨越子网边界。我们建议使用IP in IP
的cross subnet
选项把开销降到最低。
注意:切换封装模式会导到正在连接的进程中断。
- 针对仅跨子网的流量配置IP in IP
IP in IP封装可以选择性的执行, 并且仅用于通过子网边界的通信量 。
开启这个功能,设置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
- 针对workload间的流量配置IP in IP的封装
ipipMode
设置Always
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
name: ippool-ipip-1
spec:
cidr: 192.168.0.0/16
ipipMode: Always
natOutgoing: true
四、vxlan两种模式解析
- 针对仅跨越子网的流量 ,配置VXLAN封装
- 配置这个功能,设置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
- 针对workload间的流量 配置VXLAN的封装
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
name: ippool-vxlan-1
spec:
cidr: 192.168.0.0/16
vxlanMode: Always
natOutgoing: true
五、通过Mtu增加网络性能
1. 确定MTU的大小
下表针对Calico环境列出了常见的MTU大小。 因为MTU是endpoints间网络路径的全局属性, 你应该设定最低MTU的MTU包可能需要的任何路径。
1.1 常见的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 针对overlay网络推荐的MTU
额外的报头用于在IP和VXLAN IP协议,降低了最小的MTU大小头。在IP使用20-byte头(IP, VXLAN使用50-byte头)。因此,我们建议如下:
-
如果你使用在Pod网络使用VXLAN,配置MTU大小“物理网络MTU大小- 50”。
-
假如你使用
IP in IP
, 配置MTU大小为“物理网络大小-20” -
workload endpoint MTU和 tunnel MTU设置为相同的值。
1.3 针对flannel网络的MTU
当使用flannel的网络时,网络接口的MTU应该匹配flannel接口的MTU。 假如使用flannel的VXLAN, 使用上面的calico MTU with VXLAN
列的大小。
2. 配置MTU针对workloads
当你设置MTU,它适用于新工作负载。MTU变化应用于现有的工作负载,必须重新启动calico nodes。
- 编辑calico-config ConfigMap FelixConfiguration设置值。例如:
kubectl patch configmap/Calico-config -n kube-system --type merge \
-p '{"data":{"veth_mtu": "1440"}}'
3. 针对overlay 网络配置MTU
如果您使用的是IP in IP和/或VXLAN calico overlay 网络,设置隧道MTU匹配veth MTU配置的值。
- 编辑calico-config ConfigMap设置MTU在FelixConfiguration隧道值。例如:
# Configure the MTU to use
veth_mtu: "1440"
- 查看当前tunnel MTU值
ip link show
IP在IP隧道作为tunlx出现(例如,tunl0),连同MTU大小。例如:
mtu
六、calico网络地址转换
1. 允许workloads 访问 internet,私有IP地址
允许工作负载使用私有IP地址访问互联网,你可以用你现有NAT功能,或者你可以在Calico IPPool上开启natOutgoing。
在以下的示例中,我们创建一个Calicco IPPool,并开启natOutgoing 。Outbound NAT是在节点本地执行的。
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
name: default-ipv4-ippool
spec:
cidr: 192.168.0.0/16
natOutgoing: true
2. 仅去nat那些指定的IP地址范围
您可以创建额外的IPPools不用于IP地址管理,防止NAT某些CIDR块。这是有用的,如果你想让节点NAT网络流量,但不是在某些内部ip范围。例如,如果您不想NAT流量10.0.0.0/8,您可以创建以下池。您必须确保集群之间的网络和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地址检测剖析
针对calico节点配置IP自动检测,确保路由使用正确的P地址。
1. 值
当你安装Calico在一个节点上时,一个IP地址和子网被自动检测。Calico提供几种方式去配置子网自动检测,和支持配置指定的IPs。
-
拥有多个外部接口的主机
-
主机接口拥有多个IP地址
-
改变跨子网包的封装
-
改变主机IP地址
2. 概念
2.1 自动检测节点IP地址和子网
针对节点间的路由,每个calico节点必须配置一个IPv4地址 和/或 一个IPV6地址,当安装一个calico在一个节点上时,一个节点资源使用从主机检测到的路由信息自动创建。针对一些部署,你可能想要自动的更新检测,确保节点获取正确的IP地址。
- 在安装后默认的节点资源案例
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 自动检测方法
默认的,Calico使用first-found
方法,也就是说第一个接口第一个有效的IP地址(排除local interface,因为它是docker bridge).你可以使用以下方法的任一一种改变默认方法。
(1)使用一个能到达特定IP或domain的地址。
(2)使用正则的方式,去匹配接口(interface)
(3)使用正则的方式,去排除匹配的接口(skip interface)
2.3 手动配置IP地址和子网
- 有两种方式去手动的配置IP地址和子网
(1) calico node container(start/restart),使用环境变量去设置节点的值
(2) 更新节点的资源
- 使用环境变量和节点的资源
因为你可以通过配置环境变量和节点资源,去更改IP地址和子网,下表描述了这些值如何同步的。
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. 动作
3.1 改变自动检测方法
由于默认的自动检测方法是first valid interface found
(first-found). 去使用不同的自动检测方法,使用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>
- 设置检测方法基于情况
(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 针对节点手动配置IP地址和子网
在下列情况下,您可能需要配置一个特定的IP子网:
-
主机拥有多个外部的接口
-
主机接口拥有多个IP地址
-
改变跨子网数据包的封装
-
改变主机IP地址
- 使用环境变量配置IP和子网
kubectl set env daemonset/calico-node -n kube-system IP=10.0.2.10/24 IP6=fd80:24e2:f998:72d6::/120
- 使用节点资源配置IP和子网
calicoctl patch node kind-control-plane \
--patch='{"spec":{"bgp": {"ipv4Address": "10.0.2.10/24", "ipv6Address": "fd80:24e2:f998:72d6::/120"}}}'
八、IP地址及封装模式切换
针对安装Calico到kubernetes集群中的每个节点,每个manifest包含所有需要的资源。
它安装如下的kubernetes资源:
-
在每个主机上使用Daemonset的方式安装
calico/node
容器。 -
在每个主机上使用Daemonset的方式安装Calico CNI和网络的配置。
-
使用deployment的方式运行
calico/kube-controllers
-
calico-etcd-secrets
secret, 它提供到etcd存储的TLS. -
calico-config
ConfigMap. 它包含安装配置的参数。
1. 配置pod IP 范围
Calico IPAM从IP pools中分配 IP地址。
如果要修改pods使用的默认IP地址范围,那么修改calico.yaml清单中的CALICO_IPV4POOL_CIDR
。
2. 配置IP-in-IP
默认情况下,清单支持跨子网的IP-in-IP封装。许多用户可能希望禁用IP-in-IP封装,例如在以下情况下。
-
他们的集群运行在正确配置的AWS VPC中。
-
它们的所有Kubernetes节点都连接到同一个第2层网络。
-
他们打算使用BGP peer,使他们的基础设施意识到pod IP地址。
如果要关闭IP-in-IP的封装,修改清单中的CALICO-IPV4POOL_IPIP
.
3. 从IP-in-IP到VXLAN的切换
默认情况下,Calico清单支持IP-in-IP封装。如果您所在的网络阻塞了ip中的ip,比如Azure,您可能希望切换到Calico的VXLAN封装模式。要做到这一点,在安装时(以便Calico创建默认的IP池与VXLAN和没有IP-in-IP配置必须撤消):
-
启动
calico for policy and networking
清单 -
使用
CALICO_IPV4POOL_VXLAN
取代CALICO_IPV4POOL_IPIP
的名字。新的变量值同样保持为
Always
-
完全的关闭Calico的基于BGP网络:
- 使用
calico_backend: "vxlan"
代替calico_backend: "bird"
. 此步是关闭BIRD。 - 从calico/node readiness/liveness check中注释掉
--bird-ready
和bird-live
行。(否则关闭BIRD,将会导致readniess/liveness检查失败)
- 使用
livenessProbe:
exec:
command:
- /bin/calico-node
- -felix-live
# - -bird-live
readinessProbe:
exec:
command:
- /bin/calico-node
# - -bird-ready
- -felix-ready
网友评论