EKS 全私有集群 - Eksctl 用户指南

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

EKS 全私有集群

eksctl 支持创建没有出站 Internet 访问权限且只有私有子网的完全私有集群。VPC 终端节点用于实现对 AWS 服务的私有访问。

本指南介绍如何创建没有出站 Internet 访问权限的私有集群。

创建完全私有集群

创建完全私有集群的唯一必填字段是:privateCluster.enabled

privateCluster: enabled: true

创建集群后,需要访问 Kubernetes API 服务器的 eksctl 命令必须从集群的 VPC、对等 VPC 或使用其他方式(例如 AWS Direct Connect)运行。需要访问 EKS 的 eksctl 命令如果在集群的 VPC 内运行, APIs 则无法运行。要解决这个问题,请为亚马逊 EKS 创建一个接口终端节点,以便从您的亚马逊虚拟私有云 (VPC) 私有访问亚马逊 Elastic Kubernetes Service (Amazon EKS APIs ) 管理。在 future 版本中,eksctl 将增加对创建此端点的支持,因此无需手动创建。启用 AWS for A PrivateLink mazon EKS 后,需要访问 OpenID Connect 提供商 URL 的命令将需要从集群的 VPC 外部运行。

创建托管节点组将继续起作用,并且创建自我管理的节点组将起作用,因为如果命令是在集群的 VPC、对等的 VPC 内运行的,或者使用其他方式(例如 AWS Direct Connect),则需要通过 EKS 接口终端节点访问 API 服务器。

注意

VPC 终端节点按小时和使用量收费。有关定价的更多详细信息,请参阅 A WS PrivateLink 定价

警告

eu-south-1不支持完全私有群集。

配置对其他 AWS 服务的私有访问权限

为了使工作节点能够私下访问 AWS 服务,eksctl 为以下服务创建 VPC 终端节点:

  • 用于提取容器镜像的 ECR(两者ecr.api兼有ecr.dkr)的接口终端节点(AWS CNI 插件等)

  • S3 用于提取实际图像层的网关终端节点

  • aws-cloud-provider集成 EC2 所需的接口端点

  • STS 的接口终端节点,用于支持服务账户的 Fargate 和 IAM 角色 (IRSA)

  • 用于 CloudWatch 记录的接口端点 (logs)(如果启用了 CloudWatch 日志记录)

这些 VPC 终端节点对于正常运行的私有集群来说是必不可少的,因此,eksctl 不支持配置或禁用它们。但是,集群可能需要私有访问其他 AWS 服务(例如,集群自动扩缩器所需的自动扩缩功能)。可以在中指定这些服务privateCluster.additionalEndpointServices,它指示 eksctl 为每个服务创建一个 VPC 终端节点。

例如,要允许私人访问自动缩放和 CloudWatch 日志记录,请执行以下操作:

privateCluster: enabled: true additionalEndpointServices: # For Cluster Autoscaler - "autoscaling" # CloudWatch logging - "logs"

中支持的端点additionalEndpointServicesautoscalingcloudformationlogs

跳过端点创建

如果已经创建了 VPC,并设置了必要的 AWS 终端节点并链接到 EKS 文档中描述的子网,则eksctl可以通过提供skipEndpointCreation如下选项来跳过创建它们:

privateCluster: enabled: true skipEndpointCreation: true

此设置不能与一起使用additionalEndpointServices。它将跳过所有端点的创建。此外,仅当端点<→子网拓扑设置正确时,才建议使用此设置。如果子网 ID 正确,则使用前缀地址设置vpce路由,创建所有必要的 EKS 端点并将其链接到提供的 VPC。 eksctl不会更改这些资源中的任何一个。

节点组

在完全私有集群中仅支持私有节点组(包括托管和自管理),因为集群的 VPC 是在没有任何公有子网的情况下创建的。必须明确设置privateNetworking字段(nodeGroup[].privateNetworking managedNodeGroup[)。在完全私有集群中privateNetworking未设置是错误的。

nodeGroups: - name: ng1 instanceType: m5.large desiredCapacity: 2 # privateNetworking must be explicitly set for a fully-private cluster # Rather than defaulting this field to `true`, # we require users to explicitly set it to make the behaviour # explicit and avoid confusion. privateNetworking: true managedNodeGroups: - name: m1 instanceType: m5.large desiredCapacity: 2 privateNetworking: true

集群终端节点访问

完全私有集群不支持在创建集群clusterEndpointAccess期间进行修改。设置clusterEndpoints.publicAccess或都是错误的clusterEndpoints.privateAccess,因为完全私有集群只能拥有私有访问权限,并且允许修改这些字段可能会破坏集群。

用户提供的 VPC 和子网

eksctl 支持使用预先存在的 VPC 和子网创建完全私有集群。只能指定私有子网,在下方指定子网是错误的。vpc.subnets.public

eksctl 在提供的 VPC 中创建 VPC 终端节点,并修改所提供子网的路由表。每个子网都应有一个与之关联的显式路由表,因为 eksctl 不会修改主路由表。

apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: name: private-cluster region: us-west-2 privateCluster: enabled: true additionalEndpointServices: - "autoscaling" vpc: subnets: private: us-west-2b: id: subnet-0818beec303f8419b us-west-2c: id: subnet-0d42ef09490805e2a us-west-2d: id: subnet-0da7418077077c5f9 nodeGroups: - name: ng1 instanceType: m5.large desiredCapacity: 2 # privateNetworking must be explicitly set for a fully-private cluster # Rather than defaulting this field to true for a fully-private cluster, we require users to explicitly set it # to make the behaviour explicit and avoid confusion. privateNetworking: true managedNodeGroups: - name: m1 instanceType: m5.large desiredCapacity: 2 privateNetworking: true

管理全私有集群

要使所有命令在集群创建后起作用,eksctl 需要私有访问 EKS API 服务器端点和出站互联网访问权限(对于EKS:DescribeCluster)。如果 eksctl 具有出站互联网访问权限,则将支持不需要访问 API 服务器的命令。

强制删除全私有集群

通过 eksctl 删除完全私有集群时可能会出现错误,因为 eksctl 无法自动访问集群的所有资源。 --force存在是为了解决这个问题:它将强制删除集群,并在出现错误时继续。

限制

当前实现的一个局限性是,eksctl 最初在创建集群时启用了公有和私有终端节点访问权限,并在所有操作完成后禁用公共端点访问权限。这是必需的,因为 eksctl 需要访问 Kubernetes API 服务器才能允许自我管理的节点加入集群并支持和 Fargate。 GitOps 这些操作完成后,eksctl 会将集群终端节点的访问权限切换为仅限私有。此额外更新确实意味着创建完全私有集群所需的时间将比标准集群更长。将来,eksctl 可能会切换到支持 vPC 的 Lambda 函数来执行这些 API 操作。

通过 HTTP 代理服务器进行出站访问

eksctl 能够 APIs 通过配置的 HTTP (S) 代理服务器与 AWS 通信,但是您需要确保正确设置代理排除列表。

通常,您需要通过设置适当的no_proxy环境变量(包括该值)来确保集群的 VPC 终端节点请求不会通过代理进行路由。.eks.amazonaws.com

如果您的代理服务器执行 “SSL 拦截”,并且您使用的是服务账户的 IAM 角色 (IRSA),则需要确保明确绕过该域 Man-in-the-Middle的 SSL。oidc.<region>.amazonaws.com不这样做将导致 eksctl 为 OIDC 提供商获取错误的根证书指纹,并且 AWS VPC CNI 插件将由于无法获取 IAM 证书而无法启动,从而导致您的集群无法运行。

进一步信息