创建隔离命名空间
总结 本主题介绍如何在云原生 Contrail® 网络™中创建隔离的命名空间。瞻博网络支持 在 Kubernetes 编排的环境中使用 Contrail 网络 22.1 或更高版本的隔离命名空间。
命名空间概述
在本文档中,我们仅在 Contrail 网络的上下文中使用术语“隔离”和“非隔离”。
非隔离命名空间
命名空间或非隔离命名空间提供了一种机制,用于隔离单个群集中的一组资源。默认情况下,命名空间不是隔离的。
非隔离命名空间适用于许多用户分布在多个团队或项目中的环境。非隔离命名空间使每个团队都可以存在于自己的虚拟群集中,而不会影响彼此的工作。假设你在 Kubernetes 提供的默认命名空间中创建了所有资源。如果具有多个部署的复杂应用程序,则默认命名空间可能难以维护。管理此部署的一种更简单方法是将所有资源分组到群集中的不同命名空间中。例如,群集可以包含单独的命名空间,例如数据库命名空间或监控数据库。资源的名称在命名空间中必须是唯一的,但不能跨命名空间是唯一的。
非隔离命名空间中的 Pod 表现出以下网络行为:
-
非隔离命名空间中的 Pod 无需使用 NAT 即可与集群中的其他 Pod 通信。
-
非隔离命名空间中的 Pod 和服务共享相同的
default-podnetwork
和default-servicenetwork
.
独立命名空间
使用独立命名空间可以运行要保持私密的客户特定应用程序。您可以创建隔离命名空间以将容器与其他容器隔离,而无需显式配置网络策略。
隔离命名空间类似于非隔离命名空间,不同之处在于每个隔离命名空间都有自己的 Pod 网络和服务网络。这意味着隔离命名空间中的 Pod 无法访问其他隔离或非隔离命名空间中的 Pod 或服务。
隔离命名空间中的 Pod 只能与同一命名空间中的 Pod 通信。唯一的例外是当隔离命名空间中的 Pod 需要访问 Kubernetes 服务(例如核心 DNS)时。在这种情况下,Pod 使用集群来 default-servicenetwork
访问服务。
隔离命名空间中的 Pod 表现出以下网络行为:
-
隔离命名空间中的 Pod 只能与同一命名空间中的 Pod 通信。
-
隔离命名空间中的 Pod 可以访问非隔离命名空间中的服务。
-
隔离命名空间中 Pod 的 IP 地址和服务 IP 地址是从与群集的 Pod 和服务子网相同的子网中分配的。
-
隔离命名空间中的 Pod 可以通过 IP 交换矩阵转发和交换矩阵源 NAT 访问底层网络或 IP 交换矩阵网络。
示例:独立命名空间配置
此示例配置演示了云原生 Contrail 网络中的独立命名空间配置。

