首页 / 平台管理 / 集群管理 / 集群 / 创建公有云集群 / 创建 AWS EKS 集群

创建 AWS EKS 集群

Amazon Elastic Kubernetes Service (AWS EKS) 是一项托管服务,可让您在 AWS 上轻松跨多个可用区运行 Kubernetes,而无需安装、操作或维护您自己的 Kubernetes controlplane 或节点,以确保高可用性。有关 AWS EKS 的更多信息,请参考 官方文档

通过使用本指南,可在您的 AWS 账户中快速启动 AWS EKS Kubernetes 集群。

注意事项

前期准备

安装插件

安装前,您需要在 global 集群的插件页签栏,一键安装 AWS EKS 集群管理组件

创建角色

角色是指 AWS 服务中用户的权限承载体,通过使用角色可以访问其他服务中的资源,您需首先创建角色,定义该角色的权限策略,为绑定用户做准备。

  1. 参考官方文档并使用控制台 创建用于 AWS 服务的角色

  2. 选择可信实体 步骤中请选择当前 AWS 账户。

  3. 添加权限 步骤中,选择下表中 所有 需要使用的策略,并在 命名、查看和创建 步骤中,为角色绑定相应策略。

    注意:这两个角色的名称是 cluster-api-provider-aws 中固定的默认角色名称,不允许使用其它名称。

    角色 策略
    eks-controlplane.cluster-api-provider-aws.sigs.k8s.io AmazonEKSClusterPolicy
    eks-nodegroup.cluster-api-provider-aws.sigs.k8s.io
    - AmazonEC2ContainerRegistryReadOnly
    - AmazonEKS_CNI_Policy
    - AmazonEKSWorkerNodePolicy
    - AmazonEBSCSIDriverPolicy
    - AmazonEFSCSIDriverPolicy

创建用户

本平台需要访问您的 AWS 账户以便在 AWS EKS 中创建并管理您的 Kubernetes 集群。您需要在 AWS 账户中为本平台创建一个用户,并定义该用户可以访问的内容。

提示:有关 EKS 的 IAM 策略的更多详细信息请参阅 AWS EKS IAM 策略、角色和权限的官方文档

  1. 创建一个 IAM 策略,定义该用户在 AWS 账户中有权访问的内容。使用 自定义策略 并请按照官方文档中 使用 JSON 编辑器创建策略 的步骤创建 IAM 策略并将策略绑定到您的用户。

  2. 根据 官方文档 的步骤创建用户,其中在 设置权限直接附加策略 选项中勾选上述创建的所有策略。

  3. 根据 官方文档 步骤为该用户创建访问密钥(Access Key)和密码访问密钥(Secret Key)。

    注意:安全起见,建议您定期轮换访问密钥和密文密钥,更多信息请参阅 官方文档

  4. 在本平台 创建云凭证

(可选)创建 VPC 和子网

您需要建立一个 Amazon VPC 来启动 EKS 集群。VPC 使您能够将 AWS 资源启动到自定义的虚拟网络中。您可以手动创建 1 个 VPC 和 3 个自动分配公有 IPv4 地址的子网,并在创建集群时使用。如未创建,平台自动创建 1 个 VPC 和 3 个子网。

参考官方文档在 EKS 集群创建 VPC: 为你的 AWS EKS 集群创建具有公有和私有子网的 VPC

创建集群 - 基本信息

  1. 在左侧导航栏中,单击 集群管理 > 集群

  2. 单击 创建集群 右侧 > 创建 AWS EKS 集群

参数 说明
云凭证 选择已创建的云凭证,或 创建云凭证 并使用。
区域 选择本集群所在的 AWS 区域,更多信息请参考 官方文档

创建集群 - EKS 集群设置

