部署
1. 添加 Calico 官方 Helm 仓库
helm repo add projectcalico https://tigera.io
helm repo update2. 创建一个自定义的 values.yaml
# calico-values.yaml
installation:
enabled: true
kubernetesProvider: Kubernetes
cni:
type: Calico
calicoNetwork:
bgp: Enabled # 开启 BGP 路由模式
# 根据网络模式调整:纯 BGP 填 1500,IPIP 填 1480,VXLAN 填 1450
mtu: 1450 # 注意:若有池子用了 VXLAN,全局 MTU 需以最小的为准(即 1450)
ipPools:
# 【池子 1:普通业务池(走 VXLAN 封装)】
- cidr: 10.244.0.0/16
blockSize: 26
encapsulation: VXLAN
natOutgoing: Enabled
# 匹配所有没有被打上专属标签的普通 Worker 节点
nodeSelector: "!has(network-zone) || network-zone == 'general'"
# 【池子 2:大扩容追加池(当池子 1 快用完时追加,同样走 VXLAN)】
- cidr: 10.99.0.0/16
blockSize: 26
encapsulation: VXLAN
natOutgoing: Enabled
nodeSelector: "!has(network-zone) || network-zone == 'general'"
# 【池子 3:核心大数据/AI节点池(走纯 BGP 无封装,追求极致性能)】
- cidr: 172.30.0.0/16
blockSize: 24 # 跑大数据/AI的机器往往单机 Pod 极多,给它分配更大的 Block(/24 包含 256 个 IP)
encapsulation: None # 纯 BGP
natOutgoing: Enabled
# 只有被打上了 network-zone=high-perf 标签的节点才能使用这个高性能池
nodeSelector: "network-zone == 'high-perf'"3. 安装
helm install calico projectcalico/tigera-operator \
--version v3.28.0 \
--namespace tigera-operator \
--create-namespace \
-f calico-values.yaml优化
Tip
路由反射器(Route Reflector)、CrossSubnet
# ==========================================
# 1. 禁用默认的 Full-Mesh(全网互联)模式
# ==========================================
apiVersion: projectcalico.org/v3
kind: BGPConfiguration
metadata:
name: default
spec:
# 当节点数超过 50-100 时,必须关闭此项,改用下文的 Route Reflector
nodeToNodeMeshEnabled: false
# 性能调优:显式指定 BGP 的自治系统号(AS Number),自建机房常用 64512
asNumber: 64512
# 日志级别,生产环境建议 Info 即可,排查故障时可临时改为 Debug
logSeverityScreen: Info
---
# ==========================================
# 2. IP 池配置(支持 CrossSubnet 混合路由模式)
# ==========================================
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
name: default-ipv4-ippool
spec:
cidr: 10.244.0.0/16
blockSize: 26 # 每个节点分 64 个 IP
# 【生产推荐优化】
# 如果你的 K8s 节点处于同一个二层交换机下(同网段),设为 None 性能最高。
# 如果你的 K8s 节点跨越了不同的机房/三层网段,设为 CrossSubnet:
# 同网段走纯 BGP 路由(无损),跨网段自动降级为 IPIP 隧道封装,兼顾性能与兼容性。
# VXLANCrossSubnet 为 VXLAN 隧道封装
encapsulation: CrossSubnet
natOutgoing: true # 允许 Pod 访问外网(SNAT)
nodeSelector: all() # 应用于集群所有节点
---
# ==========================================
# 3. 声明哪些节点作为 Route Reflector(路由反射器)
# ==========================================
# 提示:你需要在生产中选择 2-3 台不跑核心业务、位置关键的 Master 或工具节点
# 并在 K8s 节点上打上标签:kubectl label node node-master-01 route-reflector=true
apiVersion: projectcalico.org/v3
kind: Node
metadata:
name: node-master-01 # 必须和你的 K8s 节点名字(hostname)完全一致
spec:
bgp:
# 将此节点指定为群组内的路由反射器,并分配一个集群内唯一的 Cluster ID
routeReflectorClusterID: 224.0.0.1
# 强制指定该节点用于 BGP 通信的物理 IP(防止多网卡机器走错接口)
ipv4Address: 192.168.10.11/24
---
# ==========================================
# 4. 配置 BGP Peer:让普通 Worker 节点连上 RR 节点
# ==========================================
apiVersion: projectcalico.org/v3
kind: BGPPeer
metadata:
name: peer-workers-to-rr
spec:
# 筛选普通节点:没有被打上 route-reflector 标签的节点
nodeSelector: "!has(route-reflector)"
# 筛选目标邻居:被打上了 route-reflector 标签的节点
peerSelector: "route-reflector == 'true'"
---
# ==========================================
# 5. 配置 BGP Peer:让多个 RR 节点之间互相建立连接
# ==========================================
apiVersion: projectcalico.org/v3
kind: BGPPeer
metadata:
name: peer-rr-to-rr
spec:
# 筛选反射器节点:自己跟自己这个组内的其他反射器同步数据
nodeSelector: "route-reflector == 'true'"
peerSelector: "route-reflector == 'true'"