创建 Amazon EKS 集群 - Amazon EKS
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

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

创建 Amazon EKS 集群

本主题说明如何创建 Amazon EKS 集群。如果您是首次创建 Amazon EKS 集群,建议您按照我们的开始使用 Amazon EKS指南之一操作。它们提供了使用节点创建 Amazon EKS 集群的完整端到端演练。

重要

创建 Amazon EKS 集群后,创建集群的 IAM 实体(用户或角色)将添加到 Kubernetes RBAC 授权表作为管理员(具有 system:masters 权限)。最初,仅该 IAM 用户可以使用 kubectl 调用 Kubernetes API 服务器。有关更多信息,请参阅 管理集群的用户或 IAM 角色。如果使用控制台创建集群,则必须确保在集群上运行 kubectl 命令时,AWS 开发工具包凭证链中具有相同的 IAM 用户凭证。

如果安装和配置 AWS CLI,则可为用户配置 IAM 凭证。如果为用户正确配置了 AWS CLI 版本 1.16.156 或更高版本,则 eksctl 可以找到这些凭证。有关更多信息,请参阅 AWS Command Line Interface 用户指南 中的配置 AWS CLI。如果无法安装 AWS CLI 版本 1.16.156 或更高版本,则必须安装 aws-iam-authenticator

Prerequisites

您必须已安装 AWS CLI 的版本 1.16.156 或更高版本或 aws-iam-authenticator 有关更多信息,请参阅安装、更新和卸载 AWS CLI安装aws-iam-authenticator

您可以使用 eksctlAWS 管理控制台AWS CLI 创建集群。

[使用 eksctl 创建集群]

此过程需要 eksctl 版本 0.35.0 或更高版本。可以使用以下命令来查看您的版本:

eksctl version

有关安装或升级 eksctl 的更多信息,请参阅安装或升级 eksctl

使用 eksctl 创建集群

  1. 在您的默认区域中使用 Amazon EKS 最新 Kubernetes 版本创建集群。将 <example-values>(包括 <>)替换为您自己的值。您可以将 <1.18> 替换为任何受支持的版本

    eksctl create cluster \ --name <my-cluster> \ --version <1.18> \ --with-oidc \ --without-nodegroup
    注意

    要查看在使用 eksctl 创建集群时可指定的大多数选项,请使用 eksctl create cluster --help 命令。要查看所有选项,您可以使用配置文件。有关更多信息,请参阅 文档中的使用配置文件配置文件架构eksctl。您可以在 上查找配置文件示例GitHub。

    重要

    不要使用 eksctl 在已启用 AWS Outposts、AWS Wavelength 或 AWS 本地扩展区的 AWS 区域中创建集群或节点。改用 Amazon EC2 API 或 AWS CloudFormation 创建集群和自行管理的节点。有关更多信息,请参阅 使用 AWS 管理控制台 启动自管理 Linux 节点使用 AWS 管理控制台 启动自管理 Windows 节点

    警告

    如果您使用带 secretsEncryption 选项的配置文件创建集群(需要现有 AWS Key Management Service 密钥),并且您使用的密钥会被删除,则无法恢复集群。如果启用信封加密,将使用您选择的客户主密钥 (CMK) 加密 Kubernetes 密钥。CMK 必须对称,在与集群相同的区域中创建,如果在不同的账户中创建了 CMK,则用户必须具有对 CMK 的访问权限。有关更多信息,请参阅 开发人员指南 中的允许其他账户中的用户使用 CMKAWS Key Management Service。使用 AWS KMS CMK 进行 Kubernetes 密钥加密需要 Kubernetes 版本 1.13 或更高版本。

    默认情况下,create-key 命令会创建一个具有密钥策略的对称密钥,该密钥策略向账户的根用户管理员授予对 AWS KMS 操作和资源的访问权限。有关更多信息,请参阅创建密钥。如果要缩小权限的范围,请确保允许对将调用 kms:DescribeKey API 的委托人的密钥策略执行 kms:CreateGrantcreate-cluster 操作。Amazon EKS 不支持密钥策略条件 kms:GrantIsForAWSResource。 如果此操作位于密钥策略语句中,则创建集群将不起作用。

    集群预配置需要几分钟时间。在集群创建过程中,您将看到几行输出。输出的最后一行类似于以下示例行。

    [✓] EKS cluster "<my-cluster>" in "<region-code>" region is ready
  2. 当您的集群准备就绪时,测试您的 kubectl 配置是否正确。

    kubectl get svc
    注意

    如果您收到任何授权或资源类型错误,请参阅故障排除部分中的未经授权或访问被拒绝 (kubectl)

    输出:

    NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE svc/kubernetes ClusterIP 10.100.0.1 <none> 443/TCP 1m
  3. (可选)如果要在集群中的 AWS Fargate 上运行 Pod,则您必须创建 Fargate Pod 执行角色为您的集群创建 Fargate 配置文件

  4. 按照启动自管理 Amazon Linux 节点中的过程来将 Linux 节点添加到您的集群以支持工作负载。

  5. (可选)将 Linux 节点添加到集群后,请按照Windows 支持中的过程向集群添加 Windows 支持并添加 Windows 节点。所有 Amazon EKS 集群必须至少包含一个 Linux 节点,即使您只想在集群中运行 Windows 工作负载也是如此。

