Calico BGP网络

发布时间 2023-08-25 22:19:23作者: 小吉猫

BGP 网络模型

默认情况下,Calico的BGP网络工作在节点网格(node-to-node mesh)模型下,各节点间以对等方式广播路由,它仅适用于规模较小的集群环境。
中级集群环境应该使用全局对等BGP(global BGP peers)模型,通过在同一个二层网络中使用一个或一组BGP反射器构建BGP网络环境。
大型集群环境甚至可以使用每节点对等BGP模型(per-node BGP peers),即分布式BGP反射器模型。Calico的节点代理calico/node自身就能够充当BGP路由反射器,我们可以在Kubernetes集群外部的专用主机上部署calico/node作为路由反射器,也可以在集群中选择专用的几个节点进行配置。

BGP 配置资源

BGP 配置清单

apiVersion: projectcalico.org/v3
kind: BGPConfiguration
metadata:
  name: <string>               # 描述此资源实例的唯一名称
spec:
  logSeverityScreen: <string>     # 全局日志级别,默认info。 可用值:Debug, Info, Warning, Error, Fatal 
  nodeToNodeMeshEnabled: <string>  # 完整的 BGP 节点到节点网格。仅在全局默认 BGP 配置上有效,可用值: true, false
  nodeMeshMaxRestartTime: [Duration string][parse-duration] # BIRD 在 BGP 平滑重启功能中宣布的重启时间,指定邻居在重启后在删除全网状配置中的过时路由之前等待 BGP 会话重新建立的时间。注意:更改此配置时应格外小心,因为它可能会破坏集群中的网络。如果未指定,BIRD 使用默认值 120 秒。
  asNumber: <integer/string>  # Calico 在与 BGP 对等方通信时应使用的默认本地 AS 编号。仅在全局default BGPConfiguration上有效;要设置每个节点的覆盖,请使用Node.spce.bgp.asNumber的字段。默认值:64512
  serviceClusterIPs: List of cidr: <ip>/<prefix length> values. # CIDR 阻止通过 BGP 通告 Kubernetes 服务集群 IP。仅在全局default BGPConfiguration 上有效:否则将被忽略。
    - cidr: 10.96.0.0/12
  serviceExternalIPs: List of cidr: <ip>/<prefix length> values. # IDR 阻止通过 BGP 通告 Kubernetes 服务外部 IP。Kubernetes 服务外部 IP 仅当位于这些块之一内时才会被通告。仅在全局default BGPConfiguration 上有效:否则将被忽略。
    - cidr: 104.244.42.129/32
    - cidr: 172.217.3.0/24
  serviceLoadBalancerIPs: List of cidr: <ip>/<prefix length> values. # CIDR 阻止 Kubernetes 服务状态。LoadBalancer IP 通过 BGP 进行通告。Kubernetes LoadBalancer IP 仅当位于这些块之一内时才会进行通告。仅在全局defaultBGPConfiguration 上有效:否则将被忽略。
  listenPort: <integer> # BGP 协议应侦听的端口。	默认值: 179
  bindMode: <string>  # 指示是在所有地址(None)上侦听BGP连接,还是仅在节点的规范IP地址node.Spec.BGP.IPvXAddress(NodeIP)上侦听。如果在calico节点已经运行时更改此字段,则在手动重新启动calico结点之前,更改不会生效。可用值: None NodeIP
  communities: List of communities  # BGP 团体名称及其值的列表,除非在prefixAdvertisements中使用,否则不会公布团体。
    - name: <string>     # 社区的名称或标识符。这应该在prefixAdvertisements中使用来宣传社区价值。
      value: <string>  # 标准或大型 BGP 社区值。
  prefixAdvertisements:  # 每个前缀的广告属性列表,例如 BGP 社区。
    - cidr: <string>  # 应公布哪些属性的 CIDR。cidr: XXX.XXX.XXX.XXX/XX
      communities:  # 要公布的 BGP 社区。
        - bgp-large-community
        - 63400:120
  nodeMeshPassword:  # nodeMesh配置中所有对等互连的 BGP 密码。
  ignoredInterfaces: # 读取设备路由时要排除的网络接口列表。

BGP 配置示例 

apiVersion: projectcalico.org/v3
kind: BGPConfiguration
metadata:
  name: default
