VPC和子网注意事项 - Amazon EKS

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

VPC和子网注意事项

除了 Kubernetes AWS VPC 网络之外,操作EKS集群还需要网络知识。

我们建议您在开始设计集群VPC或将集群部署到现有集群之前,先了解EKS控制层面的通信机制VPCs。

在架构和要与之配合使用的子网时,请参阅集群VPC注意事项VPC和 Amazon EKS 安全组注意事项。EKS

概述

EKS集群架构

一个EKS集群由两部分组成VPCs:

  • AWS托管 K VPC ubernetes 控制平面的托管。这VPC不会出现在客户账户中。

  • 托管 Kubernetes 节点VPC的客户托管。这是容器以及其他客户管理AWS的基础设施(例如集群使用的负载均衡器)的运行场所。这VPC显示在客户账户中。在创建集群VPC之前,您需要创建客户管理的集群。VPC如果您不提供一个,eksctl 会创建一个。

客户中的节点VPC需要能够连接到中的托管API服务器端点AWSVPC。这允许节点在 Kubernetes 控制平面上注册并接收运行应用程序 Pod 的请求。

节点通过 (a) EKS 公共端点或 (b) 由EKS管理的跨账户弹性网络接口 (X-ENI) 连接到EKS控制平面。创建集群时,您需要指定至少两个VPC子网。EKSENI在创建集群期间指定的每个子网(也称为集群子网)中放置一个 X-。Kubernetes API 服务器使用这些跨账户与部署在客户管理ENIs的集群子网上的节点进行通信。VPC

集群网络的一般示意图

节点启动时,将执行EKS引导脚本并安装 Kubernetes 节点配置文件。作为每个实例启动过程的一部分,将启动容器运行时代理、kubelet 和 Kubernetes 节点代理。

要注册节点,Kubelet 会联系 Kubernetes 集群终端节点。它与外部的公共终端节点VPC或其中的私有终端节点建立连接VPC。Kubelet API 定期接收指令并向端点提供状态更新和心跳。

EKS控制平面通信

EKS有两种方法可以控制对集群终端节点的访问。端点访问控制允许您选择是可以通过公共互联网访问终端节点,还是只能通过您的互联网访问终端节点VPC。您可以同时打开公共终端节点(这是默认值)、私有终端节点,或者同时开启两者。

集群API终端节点的配置决定了节点与控制平面通信所采用的路径。请注意,可以随时通过EKS控制台或更改这些端点设置API。

公共终端节点

这是新 Amazon EKS 集群的默认行为。当仅启用集群的公共终端节点时,来自集群内部的 Kubernetes API 请求VPC(例如用于控制平面通信的工作节点)会离开 Amazon 的网络VPC,但不会离开亚马逊的网络。为了使节点能够连接到控制平面,它们必须具有公有 IP 地址和通往互联网网关的路由,或者具有通往网NAT关的路由,在那里他们可以使用NAT网关的公有 IP 地址。

公有和私有端点

当同时启用公有和私有端点时,来自内部的 Kubernetes API 请求会通过你的 X-ENIs 与控制平面VPC进行通信。VPC您的集群API服务器可以从互联网访问。

私有端点

如果仅启用私有端点,则无法从 Internet 公开访问您的API服务器。所有流向您的群集API服务器的流量都必须来自您的群集内部VPC或连接的网络。节点通过您的 X-ENIs 与API服务器通信VPC。请注意,集群管理工具必须有权访问私有终端节点。详细了解如何从亚马逊外部连接私有 Amazon EKS 集群终端节点VPC。

请注意,群集的API服务器终端节点由公共DNS服务器解析为来自的私有 IP 地址VPC。过去,端点只能从内部解析VPC。

VPC配置

Amazon VPC 支持IPv4和IPv6寻址。亚马逊IPv4默认EKS支持。VPC必须有一个与之关联的IPv4CIDR方块。您可以选择将多个IPv4无类域间路由 (CIDR) 块和多个IPv6CIDR区块关联到您的。VPC创建时VPC,必须按照 RFC1918 年指定的VPC私有IPv4地址范围指定一个区IPv4CIDR块。允许的区块大小介于/16前缀(65,536 个 IP 地址)和/28前缀(16 个 IP 地址)之间。

创建新方块时VPC,您可以附加一个IPv6CIDR方块,更改现有方块时最多可以附加五个方块VPC。IPv6CIDR区块大小的前缀长度可以介于 /44 和 /60 之间,IPv6子网的前缀长度可以介于 /44/ 和 /64 之间。您可以从 IPv6 CIDR Amazon 维护的地IPv6址池中请求封锁。有关更多信息,请参阅《VPC用户指南》的 “VPCCIDR方块” 部分。

