Contrail 浮动 IP
在相同或不同的命名空间内的两个箱之间讨论和测试通信,但到’目前为止,它已在同一个群集中。如何与群集外部的设备通信?
您可能已经知道,在传统(OpenStack) Contrail 环境中,叠加实体(通常是虚拟机)访问互联网有多种方式。最常用的三种方法是:
浮动 IP
结构 SNAT
逻辑路由器
首选 Kubernetes 解决方案是通过以下方式公开任何服务 service
及 Ingress
对象,您可以’在第3章中阅读。在 Contrail Kubernetes 环境中,浮动 IP 用于服务和入口实施中,使其向群集外部的’内容公开。本章稍后将讨论这两个对象中的每一个。但首先,让’我们回顾一下浮动 IP 基础,并了解它如何与 Kubernetes 协同工作。
T4000 路由器不支持 fabric SNAT
及 logical router
叠加工作负载(VM 和 pod)用于到达互联网,但不可能从相反方向初始化通信。但是 floating
IP 支持从两个方向–初始化的流量您可以将其配置为支持入口流量、外出流量或两者兼有,默认值为双向。这本书仅关注 floating
IP。有关结构 SNAT 和逻辑路由器的详细信息,请参阅 Contrail 文档:https://www.juniper.net/ documentation/en_US/contrail5.0/information-products/pathway-pages/contrail-feature-guide-pwp.html.
浮动 IP 和浮动 IP 池
T4000 路由器不支持 floating
IP 或 FIP 对于短期而言是一种传统概念,Contrail 自其早期版本以来受到支持。本质上,’它是将虚拟机 IP (通常是专用 ip 地址)映射到可从群集外部到达的公共 ip (此上下文中的浮动 ip)的一种 OpenStack 概念。在内部,由 NAT 实施一对一映射。每当 vRouter 从群集外部接收发往浮动 IP 的数据包时,它都会将其转换为 VM’的专用 ip,并将数据包转发至 vm。同样,它将按相反的方向进行转换。最终,VM 和 Internet 主机可以相互对话,并且两者都可以发起通信。
VRouter 是一种 Contrail 转发平面,驻留在处理工作负载流量的每个计算节点中。
Figure 1显示了浮动 IP 的基本工作流。
以下是有关要牢记的浮动 IP 的一些要点:
与虚拟机’相关联的浮动 IP
port
或 VMI (虚拟机接口)。浮动 IP 从
FIP pool
.浮动 IP 池基于虚拟网络创建(
FIP-VN
) 中减去衰减或链路损耗 (LL) 之后可用的功率。通过设置匹配,FIP-VN 将在群集外部提供
route-target (RT)
网关路由器’VRF 表的属性。当网关路由器在 RT 中看到与其路由导入策略的匹配项时,它会将路由加载到其 VRF 表中。连接到 VRF 表的所有远程客户端都将能够与该浮动 IP 通信。
Contrail Kubernetes 环境中没有关于浮动 IP 概念和角色的新增内容。但在 Kubernetes 扩展了浮动 IP 的使用 service
及 ingress
对象实施,它对访问 Kubernetes 起着重要的作用 service
及 ingress
外置. 您可查看本章节的稍后部分了解更多详细信息。
创建 FIP 池
让’我们以三步的过程创建一个浮动 IP 池:
创建公共浮动 IP-VN。
为虚拟网络设置 RT (路由目标),使其可被通告并导入网关路由器’的 VRF 表中。
基于公共浮动 IP 虚拟网络创建浮动 IP 池。
同样,这里没有什么新内容。不 Kubernetes 的其他 Contrail 环境中也需要相同的步骤。但是,正如’您在前几节中了解的那样,借助 Contrail Kubernetes 集成,浮动 IP 虚拟网络现在可以 Kubernetes 样式中创建。
创建名为 vn 的公共浮点 IP 虚拟网络-ns-默认值
# vn-ns-default.yaml apiVersion: k8s.cni.cncf.io/v1 kind: NetworkAttachmentDefinition metadata: annotations: "opencontrail.org/cidr": "101.101.101.0/24" name: vn-ns-default spec: config: '{ "cniVersion": "0.3.0", "type": "contrail-k8s-cni" }' $ kubectl apply -f vn-ns-default.yaml networkattachmentdefinition.k8s.cni.cncf.io/vn-ns-default created $ kubectl get network-attachment-definitions.k8s.cni.cncf.io NAME AGE vn-ns-default 22d
现在设置路由目标。
如果您需要通过网关路由器从互联网访问的浮动 IP,您’需要为在网关路由器’VRF 表中导入的虚拟网络前缀设置路由目标(见Figure 2)。只要需要互联网接入,就必须执行此步骤。
用于设置 RT 的 UI 导航路径为:Contrail 命令 > 主菜单 > 叠加 > 虚拟网络 > k8s-vn-ns-default-pod-网络 > 编辑 > 路由、桥接和策略。
现在,’让我们基于公共虚拟网络创建一个浮动 IP 池。
这是最后一步。从 Contrail 命令 UI 中,基于公共虚拟网络创建一个浮动 IP 池。此设置的 UI 导航路径如Figure 3所示:Contrail 命令 > 主菜单 > 叠加 > 浮动 IP > Create。
Contrail 用户界面还允许您在虚拟网络高级选项中设置外部标志,以便自动创建名为public的浮动 IP 池。
浮动 IP 池作用域
在 Contrail Kubernetes 环境中引用浮动 IP 池的方式不同,并且相应的池范围也将有所不同。具有降序优先级的三个可能的级别为:
特定对象
命名空间级别
全局级别
特定对象
这是最特定的范围级别。对象特定的浮动 IP 池仅将自身绑定到您指定的对象,它不会影响同一命名空间或群集中的任何其他对象。例如,您可以指定一个服务对象 web
从浮动 IP 池中获取浮动 IP pool1
、服务对象 dns
从另一个浮动 IP 池获取浮动 IP pool2
等. 这为对象–提供了对浮动 IP 的分配位置的最细粒度控制,您需要在 YAML 文件中为每个对象明确指定此开销。
命名空间级别
在多租户环境中,每个命名空间都将与一个租户相关联,并且每个租户都将具有专用的浮动 IP 池。在这种情况下,最好具有在 NS 级别定义浮动 IP 池的选项,以便在该命名空间中创建的所有对象都将从该池中获取浮点 IP 分配。定义了命名空间级别池(例如, pool-ns-default
),无需再在每个对象’的 YAML 文件中指定浮动 IP 池名称。您仍然可以提供不同的池名称,例如 my-webservice-pool
对象中 webservice
. 在这种情况下,对象 webservice 将从 my-webservice-pool
而不是从命名空间级别池 pool-ns-default
,因为前者更具体一些。
全局级别
全局级别池的范围将是整个群集。任何命名空间中的对象均可使用全局浮动 IP 池。
您可以结合这三种方法来利用其组合的灵活性。下面’是一个切实可行的示例:
定义全局池
pool-global-default
,因此命名空间中未定义命名空间级或 ject 级池的任何对象都将从该池获取一个浮动 IP。对于 ns
dev
,请定义一个浮动 IP 池pool-dev
,因此在 ns 中创建的所有对象dev
默认情况下将从pool-dev
.对于 ns
sales
,请定义一个浮动 IP 池pool-sales
,因此在 ns 中创建的所有对象sales
默认情况下将从pool-sales
.对于 ns
test-only
,不要定义任何命名空间级池,因此在其中创建的默认对象将从pool-global-default
.当服务
dev-webservice
ns 开发环境中的浮动 IP 需要pool-sales
而不是pool-dev
,指定pool-sales
indev-webservice
对象 YAML 文件将实现此目标。
只需记住经验–最明确的领域的规则。
对象浮动 IP 池
让’我们先来了解特定于对象的浮动 IP 池:
#service-web-lb-pool-public-1.yaml apiVersion: v1 kind: Service metadata: name: service-web-lb-pool-public-1 annotations: "opencontrail.org/fip-pool": "{'domain': 'default-domain', 'project': 'k8s-ns-user-1', 'network': 'vn-public-1', 'name': 'pool-public-1'}" spec: ports: - port: 8888 targetPort: 80 selector: app: webserver type: LoadBalancer
在此示例中,服务 service-web-lb-pool-public-1
将从池中获取浮动 IP pool-public-1
,基于虚拟网络创建 vn-public-1
在当前项目下 k8s-ns-user-1
. 相应的 Kubernetes 命名空间为 ns-user-1
. 由于仅为此特定对象分配对象级浮动 IP 池,因此使用此方法时,需要为每个新对象显式分配一个浮动 IP 池。
NS 浮动 IP 池
下一个浮动 IP 池作用域位于命名空间级别。每个命名空间都可以定义其自己的浮动 IP 池。与 Kubernetes 注释对象相同,用于向虚拟网络提供子网,也用于指定浮动 IP 池。YAML 文件如下所示:
#ns-user-1-default-pool.yaml apiVersion: v1 kind: Namespace metadata: annotations: opencontrail.org/isolation: "true" opencontrail.org/fip-pool: "{'domain': 'default-domain', 'project': 'k8s-ns-user-1', 'network': 'vn-ns-default', 'name': 'pool-ns-default'}" name: ns-user-1
列出 ns-user-1
给定命名空间级别的浮动 IP 池名为 pool-ns-default
,并且相应的虚拟网络 vn-ns-default
. 一旦 ns-user-1
创建时使用此 YAML 文件,任何需要浮动 IP 的新服务(如果不使用其 YAML 文件中的对象特定池名称创建)都将获得从此池中分配的浮动 IP。在实践中,大多数命名空间(尤其是孤立的命名空间)都需要自己的命名空间默认池,因此您会经常在现场看到这种类型的配置。
全局浮动 IP 池
要指定全局级别的浮动 IP 池,您需要提供完全限定的池名称(domain > project > net-
work > name
)在 contrail-kube-manager (KM)
Docker’配置文件(/etc/contrail/contrail-kubernetes.conf
) 中减去衰减或链路损耗 (LL) 之后可用的功率。此文件根据其环境参数在启动期间由 Docker 自动生成,可在以下页面中找到: /etc/contrail/common_kubemanage
主节点中的 r env 文件:
$ cat /etc/contrail/common_kubemanager.env VROUTER_GATEWAY=10.169.25.1 CONTROLLER_NODES=10.85.188.19 KUBERNETES_API_NODES=10.85.188.19 RABBITMQ_NODE_PORT=5673 CLOUD_ORCHESTRATOR=kubernetes KUBEMANAGER_NODES=10.85.188.19 CONTRAIL_VERSION=master-latest KUBERNETES_API_SERVER=10.85.188.19 TTY=True ANALYTICS_SNMP_ENABLE=True STDIN_OPEN=True ANALYTICS_ALARM_ENABLE=True ANALYTICSDB_ENABLE=True CONTROL_NODES=10.169.25.19
您可以看到,这 .env
文件包含有关设置的重要环境参数。要指定 global FIP pool
,请添加以下行:
KUBERNETES_PUBLIC_FIP_POOL={'domain': 'default-domain','name':
'pool-global-default','network': 'vn-global-default','project': 'k8s-ns-user-1'}
它可读:全局浮动 IP 池称为 pool-global-default
它是基于虚拟网络定义的 vn-global-default
在项目 k8s-ns-user-1
. 这表示相应的 Kubernetes 命名空间为 ns-user-1
.
现在放置了这一配置,您可以重新编写 contrail-kube-manager
Docker 容器以使更改生效。实质上,您需要将其拉出,然后重新启动:
$ cd /etc/contrail/kubemanager/ $ docker-compose down;docker-compose up -d Stopping kubemanager_kubemanager_1 ... done Removing kubemanager_kubemanager_1 ... done Removing kubemanager_node-init_1 ... done Creating kubemanager_node-init_1 ... done Creating kubemanager_kubemanager_1 ... done
现在,为群集指定全局浮动 IP 池。
在所有三个作用域中,浮动 IP 自动分配并与服务和入口对象相关联。如果必须将浮动 IP 与盒相关联,则必须手动执行此操作。我们’将在下一节中讨论这一点。
用于盒式浮动 IP
创建并提供浮动 IP 池后,可以从需要的盒式 IP 池中为其分配一个浮动 ip。通过将浮动 IP 与 VMI (VM 或 pod 接口)相关联,您可以在 Contrail UI 中手动创建浮动 IP 池的浮动 IP,然后将其与 VMI 和Figure 4和4.9 中的 pod)相关联Figure 5
确保浮动 IP 池已共享到将要创建浮动 IP 的项目。
公布浮动 IP
将浮动 IP 与 pod 接口相关联后,即可将其通告至 MP BGP 对等方,这些对等端通常是网关路由器。以下数字、 Figure 6、 Figure 7和Figure 8显示了如何添加和编辑 BGP 对等体。
输入所有 BGP 对等体信息,并不要’忘记关联控制器,如Figure 9中所示。
从下拉 peer
在 Associated Peers
,请选择您尝试添加的此新 BGP 路由器对等方的控制器。单击 save
完成时。将弹出一个带有路由器类型路由器的新 BGP 对等体。
现在,’我们添加了一方 BGP 路由器作为类型路由器。对于本地 BGP 发言者(使用类型控制节点),只需通过单击 Edit 按钮再次检查参数。在此测试中,我们想要在 Contrail 控制器和网关路由器之间构建一个 MP IBGP neighborship,因此请确保 ASN 和地址系列字段两端匹配,请参阅Figure 11。
现在您可以在网关路由器中检查 BGP neighborship 状态:
labroot@camaro> show bgp summary | match 10.169.25.19 10.169.25.19 60100 2235 2390 0 39 18:19:34 Establ
建立 neighborship 后,将在两个扬声器之间交换 BGP 路由,也就是说,当我们’看到分配给 Kubernetes 对象的浮动 IP 由主节点(10.169.25.19)通告并在网关路由器中获知时:
labroot@camaro> show route table k8s-test.inet.0 101.101.101.2 Jul 11 01:18:31 k8s-test.inet.0: 8 destinations, 8 routes (8 active, 0 holddown, 0 hidden) @ = Routing Use Only, # = Forwarding Use Only + = Active Route, - = Last Active, * = Both 101.101.101.2/32 *[BGP/170] 00:01:42, MED 200, localpref 100, from 10.169.25.19 AS path: ? validation-state: unverified, > via gr-2/3/0.32771, Push 47
T4000 路由器不支持 detail
相同命令的版本告诉更多:浮动 IP 路由将从 Contrail troller 中反映出来,但 Protocol next hop
成为计算节点(10.169.25.20
)表示将浮动 IP 分配给计算节点。此计算节点中当前运行的一个实体拥有浮动 IP:
labroot@camaro> show route table k8s-test.inet.0 101.101.101.2 detail | match "next hop" Jul 11 01:19:18 Next hop type: Indirect, Next hop index: 0 Next hop type: Router, Next hop index: 1453 Next hop: via gr-2/3/0.32771, selected Protocol next hop: 10.169.25.20 Indirect next hop: 0x900e640 1048601 INH Session ID: 0x70f
动态软 GRE 配置使网关路由器自动创建软 GRE 通道接口:
labroot@camaro> show interfaces gr-2/3/0.32771 Jul 11 01:19:53 Logical interface gr-2/3/0.32771 (Index 432) (SNMP ifIndex 1703) Flags: Up Point-To-Point SNMP-Traps 0x4000 IP-Header 10.169.25.20:192.168.0.204:47:df:64:0000000800000000 Encapsulation: GRE-NULL Copy-tos-to-outer-ip-header: Off, Copy-tos-to-outer-ip-header-transit: Off Gre keepalives configured: Off, Gre keepalives adjacency state: down Input packets : 0 Output packets: 0 Protocol inet, MTU: 9142 Max nh cache: 0, New hold nh limit: 0, Curr nh cnt: 0, Curr new hold cnt: 0, NH drop cnt: 0 Flags: None Protocol mpls, MTU: 9130, Maximum labels: 3 Flags: None
T4000 路由器不支持 IP-Header
指示 GRE 外部 IP 标头,因此通道基于当前 BGP 本地地址的网关路由器 192.168.0.204
到远程节点 10.169.25.20
,在这种情况’下,它是 Contrail 计算节点之一。浮动 IP 通告过程如Figure 12所示。