参数 说明
标签 使用标签可以按用途、所有者或环境对资源进行分类。在您具有相同类型的资源时,可以使用分配给特定资源的标签来快速识别该资源。
集群地址类型 访问公有云集群时使用的地址类型。请确保本平台可通过公有网络或私有网络访问 AWS EKS 集群的 API Server 地址,选择 公网地址 + 内网地址 时,平台将自动判断集群地址类型。
公有云网络 - 标准:平台自动创建 1 个 VPC 和 3 个子网,三个子网将在不同的可用区。
- 自定义:选择在公有云中已经创建的 VPC 和子网,该子网需开启 自动分配公有 IPv4 地址 功能,AWS EKS 需要您指定位于不同可用区的至少两个子网,以创建弹性网络接口实现集群和 VPC 之间的通信,详细信息请参考 AWS EKS VPC 和子网要求和注意事项
Service 网段 供类型为 ClusterIP 的 Kubernetes Service 使用的 IP 地址段,不可与子网的网段重叠。

添加节点池

节点池为一类节点的集合,例如:高性能且按需计费的节点池。您可以通过添加多种不同类型的节点,以满足不同应用场景下的需求。

  1. 添加一个或多个节点池。

    参数 说明
    AMI 类型 EKS 支持的 AMI 镜像列表,参考 官方文档
    容量计费方法 实例的计费方法,详情可以参考 官方文档
    - On-Demand:使用按需实例,您按秒为计算容量支付费用,无需长期订阅。
    - Spot:Amazon EC2 Spot 实例是备用的 Amazon EC2 容量,价格相当于在按需实例价格上打了巨大折扣。
    实例类型 节点池中的虚拟机节点所使用的实例类型,详情信息请参考 AWS 实例类型清单
    注意:由于 EBS 不支持 a1.mediuma1.largea1.xlargea1.2xlargea1.4xlarge,如果您有 EBS 的使用需求,请您选择其他实例类型。
    磁盘大小 为每个节点选择附加 EBS 卷的大小。
    节点池扩缩配置 所需节点数:指定托管节点池在启动时应当维持的当前节点数量。
    最小节点数:指定托管节点池可以横向缩减到的最小节点数量。
    最大节点数:指定托管节点池可以横向扩展到的最大节点数量。
    标签 使用标签可以按用途、所有者或环境对资源进行分类。在您具有相同类型的资源时,可以使用分配给特定资源的标签来快速识别该资源。
    Kubernetes 标签 为节点池添加标签,标签是附加到 Kubernetes 对象上的键值对,用于指定对用户有意义且相关的标识属性,可高效的查询和标记相关资源。
    污点 污点是节点的一个属性,污点可以让节点拒绝运行一类容器组,甚至驱逐容器组。
  2. 单击 创建,可查看集群创建进度。

相关操作

您可以在列表页面单击集群右侧的 或在详情页面单击右上角的 操作,按需更新集群下的节点等资源配置,或删除不再使用的集群。

操作 说明
更新 更新公有云集群配置 中更新已创建的部分集群配置,更新的配置将在 AWS EKS 中同时生效。
删除 删除集群时,将会同时释放 AWS EKS 节点中的资源,请在删除前,确保已绑定该集群的项目中的应用已经备份或迁移。

自定义策略

