Skip to the content.

Calico Pod Directly

13 Jul 2023 - joy717

背景

允许集群外部直连calico的pod id

注意点

总体设计

配置pod的ip段为可直接访问的ip,利用calico的bgp模式,通过路由,达到直连的目的。

网络拓扑:将集群的节点1、节点2作为rr节点,rr节点与交换机/路由上的BGP作为邻居节点(EBGP)。集群内部的节点为一个自治的IBGP。

rr节点为bgp自治区域内的中心节点,该区域内的节点路由信息由该rr节点负责。一般为了高可用,会冗余一个rr节点。

本文涉及的OS均为centos7,calico版本为v3.23.3,k8s版本为v1.24.6

涉及的ip

| IP | 描述 | |-----------------|:---------:| | 172.31.13.116 | bgp交换机ip | | 172.31.13.27 | 节点1 k8s-1 | | 172.31.13.28 | 节点1 k8s-2 | | 172.31.13.29 | 节点1 k8s-3 | | 172.27.208.0/22 | pod ip段 |

交换机配置

添加bgp邻居

# 根据不同的交换机/路由器,命令有所不同,以下为例子
neighbor 172.31.13.27 remote-as 64512
neighbor 172.31.13.28 remote-as 64512

172.31.13.27,172.31.13.28分别为集群rr节点ip(一般设置节点1,节点2为rr节点)

64512为对应rr节点上的AS Number

k8s集群设置

修改calico的设置

# 修改calico的calico_backend, 设置为bird
kubectl edit cm -n kube-system calico-config

# 修改calico的ippool,设置ipipMode=Never,vxlanMode=Never,natOutgoing=false。
# natOutgoing设置为false,可以让pod到外面的请求,保留来源ip
kubectl edit ippools.crd.projectcalico.org default-pool

# 重启calico-node的pod
kubectl delete pods -n kube-system -l k8s-app=calico-node

修改bgp设置

calicoctl apply -f - << EOF
apiVersion: projectcalico.org/v3
kind: BGPConfiguration
metadata:
  name: default
spec:
  logSeverityScreen: Info
  nodeToNodeMeshEnabled: false #为了禁用默认的full-mesh
  asNumber: 64512 # calico集群,默认as number
EOF

创建BGP的peer

设置calico node的rr属性

calicoctl patch node k8s-1 -p '{"spec": {"bgp": {"routeReflectorClusterID": "这个可以是节点1的ip"}}}'
calicoctl patch node k8s-2 -p '{"spec": {"bgp": {"routeReflectorClusterID": "这个可以是节点2的ip"}}}'

设置k8s节点的label,方便calico peer使用

kubectl label node k8s-1 route-reflector=true
kubectl label node k8s-2 route-reflector=true

创建rr与交换机关联的BGPPeer

calicoctl apply -f - << EOF
apiVersion: projectcalico.org/v3
kind: BGPPeer
metadata:
  name: rr-peer
spec:
  nodeSelector: route-reflector == 'true'
  peerIP: 172.31.13.116 # 交换机/路由器上的BGP 地址
  asNumber: 7675 # 交换机/路由器上的BGP的AS
EOF

这边代表的意思是,如果node有个label是route-reflector == 'true',那么将该节点与172.31.13.116交换机建立连接

创建普通节点与rr关联的BGPPeer

calicoctl apply -f - << EOF
kind: BGPPeer
apiVersion: projectcalico.org/v3
metadata:
  name: peer-with-route-reflectors
spec:
  nodeSelector: all()
  peerSelector: route-reflector == 'true'
EOF

这边代表的意思是,所有的节点all(),都与有route-reflector == 'true' label 的peer建立连接(实际上就是与rr节点建立连接)

验证

如果配置正确的话,在每个节点上,可以通过 calicoctl node status 查看状态

[root@k8s-1]# calicoctl node status
Calico process is running.

IPv4 BGP status
+---------------+---------------+-------+----------+-------------+
| PEER ADDRESS  |   PEER TYPE   | STATE |  SINCE   |    INFO     |
+---------------+---------------+-------+----------+-------------+
| 172.31.13.116 | node specific | up    | 07:52:37 | Established |
| 172.31.13.28  | node specific | up    | 07:54:35 | Established |
| 172.31.13.29  | node specific | up    | 07:54:35 | Established |
+---------------+---------------+-------+----------+-------------+

IPv6 BGP status
No IPv6 peers found.

如果在node上使用此命令,发现交换机的peer异常,检查一下是否有在交换机上,将该node设置为邻居

其他

此时直接访问pod ip的话,应该可以直接访问到了。

如果交换机无权限,可以建一台新的vm,通过安装配置quagga,来假造一个“BGP路由器”,(只做校验的话,可去掉密码)

假设集群外机器要访问pod id,此时可以设置静态路由,将pod ip段 都经过“BGP路由器”路由转发。

具体安装配置步骤,参考底下的参考资料。大体步骤为:

# 安装“BGP路由器” `quagga`的机器,需要关闭防火墙,以及允许内核ipv4转发
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p

# 关闭selinux
sed -i 's/^ *SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
# 集群外要访问pod的机器,添加静态路由,指向“BGP路由器”
ip route add 172.27.0.208/22 via 172.31.13.116

参考资料

centos部署quagga

kubesphere-calico配置bgp