calico BGP 改 IPIP 模式
基础信息
清除节点 asnumber 信息(bgpconfig 里边指定了集群的 asnumber)
ipip 模式依赖节点 IP 地址和子网,所以需要确保节点的 IP 地址正确
修改 calico-node configmap 中 calico_backend 的值为 bird
修改 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 地址和掩码是否正确
# 该命令会显示节点的 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 模式
# 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