controllers-eks.cluster-api-provider-aws.sigs.k8s.io

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "elasticfilesystem:DescribeFileSystems",
                "elasticfilesystem:CreateFileSystem",
                "eks:CreateFargateProfile",
                "eks:DeleteFargateProfile",
                "eks:DescribeFargateProfile",
                "eks:DeleteAddon",
                "eks:TagResource",
                "eks:UpdateAddon",
                "eks:CreateAddon",
                "eks:ListAddons",
                "eks:DescribeAddonVersions",
                "ec2:AssociateVpcCidrBlock",
                "eks:DescribeAddon",
                "ec2:DisassociateVpcCidrBlock"
            ],
            "Resource": "*"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": "iam:CreateServiceLinkedRole",
            "Resource": "arn:*:iam::*:role/aws-service-role/eks.amazonaws.com/AWSServiceRoleForAmazonEKS",
            "Condition": {
                "StringLike": {
                    "iam:AWSServiceName": "eks.amazonaws.com"
                }
            }
        },
        {
            "Sid": "VisualEditor2",
            "Effect": "Allow",
            "Action": "iam:CreateServiceLinkedRole",
            "Resource": "arn:*:iam::*:role/aws-service-role/eks-nodegroup.amazonaws.com/AWSServiceRoleForAmazonEKSNodegroup",
            "Condition": {
                "StringLike": {
                    "iam:AWSServiceName": "eks-nodegroup.amazonaws.com"
                }
            }
        },
        {
            "Sid": "VisualEditor3",
            "Effect": "Allow",
            "Action": "iam:CreateServiceLinkedRole",
            "Resource": "arn:aws:iam::*:role/aws-service-role/eks-fargate-pods.amazonaws.com/AWSServiceRoleForAmazonEKSForFargate",
            "Condition": {
                "StringLike": {
                    "iam:AWSServiceName": "eks-fargate.amazonaws.com"
                }
            }
        },
        {
            "Sid": "VisualEditor4",
            "Effect": "Allow",
            "Action": "iam:PassRole",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "iam:PassedToService": "eks.amazonaws.com"
                }
            }
        },
        {
            "Sid": "VisualEditor5",
            "Effect": "Allow",
            "Action": "iam:GetPolicy",
            "Resource": "arn:aws:iam::aws:policy/AmazonEKSClusterPolicy"
        },
        {
            "Sid": "VisualEditor6",
            "Effect": "Allow",
            "Action": [
                "kms:DescribeKey",
                "kms:CreateGrant"
            ],
            "Resource": "*",
            "Condition": {
                "ForAnyValue:StringLike": {
                    "kms:ResourceAliases": "alias/cluster-api-provider-aws-*"
                }
            }
        },
        {
            "Sid": "VisualEditor7",
            "Effect": "Allow",
            "Action": [
                "iam:GetRole",
                "eks:UpdateClusterVersion",
                "eks:DisassociateIdentityProviderConfig",
                "eks:UntagResource",
                "eks:UpdateClusterConfig",
                "eks:CreateNodegroup",
                "ssm:GetParameter",
                "eks:DeleteCluster",
                "eks:UpdateNodegroupVersion",
                "eks:DescribeNodegroup",
                "eks:DescribeIdentityProviderConfig",
                "eks:AssociateEncryptionConfig",
                "iam:ListAttachedRolePolicies",
                "eks:DeleteNodegroup",
                "eks:TagResource",
                "eks:UpdateNodegroupConfig",
                "eks:DescribeCluster",
                "eks:ListIdentityProviderConfigs",
                "eks:AssociateIdentityProviderConfig"
            ],
            "Resource": [
                "arn:*:ssm:*:*:parameter/aws/service/eks/optimized-ami/*",
                "arn:*:iam::*:role/*",
                "arn:*:eks:*:*:cluster/*",
                "arn:*:eks:*:*:nodegroup/*/*/*"
            ]
        },
        {
            "Sid": "VisualEditor8",
            "Effect": "Allow",
            "Action": [
                "eks:ListClusters",
                "eks:CreateCluster"
            ],
            "Resource": [
                "arn:*:eks:*:*:cluster/*",
                "arn:*:eks:*:*:nodegroup/*/*/*"
            ]
        }
    ]
}