Amazon EKS 集群同时支持IPv4和IPv6。默认情况下,EKS集群使用 IPv4 IP。IPv6在创建集群时指定将启用使用IPv6集群。IPv6群集需要双堆栈VPCs和子网。

Amazon EKS 建议您在创建集群时至少使用两个位于不同可用区域的子网。您在创建集群时传入的子网称为集群子网。当您创建集群时,Amazon EKS 会在您指定的子网ENIs中创建最多 4 个跨账户(x 账户或 x-ENIs)。x-始终ENIs处于部署状态,用于集群管理流量,例如日志传输、exec 和代理。有关完整VPC和子网要求的详细信息,请参阅EKS用户指南。

Kubernetes 工作节点可以在集群子网中运行,但不建议这样做。在集群升级期间,Ama EKS zon 会在集群子网ENIs中配置额外资源。当您的集群向外扩展时,工作节点和 Pod 可能会消耗集群子网IPs中的可用空间。因此,为了确保有足够的可用空间,IPs您可能需要考虑使用带有 /28 网络掩码的专用集群子网。

Kubernetes 工作节点可以在公有子网或私有子网中运行。子网是公有子网还是私有子网是指子网内的流量是通过互联网网关路由的。公有子网有通过互联网网关进入互联网的路由表入口,但私有子网没有。

源自其他地方并到达您的节点的流量称为入口。来自节点并离开网络的流量称为口。在配置有 Internet 网关的子网中具有公有或弹性 IP 地址 (EIPs) 的节点允许从外部进入。VPC私有子网通常具有通NAT往网关的路由,网关不允许从外部进入子网中节点的入口流量,VPC同时仍允许来自节点的流量离开VPC(出口)。

在IPv6世界上,每个地址都可以通过互联网进行路由。与节点和 Pod 关联IPv6的地址是公开的。通过在中实现仅限出站的 Internet 网关 (EIGW) 来支持私有子网VPC,允许出站流量,同时阻止所有传入流量。可以在VPC用户指南中找到实现IPv6子网的最佳实践。

您可以通过三种不同的方式配置VPC和子网:

仅使用公有子网

在同一个公共子网中,同时创建节点和入口资源(例如负载均衡器)。使用标记公有子网kubernetes.io/role/elb以构造面向互联网的负载均衡器。在此配置中,可以将集群终端节点配置为公共终端节点、私有终端节点或两者兼而有之(公有和私有)。

使用私有子网和公有子网

节点是在私有子网上创建的,而 Ingress 资源是在公共子网中实例化的。您可以启用对集群终端节点的公共、私有或两者(公有和私有)访问权限。根据集群终端节点的配置,节点流量将通过NAT网关或ENI。

仅使用私有子网

节点和入口都是在私有子网中创建的。使用子kubernetes.io/role/internal-elb网标签来构造内部负载均衡器。访问集群的终端节点需要VPN连接。您必须AWS PrivateLink为所有 Amazon EC2 ECR 和 S3 存储库激活。只应启用集群的私有终端节点。我们建议在配置EKS私有集群之前仔细阅读私有集群的要求

跨境沟通 VPCs

在许多情况下,您需要在这些集群上部署多个VPCs独立的EKS集群VPCs。

您可以使用 Amazon VPC Lattice 在多个账户之间持续安全地连接服务(无需通过对VPCs等互连AWS PrivateLink 或 T AWS ransit Gat VPC eway 等服务提供额外的连接)。点击此处了解更多。

Amazon VPC Lattice

Amazon L VPC attice 在IPv4和的链路本地地址空间中运行IPv6,为地址可能重叠的服务提供连接。IPv4为了提高运营效率,我们强烈建议将EKS集群和节点部署到不重叠的 IP 范围。如果您的基础架构VPCs包含重叠的 IP 范围,则需要相应地架构您的网络。我们建议使用私有NAT网关,或者VPCCNI在自定义联网模式下与传输网关结合使用,以整合工作负载,EKS以解决重叠的难CIDR题,同时保留可路由RFC1918的 IP 地址。

带有自定义网络的私有 Nat 网关

如果您是服务提供商 AWS PrivateLink,并且希望在不同的账户中与客户VPC共享您的 Kubernetes 服务和入口(任一ALB或NLB),请考虑使用(也称为终端节点服务)。

VPC跨多个账户共享

许多企业采用共享的 Amazon VPCs 作为简化网络管理、降低成本和提高AWS组织中多个AWS账户安全性的手段。他们利用 AWS Resource Access Manager (RAM) 与个人AWS账户、组织单位 (OUs) 或整个AWS组织安全地共享支持的AWS资源

您可以使用其他AWS账户在共享VPC子网中部署 Amazon EKS 集群、托管节点组和其他支持AWS资源(如 LoadBalancers安全组、端点等)。AWS RAM下图描绘了一个高级架构示例。这允许中央网络团队控制子网等网络结构VPCs,同时允许应用程序或平台团队在各自AWS的账户中部署 Amazon EKS 集群。此场景的完整演练可在此 github 存储库中找到。

在跨AWS账户EKS的VPC共享子网中部署 Amazon。

使用共享子网时的注意事项

  • Amazon EKS 集群和工作节点可以在共享子网中创建,这些子网都属于同一个VPC子网。Amazon EKS 不支持跨多个集群的创建VPCs。

  • Amazon EKS 使用AWSVPC安全组 (SGs) 来控制 Kubernetes 控制平面和集群工作节点之间的流量。安全组还用于控制工作节点和其他VPC资源之间的流量以及外部 IP 地址。您必须在应用程序/参与者账户中创建这些安全组。确保您打算用于 pod 的安全组也位于参与者账户中。您可以在安全组中配置入站和出站规则,以允许进出位于中央VPC账户中的安全组的必要流量。

  • 在您的 Amazon EKS 集群所在的参与者账户中创建IAM角色和相关策略。这些IAM角色和策略对于向亚马逊EKS管理的 Kubernetes 集群以及在 Fargate 上运行的节点和容器授予必要权限至关重要。这些权限使Amazon EKS 能够代表您拨打其他AWS服务的电话。

  • 您可以按照以下方法允许跨账户访问 k8s 容器中的 Amazon S3 存储桶、Dynamodb 表等AWS资源:

    • 基于资源的策略方法:如果AWS服务支持资源策略,则可以添加适当的基于资源的策略,以允许跨账户访问分配给 kubernetes pod 的IAM角色。在这种情况下,OIDC提供者、IAM角色和权限策略存在于应用程序账户中。要查找支持基于资源的策略的AWS服务,请引用与之配合使用的AWS服务,IAM并在 “基于资源” 列中查找标有 “是” 的服务。

    • OIDC提供者方法:诸如OIDC提供者、IAM角色、权限和信任策略之类的IAM资源将在存在资源的其他参与者AWS账户中创建。这些角色将分配给应用程序账户中的 Kubernetes pod,以便它们可以访问跨账户资源。有关此方法的完整演练,请参阅 Kubernetes 服务账户的跨账户IAM角色博客。

  • 您可以部署 Amazon Elastic Loadbalancer (ELBNLB) 资源(ALB或),将流量路由到应用程序账户或中央网络账户中的 k8s pod。有关在中央网络账户中部署ELB资源的详细说明,请参阅通过跨账户 Loa EKS d Balancer 公开 Amazon Pod 演练。此选项提供了更高的灵活性,因为它允许中央网络账户完全控制 Load Balancer 资源的安全配置。

  • 使用 custom networking feature Amazon 时 VPCCNI,您需要使用中央网络账户中列出的可用区 (AZ) ID 映射来创建每个ENIConfig映射。这是由于每个AWS账户中的物理名称与可用区名称AZs的随机映射所致。

安全组

安全组控制允许到达和离开与其关联资源的流量。Amazon EKS 使用安全组来管理控制平面和节点之间的通信。当您创建集群时,Amazon EKS 会创建一个名为的安全组eks-cluster-sg-my-cluster-uniqueID。EKS将这些安全组关联到托管ENIs和节点。默认规则允许所有流量在集群和节点之间自由流动,并允许所有出站流量到任何目的地。

创建集群时,您可以指定自己的安全组。当您指定自己的安全组时,请参阅有关安全组的建议

建议

考虑多可用区部署

AWS区域提供多个物理隔离和隔离的可用区 (AZ),这些可用区通过低延迟、高吞吐量和高度冗余的网络相连。借助可用区,您可以设计和操作在可用区之间自动进行故障转移而不会中断的应用程序。Amazon EKS 强烈建议将EKS集群部署到多个可用区。创建集群时,请考虑在至少两个可用区中指定子网。

在节点上运行的 Kubelet 会自动为节点对象添加标签,例如。topology.kubernetes.io/region=us-west-2我们建议将节点标签与 Pod 拓扑分布约束结合使用,以控制 Pod 的跨区域分布方式。这些提示使 Kubernetes 调度器能够放置 Pod 以获得更好的预期可用性,从而降低相关故障影响整个工作负载的风险。请参阅为 Pod 分配节点,查看节点选择器和可用区分布限制的示例。

