首页 / 最佳实践 / 网络 / Calico Pod IP 集群外暴露

Calico Pod IP 集群外暴露

在 Calico 集群中 Pod 无法被外部网络直接访问,您可以通过配置 BGP 对等体实现 Calico 与外部网络的互通。

名词解释

名词 描述
BGP(Border Gateway Protocol,边界网关协议) BGP 是一种在网络中的路由器之间交换路由信息的标准协议。每个运行 BGP 的路由器都可以通过 BGP 与其他路由器进行通信,形成 BGP 对等体。在 Calico 网络中,每个节点可以被看作是提供虚拟路由器的实体。您可以将 Calico 节点配置为相互对等,使用路由反射器或机架顶部(ToR)路由器来实现 BGP 通信。
RR(Route Reflector,路由反射器) 在构建大型内部 BGP(iBGP)集群时,可以使用 BGP 路由反射器来减少每个节点所需的 BGP 对等数量。这种模型中,部分节点充当路由反射器,并通过配置建立一个完整的网格连接。其他节点则被配置为与这些路由反射器的子集进行对等连接(通常是两个节点,以实现冗余性)。相对于 Full Mesh,使用路由反射器可以减少 BGP 对等连接的总数。

集群配置

安装 calicoctl

登录集群的 Master 节点,安装 calicoctl。

i=$(kubectl get pod -n kube-system -l app=raven   --no-headers | head -n1 | awk '{print $1}')
kubectl cp -n kube-system $i:/raven/calicoctl  /usr/local/bin/calicoctl
chmod +x /usr/local/bin/calicoctl
export DATASTORE_TYPE=kubernetes
export KUBECONFIG=/etc/kubernetes/admin.conf

配置指定节点充当路由反射器

  1. 集群添加 RR 节点。

    集群新添加两个节点用于 RR 节点,节点配置 4 核 8 G,节点设置为不可调度。

    说明

    集群内 kube-proxy 和 calico-node 已默认添加如下容忍。节点设置为不可调度后,不影响 kube-proxy 及 calico pod 调度。

    calico-node
        tolerations:
        - effect: NoSchedule
          operator: Exists
        - key: CriticalAddonsOnly
          operator: Exists
        - effect: NoExecute
          operator: Exists
    kube-proxy
        tolerations:
        - operator: Exists
  2. 配置 RR 节点。

    1. 为 RR 节点配置 Cluster ID。在具有多个 RR 的集群环境中,为了避免路由环路的发生,所有的 RR 节点必须配置相同的 Cluster ID。例如,可以将 Cluster-ID 设置值为 224.0.0.1。

      ./calicoctl patch node 192.168.178.97 -p '{"spec": {"bgp": {"routeReflectorClusterID": "244.0.0.1"}}}'
    2. 为 RR 节点指定标签。

      kubectl label node 192.168.178.97 route-reflector=true

配置每个节点的 BGP 对等体

每个节点都可以作为集群中的一个或多个节点的 BGP 对等体。您可以通过明确指定节点的名称或使用标签选择器来选择要与之建立 BGP 对等关系的节点。

以下示例创建一个 BGPPeer,该 BGPPeer 使用所有 Calico 节点,与带有 route-reflector == ’true’ 标签的反射器进行连接。

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

查看对等关系

calicoctl node status

关闭 node-to-node 模式

注意事项

从 node-to-node 切换到 BGP 路由反射器时,涉及清除 BGP 会话并引入新的会话,这将导致在集群节点上运行的工作负载出现短暂的数据平面网络中断(约 2 秒)。

操作步骤

若默认的 BGP 配置资源不存在,您需要先创建它,再执行关闭 node-to-node 模式的操作。

配置如下:

cat << EOF | calicoctl apply -f -
apiVersion: projectcalico.org/v3
kind: BGPConfiguration
metadata:
  name: default
spec:
  logSeverityScreen: Info
  nodeToNodeMeshEnabled: false      
  asNumber: 64512      
EOF

若 BGP 配置资源文件存在,您可以直接执行如下命令关闭 node-to-node 模式:

calicoctl patch bgpconfiguration default -p '{"spec": {"nodeToNodeMeshEnabled": false}}'

配置全局 BGP 对等体

全局 BGP 对等体适用于集群中的所有节点。如果您的网络拓扑包括 BGP Speaker,这些 Speaker 将与您部署中的每个 Calico 节点对等。

以下示例创建一个全局 BGP 对等体,将路由反射器节点配置为 AS 64512 中的 192.168.128.1 对等体。

cat << EOF | calicoctl apply -f -
apiVersion: projectcalico.org/v3
kind: BGPPeer
metadata:
  name: peer
spec:
  peerIP: 192.168.128.1
  asNumber: 64512
  nodeSelector: route-reflector == 'true'     
EOF

更改默认的全局 AS 号(可选)

默认情况下,所有 Calico 节点都使用 64512 自治系统,除非为该节点指定 AS。您可以通过修改 defaultBGPConfiguration 资源来更改所有节点的全局默认值。

以下示例命令将全局默认 AS 编号设置为 64513:

calicoctl patch bgpconfiguration default -p '{"spec": {"asNumber": "64513"}}'

更改特定节点的 AS 号(可选)

您可以通过使用 calicoctl 修改节点对象来为特定节点配置 AS。

例如,以下命令将名为 node-1 的节点更改为属于 AS 64514。

calicoctl patch node node-1 -p '{"spec": {"bgp": {"asNumber": "64514"}}}'

修改子网模式为 BGP 模式

外部路由器配置

以 H3C 路由器配置为例:

bgp 64512
 peer 192.168.178.97 as-number 64512
 #
 address-family ipv4 unicast
  peer 192.168.178.97 enable

结果验证

  1. 在外部路由器上查看对等连接。

    dis bgp peer ipv4
    
     BGP local router ID: 192.168.254.1
     Local AS number: 64512
     Total number of peers: 1                 Peers in established state: 1
    
      * - Dynamically created peer
      ^ - Peer created through link-local address
      Peer                    AS  MsgRcvd  MsgSent OutQ PrefRcv Up/Down  State
    
      192.168.178.97       64512      795      832    0       2 11:33:37 Established
  2. 在外部路由器上查看路由信息。

    dis bgp routing-table ipv4
    
     Total number of routes: 2
    
     BGP local router ID is 192.168.254.1
     Status codes: * - valid, > - best, d - dampened, h - history
                   s - suppressed, S - stale, i - internal, e - external
                   a - additional-path
           Origin: i - IGP, e - EGP, ? - incomplete
    
         Network            NextHop         MED        LocPrf     PrefVal Path/Ogn
    
    * >i 10.5.34.128/26     192.168.178.97             100        0       i
    * >i 10.5.128.64/26     192.168.181.93             100        0       i
  3. 在集群外的节点上测试与集群内的 Pod 地址是否可以正常通信。

    ping -I eth0 10.5.34.145
    PING 10.5.34.145 (10.5.34.145) from 192.168.144.99 eth0: 56(84) bytes of data.
    64 bytes from 10.5.34.145: icmp_seq=1 ttl=62 time=1.22 ms
    64 bytes from 10.5.34.145: icmp_seq=2 ttl=62 time=0.400 ms
    64 bytes from 10.5.34.145: icmp_seq=3 ttl=62 time=0.373 ms
    64 bytes from 10.5.34.145: icmp_seq=4 ttl=62 time=0.538 ms