controllers.cluster-api-provider-aws.sigs.k8s.io

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "ec2:AttachNetworkInterface",
                "ec2:DetachNetworkInterface",
                "ec2:AllocateAddress",
                "ec2:AssignIpv6Addresses",
                "ec2:AssignPrivateIpAddresses",
                "ec2:UnassignPrivateIpAddresses",
                "ec2:AssociateRouteTable",
                "ec2:AttachInternetGateway",
                "ec2:AuthorizeSecurityGroupIngress",
                "ec2:CreateInternetGateway",
                "ec2:CreateEgressOnlyInternetGateway",
                "ec2:CreateNatGateway",
                "ec2:CreateNetworkInterface",
                "ec2:CreateRoute",
                "ec2:CreateRouteTable",
                "ec2:CreateSecurityGroup",
                "ec2:CreateSubnet",
                "ec2:CreateTags",
                "ec2:CreateVpc",
                "ec2:ModifyVpcAttribute",
                "ec2:DeleteInternetGateway",
                "ec2:DeleteEgressOnlyInternetGateway",
                "ec2:DeleteNatGateway",
                "ec2:DeleteRouteTable",
                "ec2:ReplaceRoute",
                "ec2:DeleteSecurityGroup",
                "ec2:DeleteSubnet",
                "ec2:DeleteTags",
                "ec2:DeleteVpc",
                "ec2:DescribeAccountAttributes",
                "ec2:DescribeAddresses",
                "ec2:DescribeAvailabilityZones",
                "ec2:DescribeInstances",
                "ec2:DescribeInstanceTypes",
                "ec2:DescribeInternetGateways",
                "ec2:DescribeEgressOnlyInternetGateways",
                "ec2:DescribeInstanceTypes",
                "ec2:DescribeImages",
                "ec2:DescribeNatGateways",
                "ec2:DescribeNetworkInterfaces",
                "ec2:DescribeNetworkInterfaceAttribute",
                "ec2:DescribeRouteTables",
                "ec2:DescribeSecurityGroups",
                "ec2:DescribeSubnets",
                "ec2:DescribeVpcs",
                "ec2:DescribeVpcAttribute",
                "ec2:DescribeVolumes",
                "ec2:DescribeTags",
                "ec2:DetachInternetGateway",
                "ec2:DisassociateRouteTable",
                "ec2:DisassociateAddress",
                "ec2:ModifyInstanceAttribute",
                "ec2:ModifyNetworkInterfaceAttribute",
                "ec2:ModifySubnetAttribute",
                "ec2:ReleaseAddress",
                "ec2:RevokeSecurityGroupIngress",
                "ec2:RunInstances",
                "ec2:TerminateInstances",
                "tag:GetResources",
                "elasticloadbalancing:AddTags",
                "elasticloadbalancing:CreateLoadBalancer",
                "elasticloadbalancing:ConfigureHealthCheck",
                "elasticloadbalancing:DeleteLoadBalancer",
                "elasticloadbalancing:DeleteTargetGroup",
                "elasticloadbalancing:DescribeLoadBalancers",
                "elasticloadbalancing:DescribeLoadBalancerAttributes",
                "elasticloadbalancing:DescribeTargetGroups",
                "elasticloadbalancing:ApplySecurityGroupsToLoadBalancer",
                "elasticloadbalancing:DescribeTags",
                "elasticloadbalancing:ModifyLoadBalancerAttributes",
                "elasticloadbalancing:RegisterInstancesWithLoadBalancer",
                "elasticloadbalancing:DeregisterInstancesFromLoadBalancer",
                "elasticloadbalancing:RemoveTags",
                "autoscaling:DescribeAutoScalingGroups",
                "autoscaling:DescribeInstanceRefreshes",
                "ec2:CreateLaunchTemplate",
                "ec2:CreateLaunchTemplateVersion",
                "ec2:DescribeLaunchTemplates",
                "ec2:DescribeLaunchTemplateVersions",
                "ec2:DeleteLaunchTemplate",
                "ec2:DeleteLaunchTemplateVersions",
                "ec2:DescribeKeyPairs",
                "ec2:ModifyInstanceMetadataOptions"
            ],
            "Resource": [
                "*"
            ],
            "Effect": "Allow"
        },
        {
            "Action": [
                "autoscaling:CreateAutoScalingGroup",
                "autoscaling:UpdateAutoScalingGroup",
                "autoscaling:CreateOrUpdateTags",
                "autoscaling:StartInstanceRefresh",
                "autoscaling:DeleteAutoScalingGroup",
                "autoscaling:DeleteTags"
            ],
            "Resource": [
                "arn:*:autoscaling:*:*:autoScalingGroup:*:autoScalingGroupName/*"
            ],
            "Effect": "Allow"
        },
        {
            "Condition": {
                "StringLike": {
                    "iam:AWSServiceName": "autoscaling.amazonaws.com"
                }
            },
            "Action": [
                "iam:CreateServiceLinkedRole"
            ],
            "Resource": [
                "arn:*:iam::*:role/aws-service-role/autoscaling.amazonaws.com/AWSServiceRoleForAutoScaling"
            ],
            "Effect": "Allow"
        },
        {
            "Condition": {
                "StringLike": {
                    "iam:AWSServiceName": "elasticloadbalancing.amazonaws.com"
                }
            },
            "Action": [
                "iam:CreateServiceLinkedRole"
            ],
            "Resource": [
                "arn:*:iam::*:role/aws-service-role/elasticloadbalancing.amazonaws.com/AWSServiceRoleForElasticLoadBalancing"
            ],
            "Effect": "Allow"
        },
        {
            "Condition": {
                "StringLike": {
                    "iam:AWSServiceName": "spot.amazonaws.com"
                }
            },
            "Action": [
                "iam:CreateServiceLinkedRole"
            ],
            "Resource": [
                "arn:*:iam::*:role/aws-service-role/spot.amazonaws.com/AWSServiceRoleForEC2Spot"
            ],
            "Effect": "Allow"
        },
        {
            "Action": [
                "iam:PassRole"
            ],
            "Resource": [
                "arn:*:iam::*:role/*.cluster-api-provider-aws.sigs.k8s.io"
            ],
            "Effect": "Allow"
        },
        {
            "Action": [
                "secretsmanager:CreateSecret",
                "secretsmanager:DeleteSecret",
                "secretsmanager:TagResource"
            ],
            "Resource": [
                "arn:*:secretsmanager:*:*:secret:aws.cluster.x-k8s.io/*"
            ],
            "Effect": "Allow"
        }
    ]
}