在此隔离命名空间配置中:
-
Pod-1(非隔离-1)位于用户创建的非隔离命名空间中。
-
Pod-2 (kube-system) 和 Pod-3 (contrail) 位于控制器创建的非隔离命名空间中。
-
Pod-4(隔离-1)和 Pod-5(隔离-2)位于用户创建的隔离命名空间中。
-
Pod-1、Pod-2、Pod-3 的接口是从集群的
default-podnetwork
和default-servicenetwork
创建的。 -
Pod-4 和 Pod-5 的接口是在 和
default-podnetwork
default-servicenetwork
自己的隔离命名空间中创建的。Pod-4 和 Pod-5 接口与集群的default-podnetwork
和default-servicenetwork
共享同一子网。 -
隔离命名空间中的 Pod 无法与非隔离命名空间中的 Pod 通信。在此示例中,隔离命名空间中的 Pod-4 和 Pod-5 无法与非隔离命名空间中的 Pod-1、Pod-2、Pod-3 通信。
-
隔离命名空间(Pod-4、Pod 5)中的 Pod 可以通过群集的
default-servicenetwork
. -
所有命名空间(非隔离和隔离)中的 Pod 都能够通过群集的
ip-fabric-network
.
笔记
-
隔离的命名空间仅影响 Pod 的默认接口。这是因为隔离命名空间中 Pod 的默认接口是在隔离命名空间的 上
default-podnetwork
创建的。但是,来自用户定义的VirtualNetworks
接口在隔离和非隔离命名空间中的行为方式相同。 -
您可以在隔离的命名空间上创建网络策略,以微调 Pod 的隔离。对于隔离和非隔离命名空间,网络策略的行为相同。
-
两个或多个隔离的命名空间可以通过 (VNR) 互连
VirtualNetworkRouter
。请参见 虚拟网络路由器概述。
下面是用于互连 default-podnetworks
两个隔离命名空间(ns-isolated-1
和 ns-isolated-2
)的 VNR 配置示例。在此配置中,连接到 VirtualNetworkRouter
ns-isolated-1 和 ns-isolated-2,因此这些隔离命名空间中的 Pod 可以相互通信。
apiVersion: core.contrail.juniper.net/v1alpha1 kind: VirtualNetworkRouter metadata: namespace: ns-isolated-1 name: vnr-1 annotations: core.juniper.net/display-name: vnr-1 labels: vnr: vnr-1 spec: type: mesh virtualNetworkSelector: matchExpressions: - key: core.juniper.net/virtualnetwork operator: In values: - isolated-namespace-pod-virtualnetwork import: virtualNetworkRouters: - virtualNetworkRouterSelector: matchLabels: vnr: vnr-2 namespaceSelector: matchLabels: kubernetes.io/metadata.name: ns-isolated-2 --- apiVersion: core.contrail.juniper.net/v1alpha1 kind: VirtualNetworkRouter metadata: namespace: ns-isolated-2 name: vnr-2 annotations: core.juniper.net/display-name: vnr-2 labels: vnr: vnr-2 spec: type: mesh virtualNetworkSelector: matchExpressions: - key: core.juniper.net/virtualnetwork operator: In values: - isolated-namespace-pod-virtualnetwork import: virtualNetworkRouters: - virtualNetworkRouterSelector: matchLabels: vnr: vnr-1 namespaceSelector: matchLabels: kubernetes.io/metadata.name: ns-isolated-1
隔离命名空间对象
下表描述了控制器在创建独立命名空间时创建的命名空间对象(API 资源)。
隔离命名空间对象 | 说明 |
---|---|
default-podnetwork (VirtualNetwork) |
隔离命名空间中 Pod 的默认接口是在此 default-podnetwork 创建的,而不是集群的默认网络。 |
default-servicenetwork (VirtualNetwork) |
隔离命名空间中服务的群集 IP 将在此 default-servicenetwork 中创建,而不是群集的 default-servicenetwork . |
IsolatedNamespacePodServiceNetwork (VirtualNetworkRouter) |
此对象在隔离命名空间和 default-podnetwork default-servicenetwork 之间建立连接。 |
IsolatedNamespaceIPFabricNetwork (VirtualNetworkRouter) |
此对象在隔离命名空间和群集的 default-podnetwork default-servicenetwork ip-fabricnetwork . |
IsolatedNamespacePodToDefaultService (VirtualNetworkRouter) |
此对象在隔离命名空间 default-podnetwork 与群集的 default-servicenetwork . |
创建隔离命名空间
按照以下步骤创建隔离的命名空间:
可选配置:IP 交换矩阵转发和交换矩阵源 NAT
或者,您可以在隔离的命名空间上启用 IP 交换矩阵转发和结构源 NAT。
IP 交换矩阵转发支持将虚拟网络创建为底层网络的一部分,无需对数据进行封装和解封装。结构源 NAT 允许叠加网络中的 Pod 无需浮动 IP 或逻辑路由器即可访问互联网。
创建独立命名空间时,将创建两个虚拟网络:a 和 default-servicenetwork
a default-podnetwork
。默认情况下,这两个虚拟网络中的 IP 交换矩阵转发和结构源 NAT 处于禁用状态。通过在独立命名空间 YAML 文件中的每个功能添加“转发模式”注释,可以在虚拟网络中启用 IP 交换矩阵转发或结构源 NAT。
下面是 default-podnetwork
转发模式设置为 fabricSNAT
的独立命名空间的示例。
apiVersion: core.contrail.juniper.net/v1alpha1 kind: VirtualNetwork metadata: annotations: core.juniper.net/description: Default Pod Network for IsolatedNamespace (ns-isolated) core.juniper.net/display-name: default-podnetwork ... spec: ... fabricSNAT: true ...
启用 IP 交换矩阵转发
按照以下步骤在隔离的命名空间上启用 IP 交换矩阵转发:
启用结构源 NAT
您只能在 上 default-podnetwork
启用结构源 NAT。
按照以下步骤在隔离的命名空间上启用结构源 NAT: