Amazon EKS 集群终端节点访问控制 - Amazon EKS

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

Amazon EKS 集群终端节点访问控制

本主题可帮助您为 Amazon EKS 集群的 Kubernetes API 服务器终端节点启用私有访问,并限制或完全禁用通过 Internet 进行的公有访问。

创建新集群时,Amazon EKS 将为您用于与集群进行通信的托管 Kubernetes API 服务器(使用 Kubernetes 管理工具,如kubectl)。默认情况下,此 API 服务器终端节点是对于 Internet 是公有的,对 API 服务器的访问将使用AWS Identity and Access Management(IAM) 和本地库贝内特基于角色的访问控制(阿拉伯区域银行).

您可以启用 Kubernetes API 服务器的私有访问,以便节点与 API 服务器之间的所有通信都在 VPC 内。您可以限制可以从互联网访问 API 服务器的 IP 地址,或完全禁用对 API 服务器的互联网访问。

注意

因为此端点适用于 Kubernetes API 服务器,而不是传统的AWSPrivateLink 端点,用于与AWSAPI,它不会在 Amazon VPC 控制台中显示为终端节点。

当您为集群启用终端节点私有访问时,Amazon EKS 将代表您创建 Route 53 私有托管区域,并将其与您的集群的 VPC 关联。此私有托管区域由 Amazon EKS 管理,它不会出现在您账户的 Route 53 资源中。为了使私有托管区域正确地将流量路由到您的 API 服务器,您的 VPC 必须将 enableDnsHostnamesenableDnsSupport 设置为 true,而且为 VPC 设置的 DHCP 选项必须在其域名服务器列表中包含 AmazonProvidedDNS。有关更多信息,请参阅 。更新针对 VPC 的 DNS 支持中的Amazon VPC 用户指南

您可以在创建新集群时定义 API 服务器终端节点的访问要求,并且可以随时更新集群的 API 服务器终端节点访问。

修改集群终端节点访问

使用本节中的过程来修改现有集群的终端节点访问。下表显示了受支持的 API 服务器终端节点访问组合及其关联的行为。

API 服务器终端节点访问选项
终端节点公有访问 终端节点私有访问 Behavior
已启用 已禁用
  • 这是新的 Amazon EKS 集群的默认行为。

  • 源自集群的 VPC 内的 Kubernetes API 请求(如控制层面通信的节点)离开 VPC 但不离开 Amazon 网络。

  • 集群 API 服务器可从 Internet 访问。您可以选择性地限制可访问公有终端节点的 CIDR 块。如果限制对特定 CIDR 块的访问,则建议您还启用私有终端节点,或者确保指定的 CIDR 块包括节点和 Fargate Pod(如果您使用这些 Pod)从中访问公有终端节点的地址。

已启用 已启用
  • 集群的 VPC 内的 Kubernetes API 请求(如控制层面通信的节点)使用私有 VPC 终端节点。

  • 集群 API 服务器可从 Internet 访问。您可以选择性地限制可访问公有终端节点的 CIDR 块。

已禁用 已启用
  • 传输到集群 API 服务器的所有流量都必须来自您的集群的 VPC 或连接的网络中。

  • 没有来自 Internet 的对 API 服务器的公有访问。所有 kubectl 命令都必须来自 VPC 或连接的网络中。对于连接选项,请参阅 访问私有 API 服务器

  • 公有 DNS 服务器将集群的 API 服务器终端节点解析为 VPC 中的私有 IP 地址。过去,终端节点只能在 VPC 内部解析。

    如果您的终端节点未解析为现有集群的 VPC 内的私有 IP 地址,您可以:

    • 启用公有访问,然后重新禁用。您只需为集群执行一次该操作,终端节点就将从该时间点开始解析为私有 IP 地址。

    • 更新您的集群。

您可以使用 AWS Management Console或 AWS CLI 修改集群 API 服务器终端节点访问。选择带有要用于修改终端节点访问的工具的名称的选项卡。

AWS Management Console

要使用修改集群 API 服务器终端节点访问AWS Management Console

  1. 从打开 Amazon EKS 控制台https://console.aws.amazon.com/eks/home#/clusters

  2. 选择集群的名称可以显示集群信息。

  3. 选择 Configuration 选项卡。在存储库的联网选项卡上,选择更新

  4. 对于 Private access (私有访问),选择是启用还是禁用集群的 Kubernetes API 服务器终端节点的私有访问。如果启用私有访问,源自集群的 VPC 内的 Kubernetes API 请求将使用私有 VPC 终端节点。您必须启用私有访问以禁用公有访问。

  5. 对于 Public access (公有访问),选择是启用还是禁用集群的 Kubernetes API 服务器终端节点的公有访问。如果禁用公有访问,集群的 Kubernetes API 服务器只能接收来自集群 VPC 内的请求。

  6. (可选)如果您已启用公有访问权限,您可以指定 Internet 中的哪些地址可以与公有终端节点通信。选择 Advanced Settings (高级设置)。输入 CIDR 块,例如 <203.0.113.5/32>。该块不能包含预留地址。您可以通过选择 Add Source (添加源) 来输入其他块。您可以指定的 CIDR 块存在最大数量限制。有关更多信息,请参阅 Amazon EKS Service Quoda。如果未指定任何块,则公有 API 服务器终端节点将接收来自所有 (0.0.0.0/0) IP 地址的请求。如果您使用 CIDR 块限制对公有终端节点的访问,建议您还启用私有终端节点访问,以便节点和 Fargate Pod(如果您使用这些 Pod)可以与集群进行通信。在未启用私有终端节点的情况下,您的公有访问终端节点 CIDR 源必须包含来自 VPC 的出口源。例如,如果您在私有子网中有一个节点,该节点通过 NAT 网关与 Internet 通信,则您需要将 NAT 网关的出站 IP 地址添加到公有终端节点上允许的 CIDR 块中。

  7. 选择 Update (更新) 完成操作。

AWS CLI

要使用修改集群 API 服务器终端节点访问AWS CLI

完成以下步骤,使用AWS CLI版本 1.19.75 或更高版本。您可以使用 aws --version 检查您的当前版本。要安装或升级 AWS CLI,请参阅安装 AWS CLI

  1. 使用下面的 AWS CLI 命令更新集群 API 服务器终端节点访问。替换您的集群名称和所需的终端节点访问值。如果设置了 endpointPublicAccess=true,则可以(可选)输入单个 CIDR 块,或者输入 publicAccessCidrs 的用逗号分隔的 CIDR 块列表。块不能包含预留地址。如果您指定 CIDR 块,则公有 API 服务器终端节点将只接收来自列出的块的请求。您可以指定的 CIDR 块存在最大数量限制。有关更多信息,请参阅 Amazon EKS Service Quoda。如果您使用 CIDR 块限制对公有终端节点的访问,建议您还启用私有终端节点访问,以便节点和 Fargate Pod(如果您使用这些 Pod)可以与集群进行通信。在未启用私有终端节点的情况下,您的公有访问终端节点 CIDR 源必须包含来自 VPC 的出口源。例如,如果您在私有子网中有一个节点,该节点通过 NAT 网关与 Internet 通信,则您需要将 NAT 网关的出站 IP 地址添加到公有终端节点上允许的 CIDR 块中。如果未指定任何 CIDR 块,则公有 API 服务器终端节点将接收来自所有 (0.0.0.0/0) IP 地址的请求。

    注意

    以下命令为 API 服务器终端节点启用来自单个 IP 地址的私有访问和公有访问。<203.0.113.5/32>替换为要限制网络访问的单个 CIDR 块或用逗号分隔的 CIDR 块列表。

    aws eks update-cluster-config \ --region <region-code> \ --name <my-cluster> \ --resources-vpc-config endpointPublicAccess=<true>,publicAccessCidrs="<203.0.113.5/32>",endpointPrivateAccess=<true>

    输出:

    { "update": { "id": "<e6f0905f-a5d4-4a2a-8c49-EXAMPLE00000>", "status": "InProgress", "type": "EndpointAccessUpdate", "params": [ { "type": "EndpointPublicAccess", "value": "<true>" }, { "type": "EndpointPrivateAccess", "value": "<true>" }, { "type": "publicAccessCidrs", "value": "[\<203.0.113.5/32>\"]" } ], "createdAt": <1576874258.137>, "errors": [] } }
  2. 使用以下命令通过上一命令返回的集群名称和更新 ID 监控您的终端节点访问更新的状态。当状态显示为 Successful 时,您的更新将完成。

    aws eks describe-update \ --region <region-code> \ --name <my-cluster> \ --update-id <e6f0905f-a5d4-4a2a-8c49-EXAMPLE00000>

    输出:

    { "update": { "id": "<e6f0905f-a5d4-4a2a-8c49-EXAMPLE00000>", "status": "Successful", "type": "EndpointAccessUpdate", "params": [ { "type": "EndpointPublicAccess", "value": "<true>" }, { "type": "EndpointPrivateAccess", "value": "<true"> }, { "type": "publicAccessCidrs", "value": "[\<203.0.113.5/32>\"]" } ], "createdAt": <1576874258.137>, "errors": [] } }

访问私有 API 服务器

如果您已禁用集群的 Kubernetes API 服务器终端节点的公有访问,则只能从 VPC 或连接的网络内访问 API 服务器。以下是访问 Kubernetes API 服务器终端节点的部分可行方法:

  • 已连接的网络— 将您的网络 Connect 到 VPCAWS转换网关OR 其他连接选项,然后使用所连接的网络中的计算机。您必须确保 Amazon EKS 控制层面安全组规则允许来自您的连接网络的端口 443 上的入口流量。

  • Amazon EC2 堡垒主机— 您可以在集群的 VPC 中将 Amazon EC2 实例启动到公有子网中,然后通过 SSH 登录到该实例来运行kubectl命令。有关更多信息,请参阅 。上的 Linux 堡垒主机AWS。您必须确保 Amazon EKS 控制层面安全组规则允许来自您的堡垒主机的端口 443 上的入口流量。有关更多信息,请参阅 Amazon EKS 安全组注意事项

    当您配置kubectl为您的堡垒主机,请务必使用AWS凭证,或在删除终端节点公有访问之前添加您的堡垒将用于 RBAC 配置的 IAM 用户或角色。有关更多信息,请参阅 管理集群的用户或 IAM 角色未经授权或访问被拒绝 (kubectl)

  • AWS Cloud9IDE–AWS Cloud9是一种云端集成开发环境 (IDE),您只需要一个浏览器,即可编写、运行和调试代码。您可以在集群的 VPC 中创建 AWS Cloud9 IDE,然后使用 IDE 来与集群进行通信。有关更多信息,请参阅在 AWS Cloud9 中创建环境。您必须确保 Amazon EKS 控制层面安全组规则允许来自 IDE 安全组的端口 443 上的入口流量。有关更多信息,请参阅 Amazon EKS 安全组注意事项

    当您配置kubectl为您的AWS Cloud9IDE,请确保使用AWS凭证,或在删除终端节点公有访问之前添加您的 IDE 将用于 RBAC 配置的 IAM 用户或角色。有关更多信息,请参阅 管理集群的用户或 IAM 角色未经授权或访问被拒绝 (kubectl)