创建 AWS EKS 集群
Amazon Elastic Kubernetes Service (AWS EKS) 是一项托管服务,可让您在 AWS 上轻松跨多个可用区运行 Kubernetes,而无需安装、操作或维护您自己的 Kubernetes controlplane 或节点,以确保高可用性。有关 AWS EKS 的更多信息,请参考 官方文档 。
通过使用本指南,可在您的 AWS 账户中快速启动 AWS EKS Kubernetes 集群。
注意事项
-
目前本平台无法创建 IPV6 单栈的 AWS EKS 集群,如有需要,请在 AWS EKS 集群中创建后,参考文档: 接入 AWS EKS 集群 。
-
删除集群时 VPC 和子网不会被删除。
-
在平台删除本集群时,节点使用的磁盘也会一并删除,但是对于用户创建的容器,平台不会自动删除容器中 PV 关联的磁盘中的数据,您需参考常见问题手动删除。
前期准备
安装插件
安装前,您需要在 global 集群的插件页签栏,一键安装 AWS EKS 集群管理组件 。
创建角色
角色是指 AWS 服务中用户的权限承载体,通过使用角色可以访问其他服务中的资源,您需首先创建角色,定义该角色的权限策略,为绑定用户做准备。
-
参考官方文档并使用控制台 创建用于 AWS 服务的角色 。
-
在 选择可信实体 步骤中请选择当前 AWS 账户。
-
在 添加权限 步骤中,选择下表中 所有 需要使用的策略,并在 命名、查看和创建 步骤中,为角色绑定相应策略。
注意:这两个角色的名称是
cluster-api-provider-aws中固定的默认角色名称,不允许使用其它名称。角色 策略 eks-controlplane.cluster-api-provider-aws.sigs.k8s.ioAmazonEKSClusterPolicyeks-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 策略、角色和权限的官方文档 。
-
创建一个 IAM 策略,定义该用户在 AWS 账户中有权访问的内容。使用 自定义策略 并请按照官方文档中 使用 JSON 编辑器创建策略 的步骤创建 IAM 策略并将策略绑定到您的用户。
-
根据 官方文档 的步骤创建用户,其中在 设置权限 的 直接附加策略 选项中勾选上述创建的所有策略。
-
根据 官方文档 步骤为该用户创建访问密钥(Access Key)和密码访问密钥(Secret Key)。
注意:安全起见,建议您定期轮换访问密钥和密文密钥,更多信息请参阅 官方文档 。
-
在本平台 创建云凭证 。
(可选)创建 VPC 和子网
您需要建立一个 Amazon VPC 来启动 EKS 集群。VPC 使您能够将 AWS 资源启动到自定义的虚拟网络中。您可以手动创建 1 个 VPC 和 3 个自动分配公有 IPv4 地址的子网,并在创建集群时使用。如未创建,平台自动创建 1 个 VPC 和 3 个子网。
参考官方文档在 EKS 集群创建 VPC: 为你的 AWS EKS 集群创建具有公有和私有子网的 VPC 。
创建集群 - 基本信息
-
在左侧导航栏中,单击 集群管理 > 集群。
-
单击 创建集群 右侧
> 创建 AWS EKS 集群。
| 参数 | 说明 |
|---|---|
| 云凭证 | 选择已创建的云凭证,或 创建云凭证 并使用。 |
| 区域 | 选择本集群所在的 AWS 区域,更多信息请参考 官方文档 。 |
创建集群 - EKS 集群设置
| 参数 | 说明 |
|---|---|
| 标签 | 使用标签可以按用途、所有者或环境对资源进行分类。在您具有相同类型的资源时,可以使用分配给特定资源的标签来快速识别该资源。 |
| 集群地址类型 | 访问公有云集群时使用的地址类型。请确保本平台可通过公有网络或私有网络访问 AWS EKS 集群的 API Server 地址,选择 公网地址 + 内网地址 时,平台将自动判断集群地址类型。 |
| 公有云网络 | - 标准:平台自动创建 1 个 VPC 和 3 个子网,三个子网将在不同的可用区。 - 自定义:选择在公有云中已经创建的 VPC 和子网,该子网需开启 自动分配公有 IPv4 地址 功能,AWS EKS 需要您指定位于不同可用区的至少两个子网,以创建弹性网络接口实现集群和 VPC 之间的通信,详细信息请参考 AWS EKS VPC 和子网要求和注意事项 |
| Service 网段 | 供类型为 ClusterIP 的 Kubernetes Service 使用的 IP 地址段,不可与子网的网段重叠。 |
添加节点池
节点池为一类节点的集合,例如:高性能且按需计费的节点池。您可以通过添加多种不同类型的节点,以满足不同应用场景下的需求。
-
添加一个或多个节点池。
参数 说明 AMI 类型 EKS 支持的 AMI 镜像列表,参考 官方文档 。 容量计费方法 实例的计费方法,详情可以参考 官方文档 。
- On-Demand:使用按需实例,您按秒为计算容量支付费用,无需长期订阅。
- Spot:Amazon EC2 Spot 实例是备用的 Amazon EC2 容量,价格相当于在按需实例价格上打了巨大折扣。实例类型 节点池中的虚拟机节点所使用的实例类型,详情信息请参考 AWS 实例类型清单 。
注意:由于 EBS 不支持a1.medium,a1.large,a1.xlarge,a1.2xlarge,a1.4xlarge,如果您有 EBS 的使用需求,请您选择其他实例类型。磁盘大小 为每个节点选择附加 EBS 卷的大小。 节点池扩缩配置 所需节点数:指定托管节点池在启动时应当维持的当前节点数量。
最小节点数:指定托管节点池可以横向缩减到的最小节点数量。
最大节点数:指定托管节点池可以横向扩展到的最大节点数量。标签 使用标签可以按用途、所有者或环境对资源进行分类。在您具有相同类型的资源时,可以使用分配给特定资源的标签来快速识别该资源。 Kubernetes 标签 为节点池添加标签,标签是附加到 Kubernetes 对象上的键值对,用于指定对用户有意义且相关的标识属性,可高效的查询和标记相关资源。 污点 污点是节点的一个属性,污点可以让节点拒绝运行一类容器组,甚至驱逐容器组。 -
单击 创建,可查看集群创建进度。
相关操作
您可以在列表页面单击集群右侧的
或在详情页面单击右上角的 操作,按需更新集群下的节点等资源配置,或删除不再使用的集群。
| 操作 | 说明 |
|---|---|
| 更新 | 在 更新公有云集群配置 中更新已创建的部分集群配置,更新的配置将在 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 集群的哪些日志不会被平台采集?
目前平台不会采集以下日志:
提示:如您有需要,可联系技术支持获取方案。
-
集群的 API 请求相关的日志。
-
通过 Kubernetes API 访问集群相关的日志。
-
集群的身份验证请求相关的日志。
-
集群控制器状态相关的日志。
-
决策安排相关的日志。
本平台会部署 EKS 集群上的插件吗?
目前本平台在 EKS 集群上,默认部署了以下插件的推荐版本:
提示:如您需要部署更多插件或期望调整插件版本,可联系技术支持获取方案。
-
kubeproxy:在集群内启用服务联网功能。
-
CoreDNS:在集群中启用服务发现功能。
-
Amazon VPC CNI:在集群内启用 Pod 联网功能。
-
EBS-Driver:Amazon Elastic Block Store (Amazon EBS) Container Storage Interface (CSI) 驱动程序允许 Amazon Elastic Kubernetes Service (AWS EKS) 集群管理持久性卷的 Amazon EBS 卷的生命周期。
-
EFS-Driver:Amazon Elastic File System(Amazon EFS)提供无服务器的完全弹性文件存储,因此,您无需预置或管理存储容量和性能,即可共享文件数据。