启用 BGP 即服务
云原生 Contrail® 网络™支持边界网关协议 (BGP) 即服务 (BGPaaS)。本文档应用于在采用 22.1 或更高版本的环境中启用 BGPaaS。
云原生 Contrail 网络中的 BGPaaS 功能为使用云原生 Contrail 网络在云网络环境中的虚拟网络内运行的 BGP 提供网络支持。
BGP 即服务在云原生 Contrail 中的优势
借助使用云原生 Contrail 网络的 Kubernetes 环境中的 BGPaaS,您将获得以下功能:
-
在虚拟网络中运行的 BGP 协议服务。此 BGP 服务会为虚拟网络中的 Pod、虚拟机和其他工作负载创建 BGP 邻接方会话。
-
支持 IPv4 邻接方、IPv4 和 IPv6 单播地址系列以及 IPv6-over-IPv4 下一跃点映射的路由协议。
-
一种使用最众所周知的 BGP 配置参数的用户可配置的 BGP 协议服务。
您可以在需要路由协议提供功能的任何云网络环境中使用 BGPaaS。您可能会发现 BGPaaS 在以下场景中特别有用:
-
如果您管理运行多个工作负载的大型云网络环境,则可能需要使用 BGPaaS 扩展网络服务。
-
如果您使用需要来自路由协议的网络可达性信息的隧道协议来创建和维护隧道,BGPaaS 可以提供帮助。
先决条件
我们假设在启用 BGP 即服务之前:
-
您正在使用 Kubernetes 编排在工作云网络环境中操作,而云原生 Contrail 网络即可运行。
- 您具备 BGP 的工作知识。
云原生 Contrail 网络中 BGP 即服务概述
云原生 Contrail 为 BGPaaS 提供网络支持。
您必须找到一个 BGP 服务才能在云网络环境中运行 BGP。本文介绍如何使用 BIRD Internet 路由守护程序 (BIRD) 提供的 BGP 服务,通过云原生 Contrail 网络为 BGPaaS 提供网络支持。此守护程序在许多版本的 Unix 上都作为内置开发工具提供。您还可以使用单独映像将其下载到您的环境。
在随后的示例中,您可以看到,当启用了 BGPaaS 时,BIRD 的 BGP 守护程序在 Pod 中运行。然后,该守护程序会使用云原生 Contrail 网络提供的网络功能通过网络发送 BGP 消息。有关 BIRD 的更多信息,请参阅 BIRD Internet 路由守护程序 主页。
BGPaaS 运行时,BGP 守护程序在 Pod 中运行并管理 BGPaaS。BGP 守护程序直接连接到 Contrail vRouter。
Contrail vRouter 至少连接到一个控制平面节点,并将 BIRD 守护程序连接到控制平面。通过与 Contrail vRouter 建立此连接,在至少一个控制节点与 BIRD 守护程序之间建立 BGP 对等会话。
在控制节点和 BGP 守护程序之间创建对等会话之后,BGP 守护程序可以管理 BGPaaS,并通过控制平面向 BGP 客户端发送路由。BGPaaS 管理任务包括为工作负载、Pod、虚拟机或其他对象分配 IP 地址。
在 Pod 中启用 BGPaaS
要启用 BGPaaS,必须创建一个 Pod 来托管 BGP 服务。然后,您必须将托管 BGP 服务的 Pod 与运行 BGPaaS 的虚拟网络相关联。
您可以使用两种方法之一将托管 BGP 服务的 Pod 与虚拟网络相关联:
-
虚拟机接口选择器 — 运行 BGP 服务的 Pod 与虚拟网络直接关联。定义虚拟网络关联后,会自动发现托管 BGP 服务的 Pod。
-
虚拟机接口参考 — 运行 BGP 服务的 Pod 通过显式提供托管 BGP 服务的 Pod 的命名空间和虚拟机接口名称,与虚拟网络直接关联。
以下部分提供每种关联方法的步骤。
使用虚拟机接口选择器在 Pod 中启用 BGPaaS
您必须创建一个 Pod 来托管 BGP 服务,然后才能使用虚拟机接口选择器启用 BGPaaS。
Pod 必须:
-
至少包含一个 IPv4 接口。
-
包括用于
core.juniper.net/bgpaas-networks
指定关联的虚拟网络名称的注释。此注释中的值必须至少包含一个虚拟网络名称。如果将托管 BIRD 守护程序的 Pod 与多个虚拟网络关联,请以逗号分隔列表方式输入虚拟网络名称。
在此示例中 YAML 文件中,会创建一个 Pod 来托管 BGP 服务。Pod 与两个虚拟网络相关联,并启用了 BGPaaS 在两个虚拟网络上运行。 图像: 容器中的变量 : 层次结构指向将在本示例中提供 BGP 服务的 BIRD 图像文件。
apiVersion: v1 kind: Pod metadata: name: bird-pod-shared-1 namespace: bgpaas-ns annotations: k8s.v1.cni.cncf.io/networks: | [{ "name": "bgpaas-vn-1", "namespace": "bgpaas-ns", "cni-args": null "interface": "eth1" },{ "name": "bgpaas-vn-2", "namespace": "bgpaas-ns", "cni-args": null "interface": "eth2" }] core.juniper.net/bgpaas-networks: bgpaas-vn-1,bgapss-vn-2 spec: containers: - name: bird-pod-c image: somewhere.juniper.net/cn2/bazel-build/dev/bird-sut:1.0 command: ["bash","-c","while true; do sleep 60s; done"] securityContext: privileged: true
输入 kubectl 获取 vmi -n 虚拟网络名称 以确认已创建 Pod 及其关联的虚拟机接口。您还可以输入 kubectl 描述 命令,以确保虚拟机接口存在。
您可以通过查看 kubectl 描述命令的标签部分中的 bgpaasVN= 输出来确认虚拟网络已创建。
kubectl get vmi -n bgpaas-ns CLUSTERNAME NAME NETWORK PODNAME IFCNAME STATE AGE contrail-k8s-kubemanager-kubernetes bird-pod-1-abb881a8 bgpaas-vn-1 bird-pod-1 eth1 Success 13s contrail-k8s-kubemanager-kubernetes bird-pod-1-e3f93f05 default-podnetwork bird-pod-1 eth0 Success 13s kubectl describe vmi bird-pod-1-abb881a8 -n bgpaas-ns Name: bird-pod-1-abb881a8 Namespace: bgpaas-ns Labels: core.juniper.net/bgpaasVN=bgpaas-vn-1 namespace=bgpaas-ns
然后,您必须创建一个 BGPaaS 对象以配置 BGPaaS。BGPaaS 对象引用 VirtualMachineInterfacesSelector:部分中的 虚拟网络。
apiVersion: core.contrail.juniper.net/v1alpha1 kind: BGPAsAService metadata: namespace: bgpaas-ns name: bgpaas-test spec: shared: false autonomousSystem: 10 bgpAsAServiceSessionAttributes: loopCount: 2 routeOriginOverride: origin: EGP addressFamilies: family: - inet - inet6 virtualMachineInterfacesSelector: - matchLabels: core.juniper.net/bgpaasVN: bgpaas-vn-1 - matchLabels: core.juniper.net/bgpaasVN: bgpaas-vn-2
使用虚拟机接口参考在 Pod 中启用 BGPaaS
您必须首先创建一个 Pod 来托管 BIRD 守护程序,以便通过虚拟机接口引用启用 BGPaaS。Pod 必须至少包含一个 IPv4 接口。
在以下示例中,在 bgpaas-ns 命名空间中创建 Pod。该注释会将 Pod 与 bgpaas-vn-1 虚拟网络相关联。 图像: 容器中的变量 : 层次结构指向将在本示例中提供 BGP 服务的 BIRD 图像文件。
apiVersion: v1 kind: Pod metadata: name: bird-pod-1 namespace: bgpaas-ns annotations: k8s.v1.cni.cncf.io/networks: bgpaas-vn-1 spec: containers: - name: bird-pod-c image: somewhere.juniper.net/cn2/bazel-build/dev/bird-sut:1.0 command: ["bash","-c","while true; do sleep 60s; done"] securityContext: privileged: true
输入 kubectl get vmi -n bgpaas-ns 命令,确认在提交 Pod 对象配置文件后已创建 Pod。
记下此命令输出中 Pod 的虚拟机接口名称。配置 BGPaaS 对象时,需要在此过程中的后面指定虚拟机接口名称。
kubectl get vmi -n bgpaas-ns CLUSTERNAME NAME NETWORK PODNAME IFCNAME STATE AGE contrail-k8s-kubemanager-kubernetes bird-pod-1-abb881a8 bgpaas-vn-1 bird-pod-1 eth1 Success 13s contrail-k8s-kubemanager-kubernetes bird-pod-1-e3f93f05 default-podnetwork bird-pod-1 eth0 Success 13s
虚拟机接口引用是在使用 virtualMachineInterfaceReferences: 层次结构创建 BGPaaS 对象时定义的。 命名空间: 是 Pod 命名空间和 名称: 是您使用 kubectl get vmi -n bgpaas-ns 命令检索的虚拟机接口名称。
apiVersion: core.contrail.juniper.net/v1alpha1 kind: BGPAsAService metadata: namespace: bgpaas-ns name: bgpaas-sample spec: shared: false autonomousSystem: 100 bgpAsAServiceSessionAttributes: localAutonomousSystem: 10 loopCount: 2 routeOriginOverride: origin: EGP addressFamilies: family: - inet - inet6 virtualMachineInterfaceReferences: - apiVersion: core.contrail.juniper.net/v1alpha1 kind: VirtualMachineInterface namespace: bgpaas-ns name: bird-pod-1-abb881a8
配置 BGPasaS 的 IP 地址分配方法
您可以使用以下一种 IP 地址分配方法配置 BGPaaService:
-
自动 IP 地址分配 — BGP 服务分配 IP 地址。
-
用户指定的 IP 地址分配 — 您分配 IP 地址。
您可以在对象中 Subnet
配置 IP 地址分配方法。
默认情况下,自动 IP 地址分配处于启用状态。如果启用 BGPaaS 而不手动禁用自动 IP 地址分配,则 BGPaaS 使用自动 IP 地址分配。
通过将禁用 BGPaaSIP 自动分配 的对象中的 Subnet
变量设置为 true,可以禁用自动 IP 地址分配。如果 禁用BGPaaSIP 自动分配: 变量不存在在 子网 对象文件中,则启用自动 IP 地址分配。
在以下配置示例中,由于禁用 BGPaaSIP 自动分配:子网对象配置文件中不存在变量,因此启用了自动 IP 地址分配。
apiVersion: core.contrail.juniper.net/v1alpha1 kind: Subnet metadata: namespace: bgpaas-ns name: bgpaas-subnet-1 spec: cidr: "172.20.10.0/24"
在此配置示例中,由于 禁用 BGPaaSIP 自动分配: 变量设置为 false,因此启用了自动 IP 地址分配。
apiVersion: core.contrail.juniper.net/v1alpha1 kind: Subnet metadata: namespace: bgpaas-ns name: bgpaas-subnet-2 spec: cidr: "172.20.20.0/24" disableBGPaaSIPAutoAllocation: false
要启用用户指定的 IP 地址分配,请将 禁用BGPaaSIP 自动分配: 变量设置为 true
。启用用户指定的 IP 地址分配后,还必须配置 BGPaaS 可分配给子网内端点的 BGP 地址。您必须使用 bgpaasPrimaryIP: 变量设置主 IP 地址。您还可以设置可选的辅助 IP 地址,这在本例中使用 bgpaasSecondaryIP: 变量完成。
apiVersion: core.contrail.juniper.net/v1alpha1 kind: Subnet metadata: namespace: bgpaas-ns name: bgpaas-subnet-2 spec: cidr: "172.20.20.0/24" disableBGPaaSIPAutoAllocation: true bgpaasPrimaryIP: 172.20.20.3 bgpaasSecondaryIP: 172.20.20.4
配置 BGPasa 服务对象
通过创建 BGPAsAService 对象,您可以在群集中启用 BGPaaS。
BGPAsAService通过创建 YAML 文件来创建对象,该文件使用以下BGPAsAService
类型:字段:
apiVersion: core.contrail.juniper.net/v1alpha1 kind: BGPAsAService metadata: namespace: bgpaas-ns name: bgpaas-test spec: shared: false autonomousSystem: 10 bgpAsAServiceSessionAttributes: loopCount: 2 routeOriginOverride: origin: EGP addressFamilies: family: - inet - inet6 virtualMachineInterfacesSelector: - matchLabels: core.juniper.net/bgpaasVN: bgpaas-vn-1 - matchLabels: core.juniper.net/bgpaasVN: bgpaas-vn-2
字段变量 | 说明 |
---|---|
共享: |
指定是否可以与同一虚拟网络中的多个虚拟机接口共享通用 BGP 路由器对象。 将此字段设置为 true 时,一个 BGP 客户端路由器可与同一虚拟网络中的多个虚拟机接口共享。此设置限制了必须在 VMI 虚拟网络中创建的 BGP 客户端路由器的总数。 将此字段设置为 false 时,将为每个虚拟机接口创建一个 BGP 客户端路由器。 |
自治系统: |
为 BGP 实例指定全局自治系统编号。自治系统编号可以是 1 到 4294967295之间的任意数字。 |
bgpAsAServiceSessionAttriession 但: |
定义 BGPaaS 的 BGP 会话属性。
参见
表 2
|
虚拟机接口配比: |
定义在使用虚拟机接口引用时要与 BGPaaS 关联的虚拟机接口参数。
参见
表 3
|
virtualMachineInterfaceselector: |
定义在使用虚拟机接口选择器时运行 BGPaaS 的虚拟网络。
参见
表 4
|
字段 | 说明 |
---|---|
localAutonomousSystem: |
为 BGP 指定本地自治系统编号。 |
环路计数: |
指定路由被丢弃之前,在路由更新中可以看到相同 ASN 的次数。 LoopCount: 可以是任意最多 16 个的编号。 |
路由OriginOverride: |
在转发路由时,覆盖原始设置并将源属性设置为 “不完整 ”。 如果将此字段设置为 false,则路由将根据源设置播发到 BGP 中。源可以是 IGP,也可以是 EGP,并使用此文件中的 源: 字段进行设置。 如果将此字段设置为 true,则播发路由的原点将设置为 “不完整 ”。 如果要更改 BGP 网络从 BGP 服务接收的路由的优先级,请使用此字段。默认情况下,BGP 网络基于源对路由进行优先级排序,而源不 完全 的路由的优先级低于从 IGP 或 EGP 接收的路由。 |
起源: |
指定 BGP 是作为内部网关协议 (igp) 还是作为外部网关协议 (egp) 运行。默认路由源为 igp。 |
地址: |
指定地址族。您可以将家族指定为 IPv4 的 inet ,或将 IPv6 的 inet6 指定。这两个地址族可以同时指定。 |
字段 | 说明 |
---|---|
apiVersion: |
为虚拟机接口参考指定 API 版本。 |
类型: |
始终将此字段设置为 虚拟机接口。 |
命名 空间: |
指定与虚拟机接口参考关联的命名空间。您可以在创建 Pod 对象时定义此命名空间。看到。 |
名字: |
指定与虚拟机接口参考关联的 Pod 的名称。您可以通过输入 kubectl get vmi -n bgpaas-ns 命令来检索 Pod 名称。请参阅 使用虚拟机接口参考在 Pod 中启用 BGPaaS。 |
字段 | 说明 |
---|---|
matchLabels: |
为虚拟机接口选择器定义匹配标签。 此上下文中的匹配标签始终用于引用运行虚拟机接口选择器的虚拟网络。 此部分中的匹配标签值始终输入 为 core.juniper.net/bgpaasVN:虚拟网络名称。请参阅 使用虚拟机接口选择器在 Pod 中启用 BGPaaS。 |
验证 BGP 即服务配置
提交 BGPA 服务对象文件后,您应该确认 BGPaaS 对象已成功运行。
创建 BGPA 服务对象后,输入 kubectl get BGPAsAService 命令以确认对象状态。当 “状态” 字段指示 “成功”时,对象已成功创建。
kubectl get BGPAsAService -n bgpaas-ns NAME AS IPADDRESS SHARED STATE AGE bgpaas-sample 100 false Success 33s
还应确保 BGPaaS 服务器和 BGPaaS 客户端已创建并处于 成功 状态。
进入 kubectl get BGPRouter 命令以确认 BGPaaS 服务器和客户端的存在和操作状态。
kubectl get BGPRouter -n bgpaas-ns NAME TYPE IDENTIFIER STATE AGE bgpaas-ns-bgpaas-vn-1-bgpaas-server bgpaas-server Success 2m57s bgpaas-ns-bgpaas-vn-1-bird-pod-1-abb881a8 bgpaas-client 172.20.10.2 Success 2m57s
在 Pod 中配置 BGP
您还必须为 Pod 中运行的 BGP 服务配置网络参数。每个 BGP 服务的配置都是唯一的,记录所需的网络配置参数不在本文档的范围。
在此示例中,BGP 网络配置使用 BIRD 配置。
您可以在此示例中使用 BIRD CLI 配置 BGP。将指出 BGP 配置中的参数,该参数需要与在云原生 Contrail 网络中定义的 BGPaaS 对象匹配。虽然此示例中没有显示,但您应该知道,在大多数部署中,访问 BIRD 配置文件的默认位置是 /etc/bird.conf 或 /etc/bird/bird.conf。
# Change the router id to your BIRD router ID. It's a world-wide unique identification # of your router, usually one of router's IPv4 addresses. router id 172.20.10.2; protocol direct { interface "eth1*"; -> interface on which BGPAsAService needs to be configured } protocol bgp bgp1_1 { import all; export all; local as 10; -> AS configured in BGPAsAService neighbor 172.20.10.3 as 64512; -> neighbor for primary BGP session, use BGPaaSPrimaryIP from subnet neighbor 172.20.10.3 as 64512; -> neighbor for secondary BGP session, use BGPaaSSecondaryIP from subnet
您还可以验证 BGP 协议是否正在从 BGP 服务运行。
在此来自 BIRD 的示例中,输入 show protocol 命令以验证 BGP 协议是否已建立。
birdc show protocol bgp1_1 BIRD 1.6.8 ready. name proto table state since info bgp1_1 BGP master up 10:31:27 Established