[使用 AWS 管理控制台 创建集群]

Prerequisites

使用控制台创建集群

  1. Open the Amazon EKS console at https://console.amazonaws.cn/eks/home#/clusters.

  2. 选择 Create Cluster (创建集群).

  3. Configure cluster (配置集群) 页面上,填写以下字段:

    • Name (名称) – 集群的独特名称。

    • Kubernetes version (Kubernetes 版本) – 要用于集群的 Kubernetes 的版本。

    • 集群服务角色 – 选择 Amazon EKS 集群角色以允许 Kubernetes 控制层面代表您管理 AWS 资源。有关更多信息,请参阅 Amazon EKS 集群 IAM 角色.

    • Secrets encryption (密钥加密) –(可选)选择使用 AWS Key Management Service ( (AWS KMS).) 启用 Kubernetes 密钥的信封加密。如果启用信封加密,将使用您选择的客户主密钥 (CMK) 加密 Kubernetes 密钥。CMK 必须对称,在与集群相同的区域中创建,如果在不同的账户中创建了 CMK,则用户必须具有对 CMK 的访问权限。有关更多信息,请参阅 开发人员指南 中的允许其他账户中的用户使用 CMKAWS Key Management Service。

      使用 AWS KMS CMK 进行 Kubernetes 密钥加密需要 Kubernetes 版本 1.13 或更高版本。如果未列出任何密钥,则必须先创建一个密钥。有关更多信息,请参阅创建密钥.

      注意

      默认情况下,create-key 命令使用密钥策略创建一个对称密钥,该密钥策略向账户的根用户管理员授予访问 AWS KMS 操作和资源的权限。如果要缩小权限的范围,请确保允许对将调用 kms:DescribeKey API 的委托人的密钥策略执行 kms:CreateGrantcreate-cluster 操作。

      Amazon EKS 不支持密钥策略条件 kms:GrantIsForAWSResource。如果此操作位于密钥策略语句中,则将无法创建集群。

      警告

      删除 CMK 会将集群永久性置于降级状态。如果计划删除用于创建集群的任何 CMK,请在删除前确认这是预期操作。删除密钥后,将无法恢复集群。

    • Tags (标签) –(可选)将任意标签添加到您的集群。有关更多信息,请参阅 给您的 Amazon EKS 资源加标签.

  4. 选择 Next (下一步).

  5. Specify networking (指定联网) 页面上,为以下字段选择值:

    • VPC – 选择要用于集群的现有 VPC。如果未列出,则您需要先创建一个。有关更多信息,请参阅 为 Amazon EKS 集群创建 VPC.

    • Subnets (子网) – 默认情况下,已预先选中在之前字段中指定的 VPC 中的可用子网。取消选择您不希望托管集群资源的任何子网,例如工作线程节点或负载均衡器。子网必须满足 Amazon EKS 集群的要求。有关更多信息,请参阅 集群 VPC 注意事项.

      重要

      如果您选择在 March 26, 2020之前使用任一 Amazon EKS AWS CloudFormation VPC 模板创建的子网,请注意 March 26, 2020.引入的默认更改。有关更多信息,请参阅 为 Amazon EKS 集群创建 VPC.

      重要

      Do not select a subnet in AWS Outposts, AWS Wavelength or an AWS Local Zone when creating your cluster. After cluster creation, you can tag the AWS Outposts AWS Wavelength or AWS Local Zone subnets with the cluster name, which will then enable you to deploy self-managed nodes to the subnet. For more information, see 子网添加标签要求.

    • 安全组 – 创建 VPC 时生成的 AWS CloudFormation 输出中的 SecurityGroups 值。此安全组在下拉名称中包含 ControlPlaneSecurityGroup

      重要

      节点 AWS CloudFormation 模板会修改您在此处指定的安全组,因此 Amazon EKS 强烈建议为每个集群控制层面使用专用安全组(每个集群一个)。如果此安全组是与其他资源共享的安全组,则可能会阻止或中断与这些资源的连接。

    • (可选)如果要指定从哪个 CIDR 块 Kubernetes 分配服务 IP 地址,请选择 Configure Kubernetes Service IP address range (配置 Kubernetes 服务 IP 地址范围) 并指定 Service IPv4 range (服务 IPv4 范围)。CIDR 块必须满足以下要求:

      • 在以下范围之一中:10.0.0.0/8、172.16.0.0/12 或 192.168.0.0/16。

      • 介于 /24 和 /12 之间。

      • 不与 VPC 中指定的任何 CIDR 块重叠。

      我们建议指定不与已对等或连接到您的 VPC 的任何其他网络重叠的 CIDR 块。如果未启用此选项,Kubernetes 将从 10.100.0.0/16 或 172.20.0.0/16 CIDR 块分配服务 IP 地址。

      重要

      您只能在创建集群时指定自定义 CIDR 块,并且在创建集群后,无法更改此值。

    • 对于 Cluster endpoint access (集群终端节点访问) – 选择以下选项之一:

      • Public (公有) – 仅允许对集群的 Kubernetes API 服务器终端节点进行公有访问。来自集群 VPC 外部的 Kubernetes API 请求将使用公有终端节点。默认情况下,允许从任何源 IP 地址访问。您可以选择限制对一个或多个 CIDR 范围(如 192.168.0.0/16)的访问,例如,通过选择 Advanced settings (高级设置),然后选择 Add source (添加源).

      • Private (私有) – 仅允许对集群的 Kubernetes API 服务器终端节点进行私有访问。源自集群的 VPC 内的 Kubernetes API 请求将使用私有 VPC 终端节点。

        重要

        If you created a VPC without outbound internet access, then you must enable private access.

      • Public and private (公有和私有) – 启用公有和私有访问。

      有关以前选项的更多信息,请参阅修改集群终端节点访问.

  6. 如果您在上一页中选择 Kubernetes 版本 1.17 或更早版本,请跳到下一步。如果您选择了版本 1.18,请接受 Networking add-ons (联网附加组件) 部分中的默认值,以安装最新版本的 AWS VPC CNI Amazon EKS 附加组件。您只能对 1.18 个集群使用 Amazon EKS 附加组件,因为 Amazon EKS 附加组件需要服务器端应用 Kubernetes 功能,该功能在 Kubernetes 1.18 之前不可用。如果您为集群选择了其他 Kubernetes 版本,则不会显示此选项。

    重要

    VPC CNI 附加项配置为使用分配给 AWS 的 IAM 权限。Amazon EKS 节点 IAM 角色在创建集群后,但在将任何 Amazon EC2 节点部署到集群之前,您必须确保将 AmazonEKS_CNI_Policy IAM 策略附加到节点 IAM 角色,或者附加到与附加项运行时所在的 Kubernetes 服务账户关联的其他角色。我们建议您完成IAM中的说明,以将策略分配给与节点 IAM 角色不同的 配置 VPC CNI 插件以使用服务账户的 IAM 角色 角色。创建集群和 IAM 角色后,您可以更新附加项以使用您创建的 IAM 角色。

  7. 选择 Next (下一步).

  8. Configure logging (配置日志记录) 页面上,您可以选择要启用的日志类型(可选)。默认情况下,每个日志类型均为已禁用. 有关更多信息,请参阅 Amazon EKS 控制层面日志记录.

  9. 选择 Next (下一步).

  10. Review and create (审核和创建) 页面上,审核您在先前页面上输入或选择的信息。如果需要对任何选择进行更改,请选择 Edit (编辑)。对设置满意后,选择 Create (创建). Status (状态) 字段显示 CREATING (正在创建),直到集群预配置过程完成。

    注意

    您可能会收到一个错误,指示请求中的可用区之一没有创建 Amazon EKS 集群的足够容量。如果发生这种情况,错误输出将包含可支持新集群的可用区。再次尝试使用至少两个位于您账户所支持可用区中的子网创建集群。有关更多信息,请参阅容量不足

    集群预配置需要几分钟时间。

  11. (可选)要使用 Amazon EKS 附加组件或启用单个 Kubernetes 工作负载以具有特定的 IAM 权限,您需要为集群启用 OpenID Connect (OIDC) 提供程序。要为您的集群配置 OIDC 提供商,请参阅为集群创建 IAM OIDC 提供商。您只需为集群启用一次 OIDC 提供商。要了解有关 Amazon EKS 附加组件的更多信息,请参阅配置 Amazon EKS 附加组件。要了解有关将特定 IAM 权限分配给工作负载的更多信息,请参阅技术概览

  12. 现已创建集群,请按照安装aws-iam-authenticator为 Amazon EKS 创建 kubeconfig 中的过程来支持与新集群的通信。

  13. (可选)如果要在集群中的 AWS Fargate 上运行 Pod,请参阅 通过 Amazon EKS 开始使用 AWS Fargate.

  14. 启用通信后,请按照启动自管理 Amazon Linux 节点中的过程来将 Linux 工作线程节点添加到您的集群以支持工作负载。

  15. (可选)将 Linux 工作线程节点添加到集群后,请按照Windows 支持中的过程向集群添加 Windows 支持并添加 Windows 工作线程节点。所有 Amazon EKS 集群必须至少包含一个 Linux 工作线程节点,即使您只想在集群中运行 Windows 工作负载也是如此。