nodes.cluster-api-provider-aws.sigs.k8s.io

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "ec2:AssignIpv6Addresses",
                "ec2:DescribeInstances",
                "ec2:DescribeRegions",
                "ec2:CreateTags",
                "ec2:DescribeTags",
                "ec2:DescribeNetworkInterfaces",
                "ec2:DescribeInstanceTypes",
                "ecr:GetAuthorizationToken",
                "ecr:BatchCheckLayerAvailability",
                "ecr:GetDownloadUrlForLayer",
                "ecr:GetRepositoryPolicy",
                "ecr:DescribeRepositories",
                "ecr:ListImages",
                "ecr:BatchGetImage"
            ],
            "Resource": [
                "*"
            ],
            "Effect": "Allow"
        },
        {
            "Action": [
                "secretsmanager:DeleteSecret",
                "secretsmanager:GetSecretValue"
            ],
            "Resource": [
                "arn:*:secretsmanager:*:*:secret:aws.cluster.x-k8s.io/*"
            ],
            "Effect": "Allow"
        },
        {
            "Action": [
                "ssm:UpdateInstanceInformation",
                "ssmmessages:CreateControlChannel",
                "ssmmessages:CreateDataChannel",
                "ssmmessages:OpenControlChannel",
                "ssmmessages:OpenDataChannel",
                "s3:GetEncryptionConfiguration"
            ],
            "Resource": [
                "*"
            ],
            "Effect": "Allow"
        }
    ]
}

常见问题

如何手动删除 PV 关联的磁盘?

删除 PV 关联的磁盘:您可以在 EC2 中的 Elastic Block Store > 列表中,单击卷查看详情,根据标签查找相应的实例并删除。例如,使用 ebs-sc 创建的 EBS 实例中将带有集群名的标签。

使用本平台创建的 EKS 集群,在 EKS 集群详情页上提示 “您的当前 IAM 主体没有权限访问此集群上的 Kubernetes 对象(Your current IAM principal doesn’t have access to Kubernetes objects on this cluster.)”

问题描述:出现以上报错后,在 资源 标签页下无法查看 Kubernetes 资源,在 计算 标签页下无法查看节点。这是因为当前访问 AWS 页面的用户可能没有访问当前 EKS 中 Kubernetes 资源的权限,可参考官方 问题排查 文档。

解决方法:您需要手动编辑 ConfigMap 文件,执行 kubectl edit n kube-system configmaps aws-auth,添加 mapUsers 字段,将 AWS 的用户映射到 Kubernetes 的 Group,操作完成后,当前用户即可使用相应的身份操作 Kubernetes 资源,详细操作步骤请参考 AWS 官方文档 所需权限 小节的第三步。

EKS 集群的哪些日志不会被平台采集?

目前平台不会采集以下日志:

提示:如您有需要,可联系技术支持获取方案。

本平台会部署 EKS 集群上的插件吗?

目前本平台在 EKS 集群上,默认部署了以下插件的推荐版本:

提示:如您需要部署更多插件或期望调整插件版本,可联系技术支持获取方案。