在这个关于Antrea容器网络的博客中,我们将着重介绍Egress功能,并展示如何在vSphere with Tanzu 中使用它。
根据官方Antrea文档,Egress是一种Kubernetes自定义资源定义(CRD),它允许您为特定的Pod指定访问外部网络时使用的出口(SNAT)IP。当所选的Pod访问外部网络时,Egress流量将通过隧道传输到托管Egress IP的节点(如果它与Pod所在的节点不同),并在离开该节点时被SNAT到Egress IP。您可以在以下图片中看到流量的流向。
当Egress IP从externalIPPool中分配时,Antrea还自动提供了高可用性;即如果托管Egress IP的节点故障,将有另一个节点从externalIPPool的nodeSelector选择的其余节点中被选举出来。
注意:备用节点不仅会接管IP,还会通过二层广播(例如IPv4的Gratuitous ARP)来通知网络上的其他主机和路由器该IP关联的MAC地址已更改。
如果以下任何一项符合您的需求,您可能会想要使用Egress功能:
- 当一些特定Pod连接到集群外的服务时,您希望它们使用一个一致的IP地址,便于审计日志溯源或在外部防火墙中按源IP进行过滤等。
- 您想要强制外部连接通过特定节点离开集群,以进行安全控制或克服网络拓扑限制。
您也可以使用可路由的Pod来实现相同的效果。但是,使用Egress功能,您可以精确控制哪些Pod具有此功能(而不是一刀切)。
TKG的特性开关和配置变量
开源Antrea 1.6版(及以上)默认启用了Egress特性开关。由于 VMware Antrea 企业版具有不同的发布计划,因此我们需要检查是否已启用 vSphere with Tanzu 或 TKG 的Egress功能,如果未启用,则需要了解如何启用它。
TKG 1.6 引入了可在集群定义中使用的 Antrea 配置变量,而不再需要给 TKG打补丁 或暂停会覆盖手动更改的 Kubernetes 控制器。
正如您所看到的,使用 TKG 1.6,出口功能已默认启用。所有其他可用的 Antrea 功能(例如 NODEPORTLOCAL、FLOWEXPORTER、MULITCAST 等)可以使用相应的变量进行配置。
vSphere 8 with Tanzu 的自定义资源定义(Custom Resource Definitions)
那么 vSphere 8 with Tanzu 呢?它有一个 Kubernetes CRD AntreaConfig 为您提供了配置 Antrea 所需的所有灵活性。在我们深入探讨此主题之前,让我们创建一个 supervisor 命名空间 tkg,覆盖默认设置并禁用 NAT 模式。这意味着工作节点 IP 是可路由的(否则 Egress 将没有太多意义),但 Pod IP 仍然是 NAT 的。在本次Egress演示中,我们使用的环境是 vSphere 8 with NSX 4.0.1.1 ,并选择了一个小型可路由命名空间网络段和一个 /28 子网前缀。
成功创建命名空间后,让我们检查一下NSX的配置:
如果您查看有关可路由 Pod 的 vSphere 8 文档,您可以看到对 antrea-nsx-routed CNI 的引用。
对于我们的演示,我们将使用基于 Cluster-API 的 ClusterClass 方法创建 TKG 集群。要启用 Egress(以及未来演示的其他一些功能),我们需要使用 AntreaConfig CRD 创建自己的 Antrea 配置。然而,将此配置关联到特定集群的方法有些特殊,我们需要使用特殊的命名约定。
下面的命令显示,在我们的 tkg 命名空间中已经有两个预定义的 AntreaConfig 对象可用。它们都将 Egress 设置为 false:
我们的集群名为 cluster-3,因此我们需要将 AntreaConfig 命名为 cluster-3-antrea-package(即必须将-antrea-package 添加到集群名称后面)。然后该 AntreaConfig 将自动被该集群使用。
注意:您应该使用单独的 YAML 文件存放 Antrea 配置!删除集群将自动删除相应的 AntreaConfig 资源。如果您将两个定义放在同一文件中,集群删除将会挂起!
Clusters, ClusterClass 和 Egress
现在是时候使用 Cluster资源创建我们的集群(而不再是 TanzuKubernetesCluster 资源类型),并配置 Egress。
该集群使用 Ubuntu 作为基本操作系统,并使用默认的 vSAN 存储策略。由于 ClusterClass 中尚未提供 NetworkClass,因此我们必须使用 AntreaConfig 命名约定。
注意:虽然集群节点是可路由的(而不是 NAT),但您不能直接 SSH 到它们,因为系统创建了分布式防火墙(DFW)规则来拒绝访问。
如果您需要直接访问集群节点,您需要创建一条特定的防火墙规则。或者,您可以按照官方vSphere 8文档使用某一台 supervisor VM 或 jumbox 容器登录到 worker 节点。
现在,其余的 Egress 配置就非常标准了。在切换到 cluster-3 上下文之后,我们首先定义一个 ExternalIPPool。由于 nodeSelector 为空,Antrea 将随机选择一个活动节点并指定一个备用节点。如果需要,您也可以配置专用的 Egress 节点。
如何选择配置中使用的CIDR和IP范围呢?由于我们的环境设置中自动为集群VM创建的NSX段使用的范围为10.221.193.49/28,我们将ExternalIPPool配置为使用该范围中的最后两个(未使用的)IP地址。
重要提示:这个标准方法使用了与集群VM在同一范围的IP地址作为Egress IP。由于这些Egress IP地址不受vSphere 8 with Tanzu管理,因此您必须小心,不要将集群规模扩展到使用此范围内的IP,以避免出现重复的IP地址。从技术上讲,您可以在ExternalIPPool中使用其他IP地址范围,并让Antrea通过BGP宣布这些设置和更改。但这是另一次讨论的话题。
让我们继续我们的配置。我们为prod命名空间中标记为web的Pod创建一个Egress资源,为staging命名空间中标记为web的Pod创建另一个Egress资源。
让我们按照 vSphere 8 的文档创建一个 jumpbox,以便访问上述的 cluster node cluster-3-node-pool-01-hgxk2-768974f9bc-l4fdq,该节点的 IP 地址为 10.221.193.52,这样我们就可以看到由 Antrea 创建的新接口 antrea-egress0,它有两个 IP 地址(10.221.193.61/32 和 10.221.193.62/32)。
接下来,我们创建两个命名空间 prod 和 staging,并在它们各自部署一个简单的 web 应用程序。
为了测试每个命名空间中的 Web Pod 是否使用不同的出口地址,让我们在 NSX 外部的 VM showip.tanzu.lab 上创建一个简单的 Web 应用程序,返回访问它的客户端的 IP 地址。
现在进行最后一项测试,展示不同命名空间中的 Pod 使用不同的出口地址访问我们的 Web 应用程序。
到这里,我们成功在 vSphere 8 with Tanzu上使用 AntreaConfig CRD 配置了 Antrea Egress。
内容来源|公众号:VMware 中国研发中心
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net