Contrail 与 Kubernetes 集成
Contrail 网络支持容器网络接口 (CNI),用于将 Contrail 与 Kubernetes 自动化平台集成。
什么是 Kubernetes?
Kubernetes(也称为 K8s)是一个开源平台,用于跨主机集群自动部署、扩展和运维应用容器,从而提供以容器为中心的基础架构。它提供了一个跨公共云和私有云的可移植平台。Kubernetes 支持应用的部署、扩展和自动修复。
Kubernetes 支持称为容器网络接口 (CNI) 的可插拔框架,适用于大多数基本网络连接,包括容器 Pod 寻址、网络隔离、基于策略的安全性、网关、SNAT、负载平衡器和用于 Kubernetes 编排的服务链功能。Contrail 4.0 版支持适用于 Kubernetes 的 CNI。
Kubernetes 提供了一个扁平化的网络模型,所有容器 Pod 都可以在这个模型中相互通信。添加网络策略以在 Pod 之间提供安全性。Contrail 与 Kubernetes 集成增加了额外的网络功能,包括多租户、网络隔离、带有网络策略的微分段、负载平衡等。
表 1 列出了 Kubernetes 概念与 OpenContrail 资源之间的映射。
Kubernetes | OpenContrail 资源 |
Namespace |
共享或单个项目 |
荚 |
虚拟机、接口、实例-IP |
服务 |
基于 ECMP 的原生负载均衡器 |
入口 |
用于 URL 路由的基于 HAProxy 的 L7 负载均衡器 |
网络策略 |
基于命名空间和 Pod 选择器的安全组 |
什么是 Kubernetes Pod?
Kubernetes Pod 是一组一个或多个容器(如 Docker 容器)、这些容器的共享存储以及如何运行容器的选项。Pod 始终位于同一地点和共同调度位置,并在共享上下文中运行。Pod 的共享上下文是一组 Linux 命名空间、cgroup 和其他隔离方面。在 Pod 的上下文中,各个应用程序可能会应用进一步的子隔离。
有关 Kubernetes 的更多信息,请访问: http://kubernetes.io/docs/whatisk8s/。
Contrail 与 Kubernetes 集成的配置模式
Contrail 可以在 Kubernetes 中以多种不同的模式进行配置。本节介绍各种配置模式。
默认模式
在 Kubernetes 中,所有 Pod 都可以与所有其他 Pod 通信,而无需使用网络地址转换 (NAT)。这是 Contrail Kubernetes 群集的默认模式。在默认模式下,Contrail 会创建一个由所有命名空间共享的虚拟网络,从中分配服务和 Pod IP 地址。
在 Kubernetes 集群中生成的所有命名空间中的所有 Pod 都能够相互通信。所有 Pod 的 IP 地址都是从 Contrail Kubernetes 管理器中配置的 Pod 子网中分配的。
在 kube-system 命名空间中生成的系统 Pod 不会在 Kubernetes 集群中运行;它们在底层运行,Contrail 不处理这些 Pod 的网络。
命名空间隔离模式
除了 Kubernetes 规定的默认网络模型外,Contrail 还支持其他自定义网络模型,这些模型使 Kubernetes 群集的用户能够使用 Contrail 的诸多丰富功能。其中一个功能是 Kubernetes 命名空间的网络隔离。
对于命名空间隔离模式,群集管理员可以配置命名空间注释以启用隔离。因此,除非将安全组或网络策略明确定义为允许访问,否则无法从其他命名空间访问该命名空间中的服务。
通过对 Kubernetes 命名空间元数据进行注释,可以将 Kubernetes 命名空间配置为隔离:
opencontrail.org/isolation : true
命名空间隔离可以为 Pod 提供网络隔离,因为隔离命名空间中的 Pod 无法被集群中其他命名空间中的 Pod 访问。
命名空间隔离还为 Pod 提供服务隔离。如果任何 Kubernetes 服务是由独立命名空间中的 Pod 实现的,则这些 Pod 只能通过 Kubernetes service-ip 访问同一命名空间中的 Pod。
要使其他命名空间仍可访问服务,可以通过对命名空间的以下附加注释来禁用服务隔离:
opencontrail.org/isolation.service : false
禁用服务隔离使得其他命名空间中的 Pod 可以访问服务,但隔离命名空间中的 Pod 仍然无法访问其他命名空间中的 Pod。
对 Pod 和服务隔离都注释为“隔离”的命名空间具有以下网络行为:
在隔离命名空间中创建的所有 Pod 彼此之间都具有网络可访问性。
Kubernetes 集群中其他命名空间中的 Pod 无法 访问隔离命名空间中的 Pod。
在独立命名空间中创建的 Pod 可以 访问非独立命名空间中的 Pod。
独立命名空间中的 Pod 可以 访问 Kubernetes 集群中任何命名空间中的非独立服务。
来自其他命名空间的 Pod 无法 访问独立命名空间中的服务。
如果禁用了服务隔离且仅启用了 Pod 隔离,则标记为“隔离”的命名空间具有以下网络行为:
在隔离命名空间中创建的所有 Pod 彼此之间都具有网络可访问性。
Kubernetes 集群中其他命名空间中的 Pod 无法 访问隔离命名空间中的 Pod。
在隔离命名空间中创建的 Pod 可以 访问其他命名空间中的 Pod。
独立命名空间中的 Pod 可以 访问 Kubernetes 集群中任何命名空间中的非独立服务。
来自其他命名空间的 Pod 可以 访问隔离命名空间中的服务。
自定义隔离模式
管理员和应用程序开发人员可以添加注释来指定要在其中置备命名空间中的 Pod 或所有 Pod 的虚拟网络。指定此自定义虚拟网络的注释为:
"opencontrail.org/network: <fq_network_name>"
如果在 Pod 规格上配置了此注释,则 Pod 将在该网络中启动。如果在命名空间规范中配置了注释,则命名空间中的所有 Pod 都将在提供的网络中启动。
必须先使用 Contrail VNC API 或 Contrail-UI 创建虚拟网络,然后才能在 Pod 或命名空间规范中配置虚拟网络。
嵌套模式
Contrail 支持在 OpenStack 群集内配置 Kubernetes 群集。虽然这种群集嵌套本身并不是唯一的,但 Contrail 提供了一个 折叠 的控制和数据平面,其中单个 Contrail 控制平面和一个网络堆栈可以同时管理和维护 OpenStack 和 Kubernetes 群集。借助统一的控制和数据平面,这些群集的互连和配置是无缝的,并且没有复制和重复性使其成为一个非常有效的选择。
在嵌套模式下,Kubernetes 集群在 OpenStack 集群的虚拟机中置备。Kubernetes 集群的 CNI 插件和 Contrail-kubernetes 管理器直接与管理 OpenStack 集群的 Contrail 组件连接。
在嵌套模式部署中,所有 Kubernetes 特性、功能和规格都将按原样得到支持。嵌套部署扩展了 Kubernetes 的边界和限制,使其能够与底层 OpenStack 群集在同一平面上运行。
有关更多信息,请参阅 Kubernetes 群集的预配。
Kubernetes 服务
Kubernetes 服务是一个抽象层,用于定义一组逻辑 Pod 和用于访问这些 Pod 的策略。实现服务的 Pod 集是根据服务定义中的 LabelSelector 字段选择的。在 Contrail 中,Kubernetes 服务是作为 ECMP 原生负载平衡器实现的。
Contrail Kubernetes 集成支持以下 ServiceType:
“clusterIP”:这是默认模式。选择此 ServiceType 可通过群集网络访问服务。
“LoadBalancer”:将 ServiceType 指定为 “LoadBalancer” ,可以从外部访问服务。 为“LoadBalancer”_Service_ 分配了 CluserIP 和 ExternalIP 地址。此 ServiceType 假定用户已使用浮动 IP 池配置公共网络。
Contrail Kubernetes 服务集成支持协议的 TCP 和 UDP。此外,Service 可以公开多个端口,其中 port 和 targetPort 不同。例如:
kind: Service apiVersion: v1 metadata: name: my-service spec: selector: app: MyApp ports: - name: http protocol: TCP port: 80 targetPort: 9376 - name: https protocol: TCP port: 443 targetPort: 9377
Kubernetes 用户可以为 LoadBalancer 和 clusterIP ServiceType指定 spec.clusterIP 和 spec.externalIPs。
如果 ServiceType 为 LoadBalancer ,并且用户未指定 spec.externalIP,则 contrail-kube-manager 将从公共池中分配一个浮动 IP,并将其与 ExternalIP 地址相关联。
入口
Kubernetes 服务可以通过多种方式在外部公开,也可以在群集外部公开。请参阅 https://kubernetes.io/docs/concepts/services-networking/ingress/#alternatives ,查看在外部公开 Kubernetes 服务的所有方法的列表。Ingress 就是这样一种方法。Ingress 提供第 7 层负载平衡,而其他方法提供第 4 层负载平衡。Contrail 支持基于 http 的单服务入口、简单扇出入口和基于名称的虚拟主机入口。
Contrail Kubernetes 解决方案
Contrail Kubernetes 解决方案包括以下元素。
- Contrail Kubernetes 管理器
- 适用于 Kubernetes 服务的 ECMP 负载平衡器
- 用于 Kubernetes 入口的 HAProxy 负载均衡器
- Kubernetes 安全组网络策略
- Kubernetes 安全策略支持
- 域名服务器 (DNS)
- 支持的 Kubernetes 注解
Contrail Kubernetes 管理器
Contrail Kubernetes 实施需要侦听 Kubernetes API 消息并在 Contrail API 数据库中创建相应的资源。
新模块 contrail-kube-manager 在 Docker 容器中运行,以侦听来自 Kubernetes API 服务器的消息。
适用于 Kubernetes 服务的 ECMP 负载平衡器
Kubernetes 中的每项服务都由负载平衡器对象表示。Kubernetes 分配的服务 IP 用作负载均衡器的 VIP。将为服务侦听的端口创建侦听器。每个 Pod 都会作为侦听器池的一个成员添加。contrail-kube-manager 会监听基于服务标签或 Pod 标签的任何更改,并使用任何已添加、更新或删除的 Pod 更新成员池列表。
服务的负载平衡是基于 ECMP 的第 4 层原生非代理负载平衡。instance-ip (service-ip) 链接到服务中每个 Pod 的端口。这会在 Contrail 中创建一个 ECMP 下一跃点,并直接从源 Pod 对流量进行负载平衡。
用于 Kubernetes 入口的 HAProxy 负载均衡器
Kubernetes Ingress 是通过 Contrail 中的 HAProxy 负载均衡器功能实现的。每当在 Kubernetes 中配置入口时,contrail-kube-manager 都会在 contrail-controller 中创建负载均衡器对象。Contrail 服务监控器会侦听负载平衡器对象,并根据主动-备用模式下的入口规范规则,以适当的配置启动 HAProxy。
有关负载均衡器的详细信息 ,请参阅在 Contrail 中使用负载均衡器 。
Kubernetes 安全组网络策略
Kubernetes 网络策略是允许 Pod 组如何相互通信以及其他网络端点通信的规范。 NetworkPolicy 资源使用标签来选择 Pod 并定义白名单规则,这些规则除了允许流量流向给定命名空间的隔离策略之外,还允许流向所选 Pod 的流量。
有关 Kubernetes 网络策略的更多信息,请参阅 https://kubernetes.io/docs/concepts/services-networking/networkpolicies/。
contrail-kube-manager 监听 Kubernetes 网络策略事件以进行创建、更新和删除,并将 Kubernetes 网络策略转换为应用于虚拟机接口 (VMI) 的 Contrail 安全组对象。VMI 会随着 Pod 和标签的添加和删除而动态更新。
Kubernetes 安全策略支持
在 Kubernetes 环境中创建的网络策略是使用 Contrail 安全性策略框架实施的。Kubernetes 环境中的标签会在 Contrail 中作为标记公开。从 Contrail 5.0 版开始,您可以为 Kubernetes 环境定义标记。Contrail 安全策略使用这些标记来实施指定的 Kubernetes 策略。您可以在用户界面中定义标签,也可以上传JSON格式的配置。新定义的标记可用于在 Contrail 安全性中创建和实施策略。
域名服务器 (DNS)
Kubernetes 使用 SkyDNS 实现 DNS,SkyDNS 是一个小型 DNS 应用程序,用于响应来自 Pod 的服务名称解析的 DNS 请求。SkyDNS 在 Kubernetes 中作为 Pod 运行。
支持的 Kubernetes 注解
目前,Contrail 网络支持以下 Kubernetes 注释:
'opencontrail.org/network': '{"domain":"default-domain", "project": "k8s-contrail", "name":"deu"}' 'opencontrail.org/isolation': 'true' 'opencontrail.org/fip-pool': '{"domain": "default-domain", "project": "k8s-default", "network": "k8s-default-svc-public", "name": "default"}'
有关详细信息,请参阅 https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/。