Help us improve your experience.

Let us know what you think.

Do you have time for a two-minute survey?

 
 

Contrail 与 Kubernetes 集成

Contrail 4.0 版支持容器网络接口 (CNI),用于将 Contrail 与 Kubernetes 自动化平台集成。

什么是 Kubernetes?

Kubernetes(也称为 K8s)是一个开源平台,用于跨主机群集自动部署、扩展和操作应用程序容器,从而提供以容器为中心的基础架构。它提供了一个跨公共云和私有云的便携式平台。Kubernetes 支持应用程序的部署、扩展和自动修复。

Kubernetes 支持称为容器网络接口 (CNI) 的可插拔框架,用于大多数基本网络连接,包括容器 Pod 寻址、网络隔离、基于策略的安全性、网关、SNAT、负载均衡器和用于 Kubernetes 编排的服务链功能。Contrail 4.0 版为 CNI for Kubernetes 提供支持。

Kubernetes 提供了一个扁平的网络模型,在这个模型中,所有容器 Pod 都可以相互通信。添加了网络策略以在 Pod 之间提供安全性。与 Kubernetes 集成的 Contrail 增加了额外的网络功能,包括多租户、网络隔离、使用网络策略的微分段、负载平衡等。

表 1 列出了 Kubernetes 概念和 OpenContrail 资源之间的映射。

表 1: Kubernetes 到 OpenContrail 的映射
Kubernetes OpenContrail 资源

命名 空间

共享或单个项目

Pod

虚拟机、接口、实例 IP

服务

基于 ECMP 的本机负载均衡器

入口

基于 HAProxy 的 L7 负载均衡器,用于 URL 路由

网络策略

基于命名空间和 Pod 选择器的安全组

什么是 Kubernetes Pod?

Kubernetes Pod 是一组一个或多个容器(例如 Docker 容器)、这些容器的共享存储以及如何运行容器的选项。Pod 始终位于同一位置和共同调度,并在共享上下文中运行。Pod 的共享上下文是一组 Linux 命名空间、cgroup 和其他隔离方面。在 Pod 的上下文中,单个应用程序可能会应用进一步的子隔离。

您可以在以下位置找到有关 Kubernetes 的更多信息: http://kubernetes.io/docs/whatisk8s/

与 Kubernetes 集成的 Contrail 的配置模式

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 实现的,则只能通过 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 创建虚拟网络,然后才能在容器或命名空间规范中进行配置。

嵌套模式

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”:这是默认模式。选择此 服务类型 可使服务可通过群集网络访问。

  • “负载均衡器”:将 服务类型 指定为 “负载均衡器” ,可以从外部访问该服务。 “LoadBalancer” _Service_ 同时分配了 CluserIP 和 ExternalIP 地址。此 服务类型 假定用户已使用浮动 IP 池配置了公用网络。

Contrail Kubernetes 服务集成支持 TCP 和 UDP 协议。此外,服务可以公开端口和目标端口不同的多个端口。例如:

Kubernetes 用户可以为 LoadBalancerclusterIP ServiceType指定 spec.clusterIP 和 spec.externalIP。

如果 ServiceTypeLoadBalancer ,并且用户未指定 spec.externalIP,则 contrail-kube-manager 会从公共池中分配一个浮动 ip,并将其与 ExternalIP 地址相关联。

入口

Kubernetes 服务可以通过多种方式在外部公开,也可以在集群外部公开。有关在外部公开 Kubernetes 服务的所有方法的列表,请参阅 https://kubernetes.io/docs/concepts/services-networking/ingress/#alternatives 。入口就是这样一种方法。入口提供第 7 层负载平衡,而其他方法提供第 4 层负载平衡。Contrail 支持基于 http 的单服务入口、简单扇出入口和基于名称的虚拟主机入口。

Contrail Kubernetes 解决方案

Contrail Kubernetes 解决方案包含以下元素。

Contrail Kubernetes Manager

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 层本机非代理负载平衡。实例 ip (service-ip) 链接到服务中每个容器的端口。这会在 Contrail 中创建 ECMP 下一跃点,并直接从源 Pod 对流量进行负载平衡。

适用于 Kubernetes 入口的 HAProxy Loadbalancer

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 会随着容器和标签的添加和删除而动态更新。

域名服务器 (DNS)

Kubernetes 使用 SkyDNS 实现 DNS,SkyDNS 是一个小型 DNS 应用程序,用于响应来自 Pod 的服务名称解析的 DNS 请求。SkyDNS 在 Kubernetes 中作为一个 pod 运行。