在将节点部署到集群之前,我们建议将使用该集群部署的 AWS VPC CNI 插件配置为使用服务账户的 IAM 角色。有关更多信息,请参阅 配置 VPC CNI 插件以使用服务账户的 IAM 角色.

[使用 AWS CLI 创建集群]

此过程具有以下先决条件:

使用 创建集群AWS CLI

  1. 使用以下命令创建集群。替换您在Amazon 资源名称 (ARN)中创建的 Amazon EKS 集群 IAM 角色的 Amazon EKS 集群 IAM 角色 以及在为 Amazon EKS 集群创建 VPC中创建的 VPC 的子网和安全组 ID。将 <my-cluster> 替换为您的集群名称,并将 <region-code> 替换为支持的区域。您可以将 <1.18> 替换为任何受支持的版本

    aws eks create-cluster \ --region <region-code> \ --name <my-cluster> \ --kubernetes-version <1.18> \ --role-arn <arn:aws:iam::111122223333:role/eks-service-role-AWSServiceRoleForAmazonEKS-EXAMPLEBKZRQR> \ --resources-vpc-config subnetIds=<subnet-a9189fe2>,<subnet-50432629>,securityGroupIds=<sg-f5c54184>
    重要

    不要在 AWS Outposts、AWS Wavelength 或 AWS 本地扩展区中指定子网。仅在区域中指定子网。在部署集群后,使用集群名称标记 AWS Outposts、AWS Wavelength 或 AWS 本地扩展区(要将自行管理的节点部署到的子网)。有关更多信息,请参阅子网添加标签要求

    注意

    如果 IAM 用户没有管理员特权,则必须为该用户显式添加权限以调用 Amazon EKS API 操作。有关更多信息,请参阅 Amazon EKS 基于身份的策略示例.

    输出:

    { "cluster": { "name": "<my-cluster>", "arn": "arn:aws:eks:<region-code>:<111122223333>:cluster/<my-cluster>", "createdAt": <1527785885.159>, "version": "<1.18>", "roleArn": "arn:aws:iam::<111122223333>:role/eks-service-role-AWSServiceRoleForAmazonEKS-<AFNL4H8HB71F>", "resourcesVpcConfig": { "subnetIds": [ "<subnet-a9189fe2>", "<subnet-50432629>" ], "securityGroupIds": [ "<sg-f5c54184>" ], "vpcId": "<vpc-a54041dc>", "endpointPublicAccess": true, "endpointPrivateAccess": false }, "status": "CREATING", "certificateAuthority": {} } }
    注意

    您可能会收到一个错误,指示请求中的可用区之一没有创建 Amazon EKS 集群的足够容量。如果发生这种情况,错误输出将包含可支持新集群的可用区。再次尝试使用至少两个位于您账户所支持可用区中的子网创建集群。有关更多信息,请参阅容量不足

    要使用 AWS Key Management Service (AWS KMS) 中的客户主密钥 (CMK) 加密 Kubernetes 密钥,请首先使用 create-key 操作创建 CMK。

    MY_KEY_ARN=$(aws kms create-key --query KeyMetadata.Arn —-output text)
    注意

    默认情况下,create-key 命令使用密钥策略创建一个对称密钥,该密钥策略向账户的根用户管理员授予对 AWS KMS 操作和资源的访问权限。如果要缩小权限的范围,请确保允许对将调用 kms:DescribeKey API 的委托人的密钥策略执行 kms:CreateGrantcreate-cluster 操作。

    Amazon EKS 不支持密钥策略条件 kms:GrantIsForAWSResource。如果此操作位于密钥策略语句中,则将无法创建集群。

    --encryption-config 参数添加到 aws eks create-cluster 命令中。只有在创建集群时,才能启用 Kubernetes 密钥的加密。

    --encryption-config '[{"resources":["secrets"],"provider":{"keyArn":"<$MY_KEY_ARN>"}}]'

    keyArn 成员可以包含您的 CMK 的别名或 ARN。CMK 必须对称,在与集群相同的区域中创建,如果在不同的账户中创建了 CMK,则用户必须具有对 CMK 的访问权限。有关更多信息,请参阅 开发人员指南 中的允许其他账户中的用户使用 CMKAWS Key Management Service。使用 AWS KMS CMK 进行 Kubernetes 密钥加密需要 Kubernetes 版本 1.13 或更高版本。

    警告

    删除 CMK 会将集群永久性置于降级状态。如果计划删除用于创建集群的任何 CMK,请在删除前确认这是预期操作。删除密钥后,将无法恢复集群。

  2. 集群预配置需要几分钟时间。可使用以下命令查询集群的状态。如果集群状态为 ACTIVE,则可继续操作。

    aws eks --region <region-code> describe-cluster --name <my-cluster> --query "cluster.status"
  3. 在完成集群配置后,使用以下命令检索 endpointcertificateAuthority.data 值。您必须将这些值添加到 kubectl 配置,以便与集群进行通信。

    1. 检索 endpoint.

      aws eks --region <region-code> describe-cluster --name <my-cluster> --query "cluster.endpoint" --output text
    2. 检索 certificateAuthority.data.

      aws eks --region <region-code> describe-cluster --name <my-cluster> --query "cluster.certificateAuthority.data" --output text
  4. 现已创建集群,请按照为 Amazon EKS 创建 kubeconfig 中的过程来启用与新集群的通信。

  5. (可选)如果要在集群中的 AWS Fargate 上运行 Pod,请参阅 通过 Amazon EKS 开始使用 AWS Fargate.

  6. 启用通信后,请按照启动自管理 Amazon Linux 节点中的过程向集群添加节点以支持工作负载。

  7. (可选)将 Linux 节点添加到集群后,请按照Windows 支持中的过程向集群添加 Windows 支持并添加 Windows 节点。所有 Amazon EKS 集群必须至少包含一个 Linux 节点,即使您只想在集群中运行 Windows 工作负载也是如此。

  8. (可选)如果 AmazonEKS_CNI_Policy 托管 IAM 策略已附加到您的节点 IAM 角色,我们建议您将其分配给您改为关联到 Kubernetes IAM 服务账户的 aws-node 角色。有关更多信息,请参阅 配置 VPC CNI 插件以使用服务账户的 IAM 角色.