启用 BGP 即服务
云原生 Contrail® 网络™支持 BGP 即服务 (BGPaaS)。本文档应用于在使用版本 22.1 或更高版本的环境中启用 BGPaaS。
云原生 Contrail 网络中的 BGPaaS 功能可为 BGP 提供网络支持,使其能够在使用云原生 Contrail 网络的云网络环境中的虚拟网络中运行。
BGP 即服务在云原生 Contrail 中的优势
通过在 Kubernetes 环境中使用云原生 Contrail 网络的 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 虚拟路由器。
Contrail 虚拟路由器至少连接到一个控制平面节点,并将 BIRD 守护程序连接到控制平面。通过与 Contrail vRouter 的这种连接,在至少一个控制节点和 BIRD 守护程序之间建立 BGP 对等会话。
在控制节点和 BGP 守护程序之间创建对等会话后,BGP 守护程序可以管理 BGPaaS,并通过控制平面将路由发送到 BGP 客户端。BGPaaS 管理任务包括为工作负载、Pod、虚拟机或其他对象分配 IP 地址。
在容器中启用 BGPaaS
要启用 BGPaaS,您必须创建一个容器来托管 BGP 服务。然后,您必须将托管 BGP 服务的容器与将在其中运行 BGPaaS 的虚拟网络相关联。
您可以使用以下两种方法之一将托管 BGP 服务的容器与虚拟网络相关联:
-
虚拟机接口选择器 - 运行 BGP 服务的容器与虚拟网络直接关联。定义虚拟网络关联后,将自动发现托管 BGP 服务的容器。
-
虚拟机接口参考 - 通过显式提供托管 BGP 服务的容器的命名空间和虚拟机接口名称,运行 BGP 服务的容器直接与虚拟网络关联。
以下各节提供了每种关联方法的步骤。
使用虚拟机接口选择器在容器中启用 BGPaaS
您必须创建一个容器来托管 BGP 服务,然后才能使用虚拟机接口选择器启用 BGPaaS。
容器必须:
-
至少包含一个 IPv4 接口。
-
包括用于
core.juniper.net/bgpaas-networks
指定关联虚拟网络名称的批注。此批注中的值必须至少包含一个虚拟网络名称。如果要将托管 BIRD 守护程序的容器与多个虚拟网络相关联,请以逗号分隔的列表形式输入虚拟网络名称。
在此示例 YAML 文件中,将创建一个 Pod 来托管 BGP 服务。容器与两个虚拟网络相关联,并且 BGPaaS 已启用以在两个虚拟网络上运行。容器:层次结构中的 image: 变量指向将在此示例中提供 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 get vmi -n 虚拟网络名称 ,以确认已创建 Pod 及其关联的虚拟机接口。您还可以输入 kubectl describe 命令以确保虚拟机接口存在。
可以通过查看 kubectl describe 命令的标签部分中的 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
使用虚拟机接口引用在容器中启用 BGPaaS
您必须先创建一个 Pod 来托管 BIRD 守护程序,以启用具有虚拟机接口引用的 BGPaaS。容器必须至少包含一个 IPv4 接口。
在以下示例中,将在 bgpaas-ns 命名空间中创建一个 Pod。注记会将容器与 bgpaas-vn-1 虚拟网络相关联。容器:层次结构中的 image: 变量指向将在此示例中提供 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 对象配置文件后创建的。
记下此命令输出中容器的虚拟机接口的名称。配置 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 命名空间, name: 是使用 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 地址分配处于启用状态。如果在未手动禁用自动 IP 地址分配的情况下启用 BGPaaS,则 BGPaaS 将使用自动 IP 地址分配。
可以通过将对象中的Subnet
禁用 BGPaaSIPAutoAllocation: 变量设置为 true 来禁用自动 IP 地址分配。如果禁用的BGPaaSIPAutoAllocation: 变量在子网对象文件中不存在,则启用自动 IP 地址分配。
在以下配置示例中,启用了自动 IP 地址分配,因为 禁用 BGPaaSIPAutoAllocation: 变量在 子网对象配置文件 中不存在。
apiVersion: core.contrail.juniper.net/v1alpha1 kind: Subnet metadata: namespace: bgpaas-ns name: bgpaas-subnet-1 spec: cidr: "172.20.10.0/24"
在此配置示例中,启用了自动 IP 地址分配 ,因为禁用 BGPaaSIPAutoAllocation: 变量设置为 false。
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 地址分配,请将 禁用的 BGPaaSIPAutoAllocation: 变量 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
配置 BGPasaService 对象
您可以通过创建 BGPAsAService 对象在集群中启用 BGPaaS。
BGPAsAService通过创建在 kind: 字段中使用的 BGPAsAService
YAML 文件来创建对象:
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 之间的任何整数。 |
bgpAsAServiceSessionAttributes: |
定义 BGPaaS 的 BGP 会话属性。
参见
表 2。
|
虚拟机接口引用: |
定义在使用虚拟机接口引用时要与 BGPaaS 关联的虚拟机接口参数。
参见
表 3。
|
虚拟机接口选择器: |
定义使用虚拟机接口选择器时运行 BGPaaS 的虚拟网络。
请参阅
表 4。
|
字段 | 说明 |
---|---|
本地自治系统: |
指定 BGP 的本地自治系统编号。 |
循环计数: |
指定在丢弃路由之前可以在路由更新中看到相同 ASN 的次数。 循环计数: 可以是 16 以内的任何整数。 |
路由源覆盖: |
转发路由时,覆盖原始设置并将 origin 属性设置为 不完整 。 如果将此字段设置为 false,则会根据源设置将路由播发到 BGP 中。原点为 IGP 或 EGP,并使用此文件中的 原点: 字段进行设置。 如果将此字段设置为 true,则播发路由的起点将设置为 不完整 。 如果要更改 BGP 网络如何确定从 BGP 服务接收的路由的优先级,请使用此字段。默认情况下,BGP 网络根据源对路由进行优先级排序,源 不完整 的路由的优先级低于从 IGP 或 EGP 接收的路由。 |
起源: |
指定 BGP 是作为内部网关协议 (igp) 还是外部网关协议 (egp) 运行。默认路由原点为 igp。 |
地址族: |
指定地址族。您可以将该族指定为 IPv4 的 inet 或 IPv6 的 inet6 。您可以同时指定两个地址族。 |
字段 | 说明 |
---|---|
API 版本: |
指定虚拟机接口引用的 API 版本。 |
种类: |
始终将此字段设置为 “虚拟机接口”。 |
命名 空间: |
指定与虚拟机接口引用关联的命名空间。您可以在创建 Pod 对象时定义此命名空间。请参见 使用虚拟机接口参考在容器中启用 BGPaaS。 |
名字: |
指定与虚拟机接口引用关联的容器的名称。您可以通过输入 kubectl get vmi -n bgpaas-ns 命令来检索 pod 名称。请参见 使用虚拟机接口参考在容器中启用 BGPaaS。 |
字段 | 说明 |
---|---|
匹配标签: |
定义虚拟机接口选择器的匹配标签。 此上下文中的匹配标签始终用于引用运行虚拟机接口选择器的虚拟网络。 始终在此部分中输入匹配标签值为 core.juniper.net/bgpaasVN:虚拟网络名称。请参见 使用虚拟机接口选择器在容器中启用 BGPaaS。 |
验证 BGP 即服务配置
提交 BGPAsA 服务对象文件后,应确认 BGPaaS 对象已成功运行。
创建 BGPAsAService 对象后,输入 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
在容器中配置 BGP
您还必须为容器中运行的 BGP 服务配置网络参数。每个单独的 BGP 服务的配置都是唯一的。记录所需的网络配置参数超出了本文档的范围。请查看 BGP 服务随附的文档。
在此示例中,我们将向您展示如何使用 BIRD 配置 BGP 网络配置。
在此示例中,您将使用 BIRD CLI 配置 BGP。需要与云原生 Contrail 网络中定义的 BGPaaS 对象匹配的 BGP 配置参数。尽管此示例中未显示,但您应该知道,在大多数部署中访问 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 协议 命令以验证是否已在 BIRD 中建立 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