Calico 网络基础配置
Calico 网络配置概述
通常,我们建议在没有网络覆盖/封装的情况下运行Calico。这为您提供了最高性能和最简单的网络;离开工作负载的数据包就是传输到网络上的数据包。
然而,当在无法轻松了解工作负载IP的底层网络上运行时,选择性地使用覆盖/封装可能会很有用。一个常见的例子是,如果您在AWS中跨多个VPC/子网使用Calico网络。在这种情况下,Calico可以选择性地只封装在VPC/子网之间路由的流量,并在每个VPC/个子网内不封装地运行。您还可以决定将整个Calico网络封装为覆盖网络来运行,这是一种快速入门的方法,无需在底层网络中设置BGP对等或其他路由信息。
Calico 网络概念
路由工作负载 IP 地址
网络通过静态路由或 BGP 路由分配等第 3 层路由技术或第 2 层地址学习来了解工作负载 IP 地址。因此,它们可以将未封装的流量路由到最终目的地端点的正确主机。但是,并非所有网络都能够路由工作负载 IP 地址。例如,您不拥有硬件的公共云环境、跨 VPC 子网边界的 AWS 以及您无法通过 BGP 对等 Calico 与底层网络或轻松配置静态路由的其他场景。这就是 Calico 支持封装的原因,因此您可以在工作负载之间发送流量,而无需底层网络了解工作负载 IP 地址。
封装类型
Calico 支持两种类型的封装:VXLAN 和 IP in IP。在某些不支持 IP in IP 的环境中(例如 Azure)支持 VXLAN。VXLAN 的每个数据包开销稍高,因为标头较大,但除非您运行网络密集型工作负载,否则您通常不会注意到差异。两种封装类型之间的另一个小区别是 Calico 的 VXLAN 实现不使用 BGP,而 Calico 的 IP in IP 实现在 Calico 节点之间使用 BGP。
跨子网
通常,仅当流量经过无法自行路由工作负载 IP 地址的路由器时,才需要对工作负载流量进行封装。Calico 可以对以下内容执行封装:所有流量、无流量或仅对跨越子网边界的流量执行封装。
Calico 网络最佳实践
Calico有一个选项,可以选择性地只封装跨越子网边界的流量。我们建议将跨子网选项与IP-in-IP或VXLAN一起使用,以最大限度地减少封装开销。跨子网模式在AWS多AZ部署、Azure VNET以及使用路由器连接具有L2连接的节点池的网络中提供了更好的性能。
请注意,切换封装模式可能会导致正在进行的连接中断。应制定相应的计划。
Calico 网络资源自定义
1. DaemonSet/calico-node 容器。
2. Calico CNI二进制文件和网络配置。
3. deployment/calico-kube-controllers 控制器。
4. secret/calico-etcd-secrets
5. ConfigMap/calico-config 配置安装的参数。
IP Pool
IP 池资源清单
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
name: <string> # 此 IPPool 资源的名称
spec:
cidr: <string> # 用于此池的 IP 范围,有效的 IPv4 或 IPv6 CIDR。子网长度必须至少足够大以容纳单个块(默认情况下对于 IPv4 的掩码为/26,IPv6 的掩码为/122 )
blockSize:<int> # 此池使用的分配块的CIDR大小。块按需分配给主机,并用于聚合路由。只有在创建池时才能设置该值。IPv4为20至32(含),IPv6为116至128(含),默认情况下对于 IPv4 的掩码为/26,IPv6 的掩码为/122
ipipMode: <string> # 定义使用IPIP的模式。不能与vxlanMode同时设置。 可选值:Always, CrossSubnet, Never
vxlanMode: <string> # 定义使用vxlan的模式。不能与ipipMode同时设置。 可选值:Always, CrossSubnet, Never
natOutgoing: <boolean> # 启用后,从该池中的Calico网络容器发送到任何Calico IP池之外的目的地的数据包将被伪装。可选值:true, false
disabled: <boolean> # 如果设置为true,Calico IPAM将不会分配此池中的地址。可选值:true, false
disableBGPExport: <boolean> # 禁用导出通过BGP从此IP池的CIDR路由。可选值:true, false
nodeSelector: <selector> # 选择Calico IPAM应将此池中的地址分配给的节点。
allowedUses: <list of strings> # 控制池是否用于某些类型的自动分配。可选值:Workload, Tunnel, 默认为["Workload", "Tunnel"]
- Workload
- Tunnel
示例
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
name: my.ippool-1
spec:
cidr: 10.1.0.0/16
ipipMode: CrossSubnet
natOutgoing: true
disabled: false
nodeSelector: all()
allowedUses:
- Workload
- Tunnel
配置默认 IP 池
默认 IP 池由 Calico 在安装时自动配置。您可以根据安装方法配置这些默认 IP 池。
operator 部署
对于运营商管理的集群,您可以在默认安装的IP池部分配置封装。例如,以下安装片段将跨子网启用VXLAN。
kind: Installation
apiVersion: operator.tigera.io/v1
metadata:
name: default
spec:
calicoNetwork:
ipPools:
- cidr: 192.168.0.0/16
encapsulation: VXLANCrossSubnet
manifests 部署
对于Calico的清单安装,您可以在Calico节点守护程序集的环境中使用CALICO_IPV4POOL_VXLAN和CALICO_IPV4POOL_IPIP(以及用于IPv6的CALICO_Ipv6POOL_VXLAN)环境变量来控制默认的IP池封装模式。使用CALICO_IPV4POOL_CIDR环境变量来控制默认 IP 范围
# Enable IPIP
- name: CALICO_IPV4POOL_IPIP
value: "Always"
# Enable or Disable VXLAN on the default IP pool.
- name: CALICO_IPV4POOL_VXLAN
value: "Never"
# Enable or Disable VXLAN on the default IPv6 IP pool.
- name: CALICO_IPV6POOL_VXLAN
value: "Never"
# IPV4地址池的定义,value值需要与kube-controller-manager的--cluster-network选项的值保持一致
- name: CALICO_IPV4POOL_CIDR
value: "192.168.0.0/16"
查看IP池
# calicoctl get ipPool default-ipv4-ippool -o yaml
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
name: default-ipv4-ippool
spec:
blockSize: 24
cidr: 10.244.0.0/16
ipipMode: Always
natOutgoing: true
nodeSelector: all()
vxlanMode: Neve
IPAM
在地址分配方面,Calico在JSON格式的CNI插件配置文件中使用专有的calico-ipam插件,该插件并不会使用Node.podCIDR 中定义的子网作为节点本地为Pod分配地址的地址池,而是根据Calico插件为各节点配置的地址池进行地址分配。
使用 host-local IPAM
operator 部署
kind: Installation
apiVersion: operator.tigera.io/v1
metadata:
name: default
spec:
calicoNetwork:
ipPools:
- cidr: 192.168.0.0/16
- cidr: 2001:db8::/64
cni:
type: Calico
ipam:
type: HostLocal
manifests 部署
需要在部署清单中DaemonSet/calico-node资源的Pod模板的calico-node容器添加USE_POD_CIDR环境变量值设置为true,并修改ConfigMap/calico-config资源中cni_network_config键的plugins.ipam.type值为host-local,且使用podCIDR为子网
使用CNI主机本地IPAM插件时,subnet字段允许使用两个特殊值usePodCidr和usePodCirIPv6。这告诉插件根据Node.Spec.PodCIDR字段从Kubernetes API中确定要使用的子网。Calico不使用范围的网关字段,因此该字段不是必需的,如果存在,则会被忽略。
DaemonSet/calico-node资源的Pod模板的calico-node容器添加USE_POD_CIDR环境变量值设置为true
# Calico默认并不会从Node.Spec.PodCIDR中分配地址,但可通过将如下变量设置为true并结合host-local这一IPAM插件来强制从PodCIDR中分配地址
- name: USE_POD_CIDR
value: "true"
ConfigMap/calico-config资源中cni_network_config键的plugins.ipam.type值为host-local,且使用podCIDR为子网
{
"name": "any_name",
"cniVersion": "0.1.0",
"type": "calico",
"kubernetes": {
"kubeconfig": "/path/to/kubeconfig",
"node_name": "node-name-in-k8s"
},
"ipam": {
"type": "host-local",
"ranges": [[{ "subnet": "usePodCidr" }], [{ "subnet": "usePodCidrIPv6" }]],
"routes": [{ "dst": "0.0.0.0/0" }, { "dst": "2001:db8::/96" }]
}
}
在Kubernetes API数据存储中使用host-local IPAM时,配置在calico/node和Typha deployemt中的node.podCIDR字段设置环境变量USE_POD_CIDR=true。
查看IP分配情况
# calicoctl ipam show --show-blocks
+----------+-------------------------------------------+------------+------------+-------------------+
| GROUPING | CIDR | IPS TOTAL | IPS IN USE | IPS FREE |
+----------+-------------------------------------------+------------+------------+-------------------+
| IP Pool | 10.65.0.0/16 | 65536 | 5 (0%) | 65531 (100%) |
| Block | 10.65.79.0/26 | 64 | 5 (8%) | 59 (92%) |
| IP Pool | fd5f:abcd:64::/48 | 1.2089e+24 | 7 (0%) | 1.2089e+24 (100%) |
| Block | fd5f:abcd:64:4f2c:ec1b:27b9:1989:77c0/122 | 64 | 7 (11%) | 57 (89%) |
+----------+-------------------------------------------+------------+------------+-------------------+
IP-in-IP网络
默认起用的网络。
从 IP-in-IP 切换到 VXLAN
将环境变量名称CALICO_IPV4POOL_IPIP替换为CALICO_IPV 4POOL_VXLAN。将新变量的值保留为“Always”。
完全禁用Calico IP-in-IP基于BGP的网络:
将ConfigMap/calico-node 中 calicobackend:“bird”替换为calicobackend:“vxlan”。这将禁用BIRD。
在DaemonSet/calico-node资源的Pod模型中禁用calico-node容器的存活探针和就绪探针对bird的检测
禁用IP-in-IP
# 设置在IPv4类型的地址池上启用的IP-IP及其类型,支持3种可用值 Always(全局流量)、Cross-SubNet(跨子网流量)和Never
- name: CALICO_IPV4POOL_IPIP
value: "Never"
# 是否在IPV4地址池上启用VXLAN隧道协议,取值及意义与Flannel的VXLAN后端相同,但在全局流量启用VXLAN时将完全不再需要BGP网络,建议将相关的组件禁用
- name: CALICO_IPV4POOL_VXLAN
value: "Always"
禁用BGP
将ConfigMap/calico-node 中 calicobackend:“bird”替换为calicobackend:“vxlan”。这将禁用BIRD。
kind: ConfigMap
apiVersion: v1
metadata:
name: calico-config
namespace: kube-system
data:
# Typha is disabled.
typha_service_name: "none"
# Configure the backend to use.
calico_backend: "vxlan"
...
在DaemonSet/calico-node资源的Pod模型中禁用calico-node容器的存活探针和就绪探针对bird的检测
livenessProbe:
exec:
command:
- /bin/calico-node
- -felix-live
# - -bird-live
readinessProbe:
exec:
command:
- /bin/calico-node
# - -bird-ready
- -felix-ready
参考文档
https://docs.tigera.io/calico/latest/networking/configuring/vxlan-ipip