spec:
  logSeverityScreen: Info
  nodeToNodeMeshEnabled: true
  nodeMeshMaxRestartTime: 120s
  asNumber: 63400
  serviceClusterIPs:
    - cidr: 10.96.0.0/12
  serviceExternalIPs:
    - cidr: 104.244.42.129/32
    - cidr: 172.217.3.0/24
  listenPort: 178
  bindMode: NodeIP
  communities:
    - name: bgp-large-community
      value: 63400:300:100
  prefixAdvertisements:
    - cidr: 172.218.4.0/26
      communities:
        - bgp-large-community
        - 63400:120

BGPPeer 配置资源

BGPPeer 配置清单

apiVersion: projectcalico.org/v3
kind: BGPPeer
metadata:
  name: <string>        # 描述此资源实例的唯一名称
spec:
  node: <string>        # 如果指定,则范围是节点级别,否则范围是全局的。
  peerIP: <string>      # 此对等端的IP地址和可选端口号。如果未设置端口号,并且对等节点是设置了listenPort的Calico节点,则使用listenPort。
  asNumber:  <integer/string>  # The remote AS Number of the peer.
  nodeSelector: # 应具有此对等功能的节点的选择器。设置此选项后,node字段必须为空。
  peerSelector: # 用于对等的远程节点的选择器。设置此选项后,peerIP和asNumber字段必须为空。
  keepOriginalNextHop: <boolean> # 维护原始下一跳BGP路由属性并将其转发到不同AS内的特定对等方。
  password: # 此BGPPeer资源生成的对等的BGP密码。
    secretKeyRef: # 从secret中获取密码
      - name: # secret的名称
        key:  # secret的值
  sourceAddress: <string> # 指定是否以及如何为此BGPPeer资源生成的对等项配置源地址。默认值“UseNodeIP”表示将节点IP配置为源地址。“None”表示不配置源地址。可用值:"UseNodeIP", "None",默认值:"UseNodeIP"
  maxRestartTime: [Duration string] # 由BIRD在BGP优雅重新启动功能中宣布的重新启动时间,该时间指定邻居在重新启动后等待BGP会话重新建立多长时间才能删除过时路由。注意:更改此配置时应格外小心,因为它可能会破坏集群中的网络。如果未指定,BIRD将使用默认值120秒。
  numAllowedLocalASNumbers: <integer> # 允许在AS路径中接收路由的本地AS号码的数目。这将禁用BGP预防环路,并且只有在必要时才应使用。
  ttlSecurity: <8-bit integer> # 启用通用TTL安全机制(GTSM),该机制通过忽略接收到的TTL值小于预期值的数据包来防止伪造的数据包。提供的值是对等点之间的跳数(边)。可用值:0 - 255
  filters: <string> # 要应用于此对等的BGPFilter资源的名称列表。
  reachableBy: <string> # 添加连接到对等点可能需要的静态路由。在某些情况下,没有用于BGP对等的静态路由会导致路由摆动。通过添加对等方连接到的网关的地址,可以添加静态路由以防止路由抖动。

BGPPeer 配置示例

apiVersion: projectcalico.org/v3
kind: BGPPeer
metadata:
  name: some.name
spec:
  node: rack1-host1
  peerIP: 192.168.1.1
  asNumber: 63400

BGPFilter 配置资源

BGP过滤器资源(BGPFilter)表示一种控制路由的方法,该路由由使用BGP对等资源(BGPPeer)指定的BGP对等点导入和导出。

BGPFilter规则(importVX、exportVX)按顺序应用:第一个将地址与其 cidr + matchOperator 匹配的规则的操作将立即执行。如果地址与任何显式BGP筛选规则不匹配,则默认操作为 accept。

为了在BGP对等中使用BGPFilter,必须将其名称添加到相应BGPPeer资源的过滤器中。

对于kubectl命令,可以使用以下区分大小写的别名来指定CLI上的资源类型:bgpfilters.crd.projectcalico.org

BGPFilter 示例

apiVersion: projectcalico.org/v3
kind: BGPFilter
metadata:
  name: my-filter
