calico BGP 改 IPIP 模式

基础信息

  1. 清除节点 asnumber 信息(bgpconfig 里边指定了集群的 asnumber)

  2. ipip 模式依赖节点 IP 地址和子网,所以需要确保节点的 IP 地址正确

  3. 修改 calico-node configmap 中 calico_backend 的值为 bird

  4. 修改 IP 地址池,配置 IPIP 模式

calicoctl version
Client Version:    v3.18.1
Git commit:        911f383f
Cluster Version:   v3.18.1
Cluster Type:      k8s,bgp,kdd

kubectl version --short
Client Version: v1.23.3
Server Version: v1.23.3

清除节点 asnumber 信息

calicoctl delete bgpconfig <bgpconfig-name>
# 或者
kubectl delete bgpconfigurations <bgpconfig-name>

# 因为集群允许不同节点 asnumber 不同,所以需要检查每个节点的 asnumber
calicoctl get nodes -o wide

# 删除具体某个节点的 asnumber
calicoctl pathc node <node-name> -p '{"spec": {"bgp": {"asNumber": null}}}'

注意:如果节点有 asnumber 信息,需要删除,否则会导致节点路由无法更新为 IPIP 路由

配置节点 IP 地址/掩码

配置节点 IP 地址和子网

# 查看节点 IP 地址和掩码是否正确
# 该命令会显示节点的 BGP 信息,包括 IP 地址/掩码和 asnumber
calicoctl get nodes -o wide

# 如果节点 IP 地址/掩码不正确,可以通过 patch 命令修改
calicoctl patch node <node-name> -p '{"spec": {"bgp": {"ipv4Address": "<node-ip-address>/<subnet-mask>"}}}'

修改 IP 地址池,配置 IPIP 模式

# 查看当前 IP 地址池
calicoctl get ippool -o wide
# 或者
kubectl get ippools -o yaml

# 修改 IP 地址池,配置 IPIP 模式
calicoctl patch ippool <pool-name> -p '{"spec": {"ipipMode":  "CrossSubnet"}}'
# 或者
kubectl patch ippool <pool-name> -p '{"spec": {"ipipMode":  "CrossSubnet"}}'

注意:如果集群中有多个 IP 地址池,都需要修改为 IPIP 模式 ipipMode 可选值:

  • Always:始终使用 IPIP 模式

  • CrossSubnet:仅在跨子网通信时使用 IPIP 模式(跨子网:节点 IP 地址不在同一子网)

  • Never:不使用 IPIP 模式

示例: Configuring IP-in-IP

# kubectl get ippool default-ipv4-ippool -o yaml
apiVersion: projectcalico.org/v1
kind: IPPool
metadata:
  name: default-ipv4-ippool
spec:
  blockSize: 26
  cidr: 192.168.0.0/16
  ipipMode: CrossSubnet
  natOutgoing: true
  nodeSelector: all()
  vxlanMode: Never


# calicoctl get ippool default-ipv4-ippool -o yaml
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
  name: default-ipv4-ippool
spec:
  blockSize: 26
  cidr: 192.168.0.0/16
  ipipMode: CrossSubnet
  natOutgoing: true
  nodeSelector: all()
  vxlanMode: Never

验证

# 查看 IP 地址池,确认 IPIP 模式已经生效
calicoctl get ippool -o wide

# 查看节点路由表,确认 IPIP 路由已经生效
# 有 tunl0 接口的路由即为 IPIP 路由
route -n