您可以在创建节点时定义子网或可用区。如果未配置子网,则节点将放置在集群子网中。EKS对托管节点组的支持会根据可用容量自动将节点分布在多个可用区域中。AZs如果工作负载定义了拓扑分布限制,Karpenter 将通过将节点扩展到指定范围来实现可用区分布布局。

AWS弹性负载均衡器由 Kubernetes AWS 集群的负载均衡器控制器管理。它为 Kubernetes 入口资源预置了应用程序负载均衡器 (ALB),为负载均衡器类型的 Kubernetes 服务预置了一个网络负载均衡器 (NLB)。Elastic Load Balancer 控制器使用标签来发现子网。ELB控制器至少需要两个可用区 (AZs) 才能成功配置入口资源。考虑将子网设置为至少两个AZs,以利用地理冗余的安全性和可靠性。

将节点部署到私有子网

VPC包括私有子网和公有子网是在上部署 Kubernetes 工作负载的理想方法。EKS考虑在两个不同的可用区中至少设置两个公有子网和两个私有子网。公有子网的相关路由表包含通往 Internet 网关的路由。Pod 能够通过NAT网关与互联网进行交互。私有子网由环境中的仅限出口 Internet 网关支持()。IPv6 EIGW

在私有子网中实例化节点可以最大限度地控制流向节点的流量,并且对绝大多数 Kubernetes 应用程序有效。入口资源(如负载均衡器)在公共子网中实例化,并将流量路由到在私有子网上运行的 Pod。

如果您要求严格的安全性和网络隔离,请考虑使用仅限私有模式。在此配置中,三个私有子网部署在AWS区域内的不同可用区中。VPC部署到子网的资源无法访问互联网,互联网也无法访问子网中的资源。为了使您的 Kubernetes 应用程序能够访问其他AWS服务,您必须配置 PrivateLink 接口和/或网关终端节点。你可以设置内部负载均衡器,使用 AWS Load Balancer Controller 将流量重定向到 Pod。必须对私有子网进行标记 (kubernetes.io/role/internal-elb: 1),控制器才能配置负载均衡器。要在集群中注册节点,必须将集群终端节点设置为私有模式。请访问私有集群指南,了解完整的要求和注意事项。

考虑集群终端节点的公用和私有模式

Amazon EKS 提供仅公共集群终端节点模式 public-and-private和仅限私有模式的集群终端节点模式。默认模式为仅限公开,但我们建议将集群终端节点配置为公共模式和私有模式。此选项允许集群内的 Kubernetes API 调用VPC(例如 node-to-control-plane通信)利用私有VPC终端节点和流量保留在集群中。VPC另一方面,可以从互联网访问您的群集API服务器。但是,我们强烈建议限制可以使用公共终端节点的CIDR区块。了解如何配置公有和私有终端节点访问权限,包括限制CIDR屏蔽。

当您需要安全性和网络隔离时,我们建议您使用仅限私有的端点。我们建议使用EKS用户指南中列出的任一选项以私密方式连接到API服务器。

谨慎配置安全组

Amazon EKS 支持使用自定义安全组。任何自定义安全组都必须允许节点与 Kubernetes 控制平面之间的通信。当您的组织不允许开放通信时,请检查端口要求并手动配置规则。

EKS将您在创建集群期间提供的自定义安全组应用于托管接口 (X-ENIs)。但是,它不会立即将它们与节点相关联。在创建节点组时,强烈建议手动关联自定义安全组。请考虑启用 Ter securityGroupSelectorm s,以便在节点自动缩放期间启用自定义安全组的 Karpenter 节点模板发现。

我们强烈建议创建一个安全组以允许所有节点间通信流量。在引导过程中,节点需要出站 Internet 连接才能访问集群终端节点。评估外部访问要求,例如本地连接和容器注册表访问权限,并适当设置规则。在将更改投入生产之前,我们强烈建议您在开发环境中仔细检查连接。

在每个可用区部署NAT网关

如果您在私有子网(IPv4和IPv6)中部署节点,请考虑在每个可用区 (AZ) 中创建一个NAT网关,以确保架构独立于区域并减少跨可用区的支出。可用区中的每个NAT网关都采用冗余实现。

使用 Cloud9 访问私有集群

AWSCloud9 是基IDE于 Web 的,可以使用 Systems Manager 在私有子网中安全运行,无需入口访问。AWS也可以在 Cloud9 实例上禁用出口。详细了解如何使用 Cloud9 访问私有集群和子网。

AWSCloud9 控制台连接到无EC2入口实例的插图。

📝 编辑此页面 GitHub