Calico 网络基础配置

发布时间 2023-08-25 19:56:43作者: 小吉猫

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