spec:
  exportV4:
    - action: Accept     # 针对此 CIDR 采取的操作,可选值:Accept or Reject
      matchOperator: In  # 匹配候选路由的方法,可选值:In, NotIn, Equal,NotEqual
      cidr: 77.0.0.0/16
    - action: Reject
      matchOperator: NotIn
      cidr: 88.0.0.0/16
  importV4:
    - action: Reject
      matchOperator: NotIn
      cidr: 44.0.0.0/16
  exportV6:
    - action: Reject
      matchOperator: NotEqual
      cidr: 9000::0/64
  importV6:
    - action: Accept
      matchOperator: Equal
      cidr: 5000::0/64
    - action: Reject
      matchOperator: NotIn
      cidr: 5000::0/64

node-to-node mesh

启用BGP

修改ipipMode(或vxlanMode)的属性值为CrossSubnet便能启用直接路由网络。
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
  name: my.ippool-1
spec:
  cidr: 10.1.0.0/16
  blockSize: 26
  ipipMode: CrossSubnet
  natOutgoing: true
  disabled: false
  nodeSelector: all()
  allowedUses:
    - Workload
    - Tunnel

查看node 状态

# calicoctl node status
Calico process is running.

IPv4 BGP status
+--------------+-------------------+-------+----------+-------------+
| PEER ADDRESS |     PEER TYPE     | STATE |  SINCE   |    INFO     |
+--------------+-------------------+-------+----------+-------------+
| 172.17.8.102 | node-to-node mesh | up    | 23:30:04 | Established |
+--------------+-------------------+-------+----------+-------------+

IPv6 BGP status
No IPv6 peers found.

BGP Peer配置

配置全局BGP Peer

全局BGP对等应用于群集中的所有节点。如果您的网络拓扑包括BGP扬声器,并且该扬声器将与部署中的每个Calico节点进行对等,则此功能非常有用。

以下示例创建了一个全局BGP对等体,该对等体将每个Calico节点配置为与AS 64567中的192.20.30.40对等。
apiVersion: projectcalico.org/v3
kind: BGPPeer
metadata:
  name: my-global-peer
spec:
  peerIP: 192.20.30.40
  asNumber: 64567

配置每个节点BGP Peer

每节点 BGP 对等体适用于集群中的一个或多个节点。您可以通过准确指定节点名称或使用标签选择器来选择哪些节点。

以下示例创建一个 BGPPeer,该 BGPPeer 为每个带有标签rack:rack-1 的Calico 节点配置为与AS 64567中的192.20.30.40建立对等关系。
apiVersion: projectcalico.org/v3
kind: BGPPeer
metadata:
  name: rack1-tor
spec:
  peerIP: 192.20.30.40
  asNumber: 64567
  nodeSelector: rack == 'rack-1'

配置路由反射器

Calico 节点可以配置为充当路由反射器。为此,要充当路由反射器的每个节点都必须有一个集群 ID - 通常是未使用的 IPv4 地址。

要将节点配置为集群 ID 244.0.0.1 的路由反射器,请运行以下命令。

添加注解- kubernetes API 方式

# kubectl annotate node my-node projectcalico.org/RouteReflectorClusterID=244.0.0.1

打补丁-etcdv3 方式

# calicoctl patch node my-node -p '{"spec": {"bgp": {"routeReflectorClusterID": "244.0.0.1"}}}'
将routeReflectorClusterID添加到节点规范将立即将其从节点到节点网格中删除,从而破坏现有的BGP会话。添加BGP对等将打开新的BGP会话。这将对发生这种情况的节点中运行的工作负载的数据平面流量造成短时间(约2秒)的中断。为了避免这种情况,请通过配置新节点或在节点上运行kubectl drain(这本身可能会在工作负载耗尽时造成中断),确保节点上没有运行任何工作负载。

添加 label

# kubectl label node my-node route-reflector=true

资源清单方式

apiVersion: projectcalico.org/v3
kind: Node
metadata:
  labels:
    route-reflector: true
  name: my-node
spec:
  bgp:
    routeReflectorClusterID: 244.0.0.1
    ...

配置BGP 对等节点

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

禁用节点网格

可以关闭默认的节点到节点 BGP 网格以启用其他 BGP 拓扑。为此,请修改默认BGP 配置资源。
# calicoctl patch bgpconfiguration default -p '{"spec": {"nodeToNodeMeshEnabled": false}}'

or

apiVersion: projectcalico.org/v3
kind: BGPConfiguration
metadata:
  name: default
spec:
  logSeverityScreen: Info
  nodeToNodeMeshEnabled: false
  asNumber: 63400 # BGP对等通信时使用的默认AS号
禁用节点到节点网格将中断pod网络,直到/除非您使用BGPPeer资源配置替换BGP对等。您可以在禁用节点到节点网格之前配置BGPPeer资源,以避免pod网络中断。

更改默认的全局 AS Number

默认情况下,所有Calico节点都使用64512自治系统,除非为该节点指定了每个节点AS。您可以通过修改默认的BGPConfiguration资源来更改所有节点的全局默认值。以下示例命令将全局默认AS编号设置为64513。
# calicoctl patch bgpconfiguration default -p '{"spec": {"asNumber": "64513"}}'

更改默认的特定 AS Number

您可以通过使用calicoctl修改节点对象来为特定节点配置AS。例如,以下命令将名为node-1的节点更改为属于AS 64514。
# calicoctl patch node node-1 -p '{"spec": {"bgp": {"asNumber": "64514"}}}'

从节点到节点网格更改为路由反射器

从节点到节点的BGP网格到BGP路由反射器的切换涉及到拆除BGP会话并引入新会话。这会导致集群中节点上运行的工作负载出现短暂的数据平面网络中断(约2秒)。为了避免这种情况,您可以在拆除节点到节点的网格会话之前,提供路由反射器节点并启动其BGP会话。
请执行以下步骤:
1. 提供新节点作为路线反射器。节点不应该是可调度的,并且它们的规范中应该有routeReflectorClusterID。这些节点不会是现有节点到节点BGP网格的一部分,并且在禁用网格时将成为路由反射器。这些节点还应该有一个类似标签的路由反射器,以便为BGP对等选择它们。或者,您可以通过运行kubectl drain<NODE>来从集群中的现有节点中排出工作负载,以便将它们配置为路由反射器,但这会在这些节点上的工作负载被排出时造成中断。
2. 还设置了一个BGPPeer规范来配置路由反射器节点,以便使用标签选择器相互对等和其他非路由反射器节点。
3. 等待这些对等互连建立。这可以通过在节点上运行 sudo calicoctl node status 来验证。或者,您可以创建 CalicoNodeStatus 资源来获取节点的 BGP 会话状态。
4. 禁用集群的 BGP 节点到节点网格
5. 如果您确实从节点中耗尽了工作负载或将它们创建为不可调度,请再次将节点标记为可调度(例如,通过运行 kubectl uncordon <NODE>)。

使用BGP filter 配置 BGP Peer

BGP 对等体可以使用 BGP 过滤器来控制在它们之间导入或导出哪些路由。

以下示例创建 BGPFilter 并将其与 BGPPeer 关联
kind: BGPFilter
apiVersion: projectcalico.org/v3
metadata:
  name: first-bgp-filter
spec:
  exportV4:
    - action: Accept
      matchOperator: In
      cidr: 77.0.0.0/16
    - action: Reject
      matchOperator: NotIn
      cidr: 88.0.0.0/16
  importV4:
    - action: Reject
      matchOperator: NotIn
      cidr: 44.0.0.0/16
  exportV6:
    - action: Reject
      matchOperator: NotEqual
      cidr: 9000::0/64
  importV6:
    - action: Accept
      matchOperator: Equal
      cidr: 5000::0/64
    - action: Reject
      matchOperator: NotIn
      cidr: 5000::0/64
---
kind: BGPFilter
apiVersion: projectcalico.org/v3
metadata:
  name: second-bgp-filter
spec:
  exportV4:
    - action: Reject
      matchOperator: In
      cidr: 99.0.0.0/16
    - action: Reject
      matchOperator: In
      cidr: .0.0.0/16
  importV4:
    - action: Accept
      matchOperator: NotIn
      cidr: 55.0.0.0/16
    - action: Reject
      matchOperator: In
      cidr: 66.0.0.0/16
  exportV6:
    - action: Accept
      matchOperator: Equal
      cidr: 7000::0/64
    - action: Accept
      matchOperator: Equal
      cidr: 8000::0/64
    - action: Reject
      matchOperator: NotIn
      cidr: 7000::0/64
  importV6:
    - action: Reject
      matchOperator: NotEqual
      cidr: 4000::0/64
---
kind: BGPPeer
apiVersion: projectcalico.org/v3
metadata:
  name: peer-with-filter
spec:
  peerSelector: has(filter-bgp)
  filters:
    - first-bgp-filter
    - second-bgp-filter

参考文档

https://docs.tigera.io/calico/latest/networking/configuring/bgp