在腾讯云和阿里云的两台不同公网 IP 的云服务器上部署 Kubernetes 集群并配置 Calico 时,核心挑战是解决跨公网的 Pod 网络通信问题(默认 Calico 依赖内网 BGP 协议,公网环境需特殊配置)。以下是详细配置方案:
前提条件
已通过kubeadm初始化 K8s 集群(master 在其中一台,node 在另一台,且已通过公网 IP 完成kubeadm join)。
两台服务器已开放必要端口(公网通信需开放:6443、8472、179 等,具体见下文)。
服务器操作系统已关闭 Swap、SELinux,内核参数配置正确(参考之前的 kubeadm 安装步骤)。
核心问题与解决方案
问题:Calico 默认使用 BGP 协议在节点间建立邻居关系,依赖内网 L2/L3 可达性,而公网环境中节点 IP 是公网地址,且可能存在 NAT / 防火墙阻隔 BGP(179 端口)。
解决方案:
强制 Calico 使用VXLAN 模式(而非 BGP),通过封装数据包在公网传输(依赖 UDP 8472 端口)。
确保两台服务器公网 IP 互通,且开放 VXLAN 所需端口。
步骤 1:配置服务器安全组 / 防火墙
在腾讯云和阿里云控制台开放以下端口(公网入站规则):
协议 端口 用途
TCP 6443 K8s API Server
TCP 2379-2380 etcd 通信
UDP 8472 Calico VXLAN 封装
TCP 10250 kubelet 通信
TCP 10251 kube-scheduler
TCP 10252 kube-controller-manager
临时关闭服务器防火墙(测试用,生产环境需精确配置):
bash
CentOS
systemctl stop firewalld && systemctl disable firewalld
Ubuntu
ufw disable
步骤 2:确认 K8s 集群 Pod 网段
Calico 的 Pod 网段必须与kubeadm init时指定的–pod-network-cidr一致,查看集群配置:
bash
在master节点执行
kubeadm config view | grep podSubnet
假设输出:podSubnet: 10.244.0.0/16(后续Calico需匹配此网段)
步骤 3:下载并修改 Calico 配置(关键)
下载官方 Calico 清单:
bash
curl -O https://docs.projectcalico.org/v3.26/manifests/calico.yaml
修改 Calico 为 VXLAN 模式(核心配置):编辑calico.yaml,找到calico-node的env配置,添加 / 修改以下参数:
yaml
搜索到环境变量配置部分,添加或修改:
- name: CALICO_NETWORKING_BACKEND
value: “vxlan” # 强制使用VXLAN模式(默认是bird,即BGP) - name: VXLAN_IPV4_IFACE
value: “eth0” # 替换为服务器的公网网卡(通常是eth0,用ip addr确认) - name: IP_AUTODETECTION_METHOD
value: “interface=eth0” # 强制Calico使用公网网卡的IP作为节点IP - name: CALICO_IPV4POOL_CIDR
value: “10.244.0.0/16” # 必须与K8s的podSubnet一致
(若用sed批量修改,以10.244.0.0/16和eth0为例):
bash
设置VXLAN后端
sed -i ‘s/# - name: CALICO_NETWORKING_BACKEND/- name: CALICO_NETWORKING_BACKEND/’ calico.yaml
sed -i ‘s/# value: “vxlan”/ value: “vxlan”/’ calico.yaml
设置公网网卡
sed -i ‘/CALICO_NETWORKING_BACKEND/a \ - name: VXLAN_IPV4_IFACE\n value: “eth0”’ calico.yaml
sed -i ‘/VXLAN_IPV4_IFACE/a \ - name: IP_AUTODETECTION_METHOD\n value: “interface=eth0”’ calico.yaml
设置Pod网段(替换为实际的podSubnet)
sed -i ‘s/192.168.0.0/16/10.244.0.0/16/’ calico.yaml
步骤 4:部署 Calico
bash
kubectl apply -f calico.yaml
步骤 5:验证部署状态
查看 Calico 节点 Pod 状态(确保所有节点的calico-node为Running):
bash
kubectl get pods -n kube-system -l k8s-app=calico-node
输出示例:
plaintext
NAME READY STATUS RESTARTS AGE
calico-node-9x2zp 1/1 Running 0 5m # master节点
calico-node-q7f4k 1/1 Running 0 3m # node节点(另一云厂商)
查看节点状态(所有节点变为Ready):
bash
kubectl get nodes
测试跨节点 Pod 通信(关键验证):
在 master 节点创建一个 Pod:
bash
kubectl run pod-master --image=busybox:1.35 --rm -it – sh
在Pod内执行(记录当前Pod IP,例如10.244.1.2)
ip addr
在 node 节点创建另一个 Pod,尝试访问 master 节点的 Pod IP:
bash
kubectl run pod-node --image=busybox:1.35 --rm -it – sh
替换为实际的Pod IP
ping 10.244.1.2 # 若能ping通,说明跨公网通信正常
常见问题解决
calico-node 启动失败(日志报 “no route to host”):
检查两台服务器公网 IP 是否互通(用ping测试)。
确认 UDP 8472 端口已开放(可通过telnet 公网IP 8472测试连通性)。
Pod 跨节点通信失败:
查看 Calico 日志:kubectl logs -n kube-system calico-node-xxx,搜索 “vxlan” 相关错误。
确认VXLAN_IPV4_IFACE配置的网卡正确(用ip addr查看公网网卡名称,可能不是 eth0)。
节点一直处于 NotReady 状态:
检查kubelet日志:journalctl -u kubelet -f,可能是网络插件未就绪导致。
注意事项
公网通信安全性:跨公网传输 Pod 流量未加密,生产环境需配置 Calico 加密(CALICO_IPV4POOL_CIDR下方添加- name: CALICO_ENCRYPTION_KEY并生成密钥)。
性能影响:VXLAN 封装会增加网络开销,公网延迟可能高于内网,建议生产环境使用云厂商的私有网络互通(如阿里云 VPC 对等连接、腾讯云私有网络互联)。
版本兼容性:Calico 版本需与 K8s 版本匹配(参考官方兼容性矩阵)。
通过以上配置,Calico 会通过 VXLAN 在公网环境中实现跨节点 Pod 通信,解决不同云厂商服务器的网络互通问题。
6555

被折叠的 条评论
为什么被折叠?



