Kubernetes是Google开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。在Kubernetes中,我们可以创建多个容器,每个容器里面运行一个应用实例,然后通过内置的负载均衡策略,实现对这一组应用实例的管理、发现、访问,而这些细节都不需要运维人员去进行复杂的手工配置和处理。
在AWS上,亚马逊推出了Amazon Elastic Kubernetes Service (Amazon EKS) ,这是一项完全托管的 Kubernetes 服务。
创建EKS集群后,EKS会自动创建k8s的master节点,我们只需要添加 worker节点即可,就可以进行连接部署应用了。
在Amazon EKS产品发布之前,要运行具有高可用性的Kubernetes集群,需要专业知识,客户要跨多个可用区(AZ)设置Kubernetes管理基础架构。
Amazon EKS消除了这种复杂性,并交付了可供生产环境使用的架构,该架构可跨多个可用区自动运行Kubernetes管理基础架构,消除单点故障。Amazon EKS自动检测并替换不正常的节点,为管理基础架构打补丁,并且按需执行版本升级。这使得由Amazon EKS管理的Kubernetes基础架构具有弹性,即使丢失整个可用区也能正常运行。
Amazon EKS已通过Kubernetes认证,客户可以使用现有的Kubernetes工具运行其现有Kubernetes应用程序,无需进行任何代码更改。
目前Amazon EKS已在由北京光环新网科技股份有限公司(简称“光环新网”)运营的AWS中国(北京)区域和宁夏西部云数据技术有限公司(简称“西云数据”)运营的AWS中国(宁夏)区域及正式商用。
官方介绍和定价等
官方详细文档
EKS可跨多个可用区自动运行Kubernetes管理基础架构,消除单点故障。Amazon EKS自动检测并替换不正常的节点,为管理基础架构打补丁,并且按需执行版本升级。这使得由Amazon EKS管理的Kubernetes基础架构具有弹性,即使丢失整个可用区也能正常运行。
Amazon EKS的服务帮助你能够更好的运行托管的Kubernetes的平台。Amazon EKS上,用户可以建立一个横跨三个AZ可用区的kubernetes集群,运行你的master nodes(控制平面),提供高可用的API服务。
三个master nodes上又有不同的etcd 能够做同步,也提供了API的功能,Scheduler的功能,controller的功能,让你横跨三个AZ,稳定的运行。
利用EKS全授管的特性,你只需要自己去搭建你所需要的worker nodes工作群组即可。你不需要自建master nodes,也不再去需要关心master nodes如何解决高可用的问题。
EKS是为了更好的运行企业级工作负载而设计的。你可以把最核心的业务运行在AWS上,而不需要关心每日备份、管理等复杂的工作。
EKS 与诸如 Amazon CloudWatch、Auto Scaling 组、AWS Identity and Access Management (IAM) 和 Amazon Virtual Private Cloud (VPC) 之类的服务深度集成,为您带来监控、扩展和负载平衡应用程序的无缝体验。
EKS跟上游kubernetes社区保持同步,上游kubernetes的功能完整的继承在Amazon EKS里面,为您提供kubernetes原生体验。所有在EKS里做出的功能和优化,AWS团队都会将这些内容完整的贡献到上游kubernetes社区,成为开源项目的一部分,让所有社区成员都能共享这一功能。
所有标准 Kubernetes 环境上运行的应用程序均完全兼容,并可轻松迁移到 Amazon EKS。
混合部署:您可以使用 EKS on AWS Outposts 运行对本地系统的延迟要求低的容器化应用程序。
机器学习:您可以结合使用 Kubeflow 与 EKS 来为您的机器学习工作流程建模,并使用最新的采用 EC2 GPU 的实例类型有效地运行分布式培训作业。
批处理:使用 EKS,您可以通过全系列的 AWS 计算服务和功能(如 Amazon EC2、Fargate 和 Spot 实例)计划、安排和执行批量计算工作负载。
Web应用程序:您可以构建自动扩展和缩减并跨多个可用区在高度可用的配置中运行的 Web 应用程序。您的 Web 应用程序在 EKS 上运行,可以从 AWS 的性能、可扩展性、可靠性和可用性中获益。
3月13日消息,AWS 宣布,Amazon Elastic Kubernetes Service(Amazon EKS)现已在由宁夏西部云数据技术有限公司(简称“西云数据”)运营的AWS中国(宁夏)区域及北京光环新网科技股份有限公司(简称“光环新网”)运营的AWS中国(北京)区域正式商用。
据了解,Intel、Snap以及如猎豹移动、晶泰科技、汇量科技、茄子快传等已经在使用Amazon EKS。
http://aws.amazon.bokecc.com/news/show-1092.html?refid=ptrdonadodaws2019van
视频版 https://www.bilibili.com/video/av66611022/
EKS有两种方式可以搭建部署集群,一种是界面化的控制台,一种是使用命令行工具eksctl。
eksctl命令行工具安装 原理是:通过 aws cli 调用 CloudFormation 的相关 API,启动一个创建 EKS Cluster 的 Stack 和一个创建 EKS nodes 的 Stack 去创建集群所需的各种资源(包括网关、IP、VPC、EC2 等等)
在使用eksctl命令工具安装之前,需要先安装三个相关的工具
1、aws cli命令工具 (如果使用pip命令安装aws cli命令则还需要python环境,或者下载使用压缩包进行安装)
2、eksctl 命令工具
3、kubectl命令工具
版本要求:>= 2.7.9
用途:安装 aws cli
mac使用homebrew安装
如未安装homebrew,先安装homebrew
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
或
/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"
安装完homebrew后 使用命令
brew install python3
配置环境变量,命令:open .bash_profile 在打开的文件窗口粘贴以下内容:
PATH=/usr/local/Cellar/python/3.6.5/bin:${PATH}
export PATH
保存关闭文件,就完成整个python3的安装
windows系统参考
windows安装python3.7
linux系统参考
ubuntu16.04安装python3.7
安装完成后使用命令校验版本
python3 -V
pip3 -V
用途:操作 aws 资源
确保您已安装 AWS CLI 的版本 1.16.156 或更高版本 否则后续部分eks的命令无法使用
使用命令
pip3 install awscli --upgrade --user
安装完成后使用命令检查版本
aws --version
如果老版本的awscli命令导致新版本的无法安装可以先卸载再安装,使用命令如下:
$sudo rm -rf /usr/local/aws
$sudo rm /usr/local/bin/aws
$pip3 install awscli --upgrade --force-reinstall --user
$export PATH=/Users/joe/Library/Python/3.7/bin/:$PATH
/Users/joe/Library/Python/3.7/bin/与自己的目录对应。
用途:操作 aws eks 资源
mac系统
如未安装homebrew,先安装homebrew
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
或
/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"
使用命令
brew tap weaveworks/tap
brew install weaveworks/tap/eksctl
如果已安装过eksctl,升级eksctl使用命令
brew upgrade eksctl && brew link --overwrite eksctl
linux系统 使用命令
curl --silent --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp
sudo mv /tmp/eksctl /usr/local/bin
windows系统
需要安装Chocolatey
然后使用命令
chocolatey install -y eksctl
如果已经安装过eksctl,升级eksctl使用命令
chocolatey upgrade -y eksctl
使用以下命令测试您的安装是否成功。
eksctl version
版本要求:最新版本或不低于 Kubernetes 版本 1 个小版本号。
用途:操作 Kubernetes 集群
mac系统 使用命令
curl -o kubectl https://amazon-eks.s3.us-west-2.amazonaws.com/1.17.7/2020-07-08/bin/darwin/amd64/kubectl
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin
linux系统 使用命令
curl -o kubectl https://amazon-eks.s3.us-west-2.amazonaws.com/1.17.7/2020-07-08/bin/linux/amd64/kubectl
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl
windows系统 使用命令
curl -o kubectl.exe https://amazon-eks.s3.us-west-2.amazonaws.com/1.17.7/2020-07-08/bin/windows/amd64/kubectl.exe
将二进制文件复制到您的 PATH 中的文件夹。如果 PATH 中有现有目录可用于命令行实用程序,请将二进制文件复制到该目录。否则,请完成以下步骤。
为命令行二进制文件创建一个新目录,例如 C:\bin。
将 kubectl.exe 二进制文件复制到新目录中。
编辑用户或系统 PATH 环境变量,将新目录添加到 PATH 中。
关闭 PowerShell 终端并打开一个新的来选取新的 PATH 变量。
使用以下命令测试您的安装是否成功。
kubectl version
eksctl 和 AWS CLI 均要求您在环境中配置 AWS 凭证。
这个凭证需要在控制台中创建IAM角色后可以获取。
对于一般用途,aws configure 命令是设置 AWS CLI 安装的最快方法。
$ aws configure
AWS Access Key ID [None]: AKIAIOSFOxxxxxx
AWS Secret Access Key [None]: wJalrxxxxxxxxxx
Default region name [None]: region-code
Default output format [None]: json
键入该命令时,AWS CLI 会提示您输入四条信息:access key、secret access key、AWS Region 和 output format。此信息存储在名为 default 的配置文件(一个设置集合)中。除非您指定另一个命令,否则在运行命令时使用此配置文件。
有关更多信息,请参阅 AWS Command Line Interface 用户指南 中的配置 AWS CLI
我们在上一步已经配置了一个IAM的角色 在aws cli的命令行工具中。
默认情况下,这个IAM 用户和角色没有创建或修改 Amazon EKS 资源的权限。它还无法使用 AWS 管理控制台、AWS CLI 或 AWS API 执行任务。IAM 管理员必须创建 IAM 策略,为用户和角色授予权限,以便对他们所需的指定资源执行特定的 API 操作。然后,管理员必须将这些策略附加到需要这些权限的 IAM 用户或组。
等我们设置好权限之后,当我们创建 Amazon EKS 集群时,会在集群的 RBAC 配置中自动为创建集群的 IAM 实体用户或角色(例如,联合身份用户)授予 system:masters 权限。
默认只有这个IAM角色可以与我们创建的EKS集群进行交互,如果我们要授予其他 AWS 用户或角色与您的集群进行交互的能力,必须编辑 Kubernetes 内的 aws-auth ConfigMap。
因为权限策略 最好授予最低权限,才足够安全,所以我们需要知道设置哪些权限可以保证 eks集群能够创建成功,而又没有给多余的权限。
gitlab中已经有用户测试出来了最小的权限设置配置json,我们可以拿来直接使用,json如下:
CloudFormation权限
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "eksCtlCloudFormation",
"Effect": "Allow",
"Action": "cloudformation:*",
"Resource": "*"
}
]
}
EKS读写权限
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "eks:*",
"Resource": "*"
}
]
}
注意 如果限定资源,中国区的 resource
"Resource": "arn:aws:eks:*:*:cluster/*"
需要替换为
"Resource": "arn:aws-cn:eks:*:*:cluster/*"
EC2相关权限
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"ec2:CreateInternetGateway",
"ec2:CreateVpc",
"ec2:Describe*",
"ec2:createTags",
"ec2:ModifyVpcAttribute",
"ec2:ModifySubnetAttribute",
"ec2:ModifyVpcEndpoint",
"ec2:ModifyVpcEndpointConnectionNotification",
"ec2:ModifyVpcEndpointServiceConfiguration",
"ec2:ModifyVpcEndpointServicePermissions",
"ec2:ModifyVpcPeeringConnectionOptions",
"ec2:ModifyVpcTenancy",
"ec2:AcceptVpcPeeringConnection",
"ec2:AcceptVpcEndpointConnections",
"ec2:CreateVpcEndpoint",
"ec2:CreateVpcEndpointConnectionNotification",
"ec2:CreateVpcEndpointServiceConfiguration",
"ec2:DescribeVpcEndpointConnectionNotifications",
"ec2:DescribeVpcEndpointConnections",
"ec2:DescribeVpcEndpoints",
"ec2:DescribeVpcEndpointServiceConfigurations",
"ec2:DescribeVpcEndpointServicePermissions",
"ec2:DescribeVpcEndpointServices",
"ec2:CreateSubnet",
"ec2:CreateSubnet",
"ec2:CreateRouteTable",
"ec2:CreateSecurityGroup",
"ec2:DeleteSecurityGroup",
"ec2:AttachInternetGateway",
"ec2:CreateRoute",
"ec2:AuthorizeSecurityGroupIngress",
"ec2:AuthorizeSecurityGroupEgress",
"ec2:RevokeSecurityGroupEgress",
"ec2:RevokeSecurityGroupIngress",
"ec2:AssociateRouteTable",
"ec2:CreateNatGateway",
"ec2:AllocateAddress",
"ec2:DeleteInternetGateway",
"ec2:DeleteNatGateway",
"ec2:DeleteRoute",
"ec2:DeleteRouteTable",
"ec2:DeleteSubnet",
"ec2:DeleteTags",
"ec2:DeleteVpc",
"ec2:DescribeInternetGateways",
"ec2:DescribeNatGateways",
"ec2:DescribeRouteTables",
"ec2:DescribeSecurityGroups",
"ec2:DescribeSubnets",
"ec2:DescribeTags",
"ec2:DescribeVpcAttribute",
"ec2:DetachInternetGateway",
"ec2:DisassociateRouteTable",
"ec2:RunInstances",
"ec2:ReleaseAddress"
],
"Resource": "*"
}
]
}
CloudWatch 相关权限
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"cloudwatch:ListMetrics",
"cloudwatch:GetMetricStatistics",
"cloudwatch:Describe*"
],
"Resource": "*"
}
]
}
autoscaling 相关权限
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"autoscaling:CreateAutoScalingGroup",
"autoscaling:DescribeTags",
"autoscaling:DeleteAutoScalingGroup",
"autoscaling:DescribeAutoScalingInstances",
"autoscaling:DeleteLaunchConfiguration",
"autoscaling:DescribeAutoScalingGroups",
"autoscaling:DescribeLaunchConfigurations",
"autoscaling:DescribeScalingActivities",
"autoscaling:SetDesiredCapacity",
"ec2:DescribeLaunchTemplateVersions",
"autoscaling:TerminateInstanceInAutoScalingGroup",
"autoscaling:UpdateAutoScalingGroup"
],
"Resource": "*"
}
]
}
elasticloadbalancing 相关权限
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "elasticloadbalancing:Describe*",
"Resource": "*"
}
]
}
iam 相关权限
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"iam:CreateRole",
"iam:AttachRolePolicy",
"iam:DetachRolePolicy",
"iam:GetRole",
"iam:PassRole",
"iam:DeleteRole",
"iam:CreateInstanceProfile",
"iam:AddRoleToInstanceProfile",
"iam:DeleteInstanceProfile",
"iam:RemoveRoleFromInstanceProfile",
"iam:GetInstanceProfile",
"iam:PutRolePolicy",
"iam:DeleteRolePolicy",
"iam:GetRolePolicy",
"iam:ListInstanceProfiles",
"iam:CreateServiceLinkedRole",
"iam:ListInstanceProfilesForRole",
"iam:GetOpenIDConnectProvider"
],
"Resource": "*"
}
]
}
LaunchTemplate 相关权限
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor2",
"Effect": "Allow",
"Action": [
"autoscaling:CreateLaunchConfiguration",
"ec2:CreateLaunchTemplate",
"ec2:DeleteLaunchTemplate",
"ec2:ModifyLaunchTemplate",
"ec2:DeleteLaunchTemplateVersions",
"ec2:CreateLaunchTemplateVersion",
"ec2:GetLaunchTemplateData",
"ec2:DescribeLaunchTemplates",
"ec2:DescribeLaunchTemplateVersions"
],
"Resource": [
"arn:aws-cn:autoscaling:*:*:launchConfiguration:*:launchConfigurationName/*",
"arn:aws-cn:ec2:*:*:launch-template/*"
]
}
]
}
ssm相关权限:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ssm:*"
],
"Resource": "*"
}
]
}
要了解如何使用这些示例 JSON 策略文档创建 IAM 基于身份的策略,请参阅 IAM 用户指南 中的在 JSON 选项卡上创建策略。
如果已经有公司层面原有的相关策略,可以直接把控制台把策略关联到 创建eks集群使用的IAM中。
更多iam权限设置相关资料可参考:
Amazon EKS 基于身份的策略示例
iam控制ec2权限以及自动伸缩的原理
aws-iam-authenticator是负责使用AWS IAM 证书 来对k8s集群进行 权限认证和沟通交互的服务。
aws-iam-authenticator git地址
aws-iam-authenticator安装文档
使用命令
curl -o aws-iam-authenticator https://amazon-eks.s3.us-west-2.amazonaws.com/1.17.7/2020-07-08/bin/darwin/amd64/aws-iam-authenticator
chmod +x ./aws-iam-authenticator
mkdir -p $HOME/bin && cp ./aws-iam-authenticator $HOME/bin/aws-iam-authenticator && export PATH=$HOME/bin:$PATH
echo 'export PATH=$HOME/bin:$PATH' >> ~/.bashrc
安装完成后可使用命令
// 获取 token
aws-iam-authenticator token -i
// 查看调用者
aws sts get-caller-identity
可能遇到的问题—bash: /Users/joe/bin/aws-iam-authenticator: cannot execute binary file
这是由于 安装的aws-iam-authenticator 平台版本不对应的原因,请按照官网的最新命令进行安装,详情参考:
aws-iam-authenticator安装文档
命令版本安装更多参考:
命令版本 英文官方文档
命令版本 中文官方文档
命令版本 用户实践
使用命令
eksctl create cluster \
--name prod \
--version 1.13 \
--nodegroup-name standard-workers \
--node-type t3.medium \
--nodes 3 \
--nodes-min 1 \
--nodes-max 4 \
--node-ami auto
这里可以指定集群使用的 相关的节点类型和 数量。
如果使用默认命令
eksctl create nodegroup --cluster=yourClusterName --name=yourNodeGroupName --region yourRegionName
默认参数为:
Instance type = m5.large
AMI : lastest AWS EKS AMI
Nodes-desired capacity = 2
Nodes-min capacity =2
Nodes-max capacity=2
注意:默认情况下,新节点组会继承从控制层安装的 Kubernetes 版本 (–version=auto),当然您也可以指定其他版本的 Kubernetes(例如 version=1.13)。要使用最新版本的 Kubernetes,请运行 –version=latest 命令。
注意:如果选择 P2 或 P3 实例类型和 Amazon EKS 优化的 AMI(具有 GPU 支持),则必须使用以下命令在集群上将适用于 Kubernetes 的 NVIDIA 设备插件用作守护程序集。
kubectl apply -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/1.0.0-beta/nvidia-device-plugin.yml
eksctl命令也支持使用配置文件进行集群的创建,方便我们进行复杂的参数配置和留存可视化。
例如 创建集群配置文件eks.yaml内容如下:
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
name: eksdemo
region: ap-northeast-1
nodeGroups:
- name: ng-1
minSize: 4
maxSize: 8
instancesDistribution:
instanceTypes: ["t3.small", "t3.medium", "t3.large"]
onDemandBaseCapacity: 2
onDemandPercentageAboveBaseCapacity: 0
spotInstancePools: 2
通过以上配置清单利用 eksctl 就可以在 ap-northeast-1 region 创建一个名为 eksdemo 的 EKS 集群,同时建立起一个名为 ng-1的nodegroup ,当中由多种 instance types 组成,其中 OnDemand 基线(baseline)为 2,意味着保证会有两台 on-demand 实例,而其他的实例则由 ondemand+spot 组成,但由于我们定义了 onDemandPercentageAboveBaseCapacity 为 0, 意味着额外需要的两台实例(minSize-onDemandBaseCapacity)全部由 spot 来满足。关于 Auto Scaling Groups更多参数可以参考该 链接,更多的 cluster YAML 配置示例可以参考 weaveworks 的 github
使用命令创建eks集群如下:
eksctl create cluster --config-file=yourConfigFileName
eksctl create cluster --config-file=eks.yaml
使用命令更新eks集群如下:
eksctl create nodegroup --config-file=yourConfigFileName
eksctl create nodegroup --config-file=eks.yaml
整个过程大约10到15分钟,如果集群定义复杂可能会更长时间。
当我们遇到报错,可以在CloudFormation界面中查看原因或者使用命令查看原因
eksctl utils describe-stacks --region=cn-northwest-1 --cluster=eks-beta
成功创建输出如下:
[ℹ] waiting for the control plane availability...
[✔] saved kubeconfig as "/Users/joe/.kube/config"
[ℹ] no tasks
[✔] all EKS cluster resources for "eks-beta" have been created
[ℹ] adding identity "arn:aws-cn:iam::xxx:role/eksctl-eks-beta-nodegroup-eks-bet-NodeInstanceRole-xxxx" to auth ConfigMap
[ℹ] nodegroup "eks-beta-workers" has 0 node(s)
[ℹ] waiting for at least 1 node(s) to become ready in "eks-beta-workers"
[ℹ] nodegroup "eks-beta-workers" has 2 node(s)
[ℹ] node "ip-192-168-2-xxx.cn-northwest-1.compute.internal" is not ready
[ℹ] node "ip-192-168-xx-x.cn-northwest-1.compute.internal" is ready
[ℹ] kubectl command should work with "/Users/joe/.kube/config", try 'kubectl get nodes'
[✔] EKS cluster "eks-beta" in "cn-northwest-1" region is ready
zhangxiaofans-MacBook-Pro:Downloads joe$
注意 指定ami有可能的导致创建节点超时
[ℹ] waiting for at least 1 node(s) to become ready in "eks-beta-workers"
Error: timed out (after 25m0s) waiting for at least 1 nodes to join the cluster and become ready in "eks-beta-workers"
需要找到适合ami镜像,我这里使用的是默认镜像。
关于针对eks优化过后的ami镜像可以参考:
宁夏区北京区优化后的ami
根据可用区生产优化后的ami
注意
经 Amazon EKS 优化的加速 AMI 仅支持基于 GPU 和 Inferentia 的实例类型。务必在节点 AWS CloudFormation 模板中指定这些实例类型。使用经 Amazon EKS 优化的加速 AMI,即表明您同意 NVIDIA 的最终用户许可协议 (EULA)。
经 Amazon EKS 优化的加速 AMI 以前称为带 GPU 支持的 Amazon EKS 优化 AMI。
所以我们只选用 针对eks优化过的即可,不需要选 已加速的。
在进行到 创建集群的最后步骤时 需要等待节点启动,但是 可能会遇到超时的情况,除了 ami镜像的问题,也可能是我们的configfile里面的配置格式错误导致的。
建议 在编写configfile时参考 eksctl的schema格式。
如果遇到超时的情况, 需要知道详细的原因,步骤如下:
1、在aws的控制台ec2栏目中创建密钥对,如图:
创建完毕后 我们会自动下载到一个 pem文件
2、在configfile中配置 允许ssh链接:
kind: ClusterConfig
apiVersion: eksctl.io/v1alpha5
metadata:
name: eks-beta
region: cn-northwest-1
version: "1.17"
nodeGroups:
- name: nodes
minSize: 1
maxSize: 3
instanceType: c5.large
taints:
feaster: "123=:NoSchedule"
tags:
k8s.io/cluster-autoscaler/enabled: "true"
k8s.io/cluster-autoscaler/eks-beta: "owned"
ssh:
allow: true
publicKeyName: eks-ssh
3、创建集群
使用命令
eksctl create cluster --config-file=eks.txt
4、当遇到超时或者很久都等不到集群ready状态,可以登录到集群中
首先在ec2的管理界面中找到 eks-beta(cluster name)的node如图
找到它的公有dns,例如:
ec2-123-123-159-211.cn-northwest-1.compute.amazonaws.com.cn
使用命令:
sudo chmod 600 key.pem
ssh -i key.pem ec2-user@IP
例如:
ssh -i key.pem ec2-user@ec2-123-123-159-211.cn-northwest-1.compute.amazonaws.com.cn
ec2-user为固定值
ec2-123-123-159-211.cn-northwest-1.compute.amazonaws.com.cn与 自己的公有dns对应
5、查看/var/log/messages文件,搜索kubelet相关的信息
使用命令
sudo su
cat /var/log/messages |grep "kubelet" | grep "invalid"
输出如下:
[ec2-user@ip-192-168-12-100 ~]$ sudo su
[root@ip-192-168-12-100 ec2-user]#
[root@ip-192-168-12-100 ec2-user]#
[root@ip-192-168-12-100 ec2-user]# cat /var/log/messages |grep "kubelet" | grep "invalid"
Aug 23 12:49:28 ip-192-168-12-100 kubelet: F0823 12:49:28.934605 29289 server.go:156] invalid argument "feaster=proj=:NoSchedule" for "--register-with-taints" flag: invalid taint spec: feaster=proj=:NoSchedule
Aug 23 12:49:34 ip-192-168-12-100 kubelet: F0823 12:49:34.150519 29347 server.go:156] invalid argument "feaster=proj=:NoSchedule" for "--register-with-taints" flag: invalid taint spec: feaster=proj=:NoSchedule
Aug 23 12:49:39 ip-192-168-12-100 kubelet: F0823 12:49:39.434994 29408 server.go:156] invalid argument "feaster=proj=:NoSchedule" for "--register-with-taints" flag: invalid taint spec: feaster=proj=:NoSchedule
说明 taint 属性设置错误
或者使用以下命令查看 最后200行 kubelet相关日志
tail -n 200 /var/log/messages |grep "kubelet"
如果我们的实例都没有起来,就已经报错了,需要在CloudFormation中查看相关的错误信息。
如果CloudFormation中没有相关的错误信息,还有一种debug的方法就是 在使用eksctl命令时加上 -v 4 参数,会打印出比较详细的日志,方便排查,使用命令如下:
eksctl create cluster --config-file=eks.txt -v 4
捕捉到的错误信息 例如:
2020-08-26T20:15:49+08:00 [▶] failed task: 2 sequential sub-tasks: { update cluster VPC endpoint access configuration, create nodegroup "nodes" } (will not run other sequential tasks)
2020-08-26T20:15:49+08:00 [!] 1 error(s) occurred and cluster hasn't been created properly, you may wish to check CloudFormation console
2020-08-26T20:15:49+08:00 [ℹ] to cleanup resources, run 'eksctl delete cluster --region=cn-northwest-1 --name=eks-beta'
2020-08-26T20:15:49+08:00 [✖] AccessDeniedException:
status code: 403, request id: 12345-2ecd-4cd3-8a07-af8ba20136da
Error: failed to create cluster "eks-beta"
zhangxiaofans-MacBook-Pro:Downloads joe$
参考:
控制台版本 http://lizhe.name/node/375
控制台版本 https://zhuanlan.zhihu.com/p/110791869
我们在上面的步骤已经新建了一个EKS集群名字为 --name prod 。默认已经有一个节点组根据我们的参数创建名为–nodegroup-name standard-workers。
但是实际生产环境中,我们可能需要多个节点组,才能更好的适应不同类型的应用以及降低成本,比如我们需要新建一个常驻的应用组,一个批处理的应用组使用竞价实力spot组。
所以 需要记录一下 如何为 Amazon EKS 集群创建多个节点组。
首先查看当前的节点组,使用命令
$ Kubectl get nodes
$ eksctl get nodegroups --cluster yourClusterName //类似于kops get ig
eksctl可以使用配置文件的方式进行 节点组的创建。
例如配置如下:
kind: ClusterConfig
apiVersion: eksctl.io/v1alpha5
metadata:
name: yourClusterName
region: yourRegionName
nodeGroups:
- name: ng1-Workers
availabilityZones: ["az-name"]
desiredCapacity: 3
instanceType: m5.large
desiredCapacity: 3
iam:
instanceProfileARN: "arn:aws:iam::11111:instance-profile/eks-nodes-base-role" #Attaching IAM role
instanceRoleARN: "arn:aws:iam::1111:role/eks-nodes-base-role"
privateNetworking: true
securityGroups:
withShared: true
withLocal: true
attachIDs: ['sg-11111', 'sg-11112']
ssh:
publicKeyName: 'my-instance-key'
kubeletExtraConfig:
kubeReserved:
cpu: "300m"
memory: "300Mi"
ephemeral-storage: "1Gi"
kubeReservedCgroup: "/kube-reserved"
systemReserved:
cpu: "300m"
memory: "300Mi"
ephemeral-storage: "1Gi"
tags:
'environment': 'development'
- name: ng-2-builders #example of a nodegroup that uses 50% spot instances and 50% on demand instances:
minSize: 2
maxSize: 5
instancesDistribution:
maxPrice: 0.017
instanceTypes: ["t3.small", "t3.medium"] # At least two instance types should be specified
onDemandBaseCapacity: 0
onDemandPercentageAboveBaseCapacity: 50
spotInstancePools: 2
tags:
'environment':'production'
使用命令创建nodegroups
eksctl create nodegroup --config-file= yourConfigFileName
创建好nodegroup后需要把这个nodegroup与现有集群关联起来。需要在控制台中操作。
打开 AWS CloudFormation 控制台,选择与您创建的节点组关联的集群。然后选择事件选项卡,查看显示您的集群已部署的 AWS CloudFormation 事件。
要确认新的工作线程节点组是否已挂载到集群,并验证是否已应用节点组配置,请运行以下命令:
$ Kubectl get nodes
$ eksctl get nodegroups --cluster yourClusterName
您会看到您的工作线程节点已经加入集群。这两个节点组应会通过 eksctl 可见。
除了使用 eksctl 之外,也可以透过 aws-samples/amazon-eks-refarch-cloudformation 来创建这样的混合集群,amazon-eks-refarch-cloudformation 使用100%的 cloudformation 模版,并且提供丰富的特性。
node labels, taints and tolerations
通过 eks-templates 模版创建的混合集群,会自动将 ondemand 与 spot 实例都打上不同的 node labels,同时也会对 Spot 打上相应的 taints
更多节点组相关的资料:
如何使用 Eksctl 为 Amazon EKS 工作线程节点创建多个节点组
在 eksctl 中管理节点组(删除,扩展,和耗尽)
如何检查、扩展、删除或耗尽 Amazon EKS 中的工作线程节点
详细步骤参考
通过AWS控制台来创建管理Managed Node Group
当我们的eks集群安装成功运行后,我们需要安装cluster autoscaler才能实现节点的自动伸缩管理,cluster autoscaler是k8s用于处理节点自动伸缩的组件,可以参考cluster autoscaler的gitlab。
cluster autoscaler的安装参考
Cluster Autoscaler
部署方式:以deployment方式部署两个CA控制器副本到statefulset节点,放到kube-system命名空间中。
因为pod需要和aws的ASG通信,而pod运行在statefulset节点上的,所以需要确保statefulset节点的Role有如下IAM role:
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"autoscaling:DescribeAutoScalingGroups",
"autoscaling:DescribeAutoScalingInstances",
"autoscaling:DescribeLaunchConfigurations",
"autoscaling:DescribeTags",
"autoscaling:SetDesiredCapacity",
"autoscaling:TerminateInstanceInAutoScalingGroup",
"ec2:DescribeLaunchTemplateVersions"
],
"Resource": "*",
"Effect": "Allow"
}
]
}
注意,node节点的iam权限和 用于创建 eks集群的iam权限并不是一摸一样的,而是一个新的iam角色。
这里有两种方式一种是在 创建集群时就已经给集群附加有策略,第二种是等集群创建好后找到 用于部署ca的ec2节点,查看它的iam,然后把策略手动增加上去。
推荐使用方式一,定义集群时附加策略如下:
iam:
withAddonPolicies:
autoScaler: true
Cluster Autoscaler 要求您节点组上具有以下 Auto Scaling 标签,以便能够自动发现它们。
如果您使用上一个 eksctl
命令创建您的节点组,则这些标签会自动应用。如果没有,则必须使用以下标签手动标记您的 Auto Scaling 组。有关详细信息,请参阅 标记您的AmazonEC2资源 在 Amazon EC2 用户指南(适用于 Linux 实例).
Key | Value |
---|---|
k8s.io/cluster-autoscaler/ |
owned |
k8s.io/cluster-autoscaler/enabled |
true |
下载yaml到本地 https://raw.githubusercontent.com/kubernetes/autoscaler/master/cluster-autoscaler/cloudprovider/aws/examples/cluster-autoscaler-autodiscover.yaml
下载后 重命名为 cluster-autoscale-eks.yaml
注意,yaml中有几个地方需要调整:
1、 - --node-group-auto-discovery=asg:tag=k8s.io/cluster-autoscaler/enabled,k8s.io/cluster-autoscaler/
修改为集群名称,例如eks-beta
2、 - --node-group-auto-discovery底下增加
- --balance-similar-node-groups
- --skip-nodes-with-system-pods=false
- --aws-use-static-instance-list=true
3、增加nodeselector,让ca部署在非spot节点
nodeSelector:
usage: statefulset
tolerations:
- key: statefulset
effect: NoSchedule
4、将原镜像k8s.gcr.io/autoscaling/cluster-autoscaler:v1.17.3下载到本地后,上传到公司仓库中,镜像地址修改为公司镜像地址
如果 k8s.gcr.io来源的镜像下载不下来,可以在dockerhub中查找第三方上传的镜像https://hub.docker.com/search?q=cluster-autoscaler&type=image
当前目录 clust er-autoscale-eks.yaml 存放的是修改好可以直接部署的yaml,这个yaml的作用:
通过tolerations和nodeSelector让pod部署到statefulset节点上
使用 node-group-auto-discovery 参数,让GA自动去找ASG的信息,避免硬编码
cluster-autoscaler 使用我们上传到自己的ECR里面的镜像,避免 k8s.gcr.io 上的镜像拉取失败
执行
kubectl apply -f cluster-autoscale-eks.yaml --validate=false
使用以下命令将 cluster-autoscaler.kubernetes.io/safe-to-evict
注释添加到部署。
kubectl -n kube-system annotate deployment.apps/cluster-autoscaler cluster-autoscaler.kubernetes.io/safe-to-evict="false"
然后等待Pod运行起来之后,看下Pod的日志是否报错。
部署 Cluster Autoscaler 之后,您可以查看日志并验证它在监控您的集群负载。
使用以下命令查看您的 Cluster Autoscaler 日志。
kubectl -n kube-system logs -f deployment.apps/cluster-autoscaler
正常情况下,从pod调度到集群发现没资源满足pod的需求,到申请到新机器加入到集群并且分配给pod跑起来的时间为 5min
更多自动伸缩相关的资料 参考:
Auto Scaling
eksctl apply cluster changes after create
详细报错如下:
I0903 08:47:22.088466 1 aws_util.go:68] fetching https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonEC2/current/cn-northwest-1/index.json
W0903 08:47:37.090556 1 aws_util.go:71] Error fetching https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonEC2/current/cn-northwest-1/index.json skipping...
F0903 08:47:37.090583 1 aws_cloud_provider.go:363] Failed to generate AWS EC2 Instance Types: unable to load EC2 Instance Type list
原因 中国区的node无法访问价格api
解决方案
需要在ca的yaml增加属性aws-use-static-instance-list=true
- --aws-use-static-instance-list=true
详情参考
Cluster Autoscaler 1.15.6 AWS has problem with start in region cn-northwest-1
详细报错如下:
E0903 08:54:19.220007 1 aws_manager.go:261] Failed to regenerate ASG cache: cannot autodiscover ASGs: RequestError: send request failed
caused by: Post https://autoscaling.cn-northwest-1.amazonaws.com.cn/: dial tcp: lookup autoscaling.cn-northwest-1.amazonaws.com.cn on 172.20.0.10:53: read udp 10.30.24.178:48706->172.20.0.10:53: read: connection refused
F0903 08:54:19.220028 1 aws_cloud_provider.go:376] Failed to create AWS Manager: cannot autodiscover ASGs: RequestError: send request failed
caused by: Post https://autoscaling.cn-northwest-1.amazonaws.com.cn/: dial tcp: lookup autoscaling.cn-northwest-1.amazonaws.com.cn on 172.20.0.10:53: read udp 10.30.24.178:48706->172.20.0.10:53: read: connection refused
原因 网络问题或者dns问题
解决方案
检查网络设置和安全组 以及 保证 ca所在的node有访问公网的能力,以及 k8s的dns功能正常运行。
使用命令检查dns
kubectl get pods -n kube-system |grep dns
参考:https://blog.csdn.net/Nicolege678/article/details/83147019
除了使用官方的安装方案和控制台界面进行安装,还可以使用第三方工具进行安装
参考资料:
Deploy Kubernetes in an Existing AWS VPC with Kops and Terraform
github terraform-aws-eks
aws eks 本地创建与更新kubeconfig方法
创建kubeconfig的前提是已经安装好eks集群,同时满足以下几个条件。
1、本机配置了aws 的iam key
2、已经安装aws-iam-aws-iam-authenticator
3、已经安装aws cli命令行工具
4、已经安装kubectl命令行工具
执行创建或更新 kubeconfig的命令 :
aws eks --region 区域 update-kubeconfig --name 集群名
测试是否创建kubeconfig成功使用以下命令进行测试
kubectl get nodes
创建成功的kubeconfig默认保存在本机的 ~/.kube/config 路径。可以复制进行分发给其他同事使用。
需要注意的是 同事的所在用的iam的aws key用户需要添加到k8s的 config auth map中。
使用命令如下:
kubectl edit -n kube-system configmap/aws-auth --validate=false
新增用户和权限在mapUser中如下:
mapUsers: |
- userarn: arn:aws-cn:iam::123:user/zzq
username: zzq
groups:
- system:masters
创建与更新kubeconfig更多参考资料:
https://segmentfault.com/a/1190000017315098
https://zhuanlan.zhihu.com/p/126486177
https://docs.aws.amazon.com/zh_cn/eks/latest/userguide/add-user-role.html
https://docs.aws.amazon.com/zh_cn/eks/latest/userguide/create-kubeconfig.html
https://docs.aws.amazon.com/zh_cn/eks/latest/userguide/troubleshooting.html#unauthorized
// 查看节点状态
kubectl get nodes
// 查看服务状态
kubectl get svc
// 查看事件
kubectl get events --all-namespaces
使用命令
// 将 Kubernetes 控制面板部署到集群
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml
// 部署 heapster 以在集群上启用容器集群监控和性能分析
kubectl apply -f https://raw.githubusercontent.com/kubernetes/heapster/master/deploy/kube-config/influxdb/heapster.yaml
// 将 heapster 的 influxdb 后端部署到集群
kubectl apply -f https://raw.githubusercontent.com/kubernetes/heapster/master/deploy/kube-config/influxdb/influxdb.yaml
// 为控制面板创建 heapster 集群角色绑定
kubectl apply -f https://raw.githubusercontent.com/kubernetes/heapster/master/deploy/kube-config/rbac/heapster-rbac.yaml
创建文件eks-admin-service-account.yaml
使用命令
vi eks-admin-service-account.yaml
填入内容
apiVersion: v1
kind: ServiceAccount
metadata:
name: eks-admin
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: eks-admin
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: eks-admin
namespace: kube-system
使用命令
// 将此服务账户和集群角色绑定应用到您的集群
kubectl apply -f eks-admin-service-account.yaml
// 检索 eks-admin 服务账户的身份验证令牌。从输出中复制 值。您可以使用此令牌连接到控制面板
kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep eks-admin | awk '{print $1}')
// 将所有请求从您的 Amazon EC2 实例本地主机端口转发到 Kubernetes 控制面板端口
kubectl port-forward svc/kubernetes-dashboard -n kube-system 6443:443
// 从带 SSH 隧道的本地计算机访问端口
ssh -i EC2KeyPair.pem ec2-user@IP -L 6443:127.0.0.1:6443
访问 https://127.0.0.1:6443 输入 Token 即可访问 Dashboard
部署 eks-lambda-drainer
Spot 实例当面临资源回收,强迫被关机的时候,系统会提前两分钟收到通知,我们可以借由 CloudWatch Event 捕捉到这个通知信息出发一个外部调度的 Lambda function 对这个节点进行 node draining。eks-lambda-drainer 可以帮助我们部署一个完全 serverless 独立于 Kubernetes 集群之外的无服务器时间响应 handler,并且监听整个 VPC 内的 Spot实例关机信号,一旦提前两分钟获得关机信号就会对这个节点进行 kubectl drain 操作,确保节点上的Pod 能被及时重新调度到其他节点上运行。
关于 eks-lambda-drainer 的部署方式,可以参考这个 Github
参考资料: EKS 与 EC2 Spot 最佳实践
使用命令
eksctl delete cluster --region= --name=
# 创建新节点组--修正yaml文件,新增一个节点组
eksctl create nodegroup -f eks-beta.yaml
# 删除节点组---修改yaml文件,删除掉需要去掉的节点组
eksctl delete nodegroup -f eks-beta.yaml --only-missing
然后
eksctl delete nodegroup -f eks-beta.yaml --only-missing --aprove
# 注意 eksctl 的update和upgrade 命令更新 组和集群的参数只针对 managed 类型的nodegroup生效,如果是自管理节点的nodegroup需要 先 新建 新的nodegroup,再删除老的nodegroup 实现 节点组的自动平滑迁移。
kind: ClusterConfig
apiVersion: eksctl.io/v1alpha5
metadata:
name: eks-beta
region: cn-northwest-1
version: "1.17"
vpc:
id: "vpc-123"
clusterEndpoints:
publicAccess: true
privateAccess: true
cidr: "10.30.0.0/16"
subnets:
private:
cn-northwest-1a:
id: "subnet-123"
cidr: "10.30.0.0/20"
cn-northwest-1b:
id: "subnet-123"
cidr: "10.30.16.0/20"
cn-northwest-1c:
id: "subnet-123"
cidr: "10.30.32.0/20"
nodeGroups:
- name: nodes
minSize: 1
maxSize: 10
instanceType: c5.large
privateNetworking: true
availabilityZones: ["cn-northwest-1a","cn-northwest-1b","cn-northwest-1c"]
VolumeSize: 40
taints:
proj: ":NoSchedule"
labels: {"cluster": "v2.test.eks.local"}
tags:
k8s.io/cluster-autoscaler/enabled: "true"
k8s.io/cluster-autoscaler/eks-beta: "owned"
ssh:
allow: true
publicKeyName: eks-ssh
- name: statefulset-cn-northwest-1a
minSize: 1
maxSize: 2
instanceType: r5.large
privateNetworking: true
availabilityZones: ["cn-northwest-1a"]
VolumeSize: 40
taints:
statefulset: ":NoSchedule"
labels: {"cluster": "v2.test.eks.local","usage":"statefulset"}
tags:
k8s.io/cluster-autoscaler/enabled: "true"
k8s.io/cluster-autoscaler/eks-beta: "owned"
ssh:
allow: true
publicKeyName: eks-ssh
iam:
withAddonPolicies:
autoScaler: true
- name: statefulset-cn-northwest-1b
minSize: 1
maxSize: 2
instanceType: r5.large
privateNetworking: true
availabilityZones: ["cn-northwest-1b"]
VolumeSize: 40
taints:
statefulset: ":NoSchedule"
labels: {"cluster": "v2.test.eks.local","usage":"statefulset"}
tags:
k8s.io/cluster-autoscaler/enabled: "true"
k8s.io/cluster-autoscaler/eks-beta: "owned"
ssh:
allow: true
publicKeyName: eks-ssh
iam:
withAddonPolicies:
autoScaler: true
- name: statefulset-cn-northwest-1c
minSize: 1
maxSize: 2
instanceType: r5.large
privateNetworking: true
availabilityZones: ["cn-northwest-1c"]
VolumeSize: 40
taints:
statefulset: ":NoSchedule"
labels: {"cluster": "v2.test.eks.local","usage":"statefulset"}
tags:
k8s.io/cluster-autoscaler/enabled: "true"
k8s.io/cluster-autoscaler/eks-beta: "owned"
ssh:
allow: true
publicKeyName: eks-ssh
iam:
withAddonPolicies:
autoScaler: true
- name: jhub
minSize: 0
maxSize: 2
instanceType: c5.2xlarge
privateNetworking: true
availabilityZones: ["cn-northwest-1c"]
VolumeSize: 40
taints:
jhub: ":NoSchedule"
labels: {"cluster": "v2.test.eks.local","usage":"jhub"}
tags:
k8s.io/cluster-autoscaler/enabled: "true"
k8s.io/cluster-autoscaler/eks-beta: "owned"
ssh:
allow: true
publicKeyName: eks-ssh
- name: gitlab
minSize: 0
maxSize: 1
instanceType: t2.medium
privateNetworking: true
availabilityZones: ["cn-northwest-1a","cn-northwest-1b","cn-northwest-1c"]
VolumeSize: 40
taints:
gitlab: ":NoSchedule"
labels: {"cluster": "v2.test.eks.local","usage":"gitlab"}
tags:
k8s.io/cluster-autoscaler/enabled: "true"
k8s.io/cluster-autoscaler/eks-beta: "owned"
ssh:
allow: true
publicKeyName: eks-ssh
- name: c59xlarge-spot
minSize: 0
maxSize: 10
privateNetworking: true
availabilityZones: ["cn-northwest-1a","cn-northwest-1b","cn-northwest-1c"]
VolumeSize: 40
labels: {"cluster": "v2.test.eks.local","spot":"true","instancegroup":"c59xlarge-spot"}
tags:
k8s.io/cluster-autoscaler/enabled: "true"
k8s.io/cluster-autoscaler/eks-beta: "owned"
ssh:
allow: true
publicKeyName: eks-ssh
instancesDistribution:
maxPrice: 3.5
instanceTypes: ["c5.9xlarge"]
onDemandBaseCapacity: 0
onDemandPercentageAboveBaseCapacity: 0
spotInstancePools: 2
- name: c518xlarge-spot
minSize: 0
maxSize: 10
privateNetworking: true
availabilityZones: ["cn-northwest-1a","cn-northwest-1b","cn-northwest-1c"]
VolumeSize: 40
labels: {"cluster": "v2.test.eks.local","spot":"true","instancegroup":"c518xlarge-spot"}
tags:
k8s.io/cluster-autoscaler/enabled: "true"
k8s.io/cluster-autoscaler/eks-beta: "owned"
ssh:
allow: true
publicKeyName: eks-ssh
instancesDistribution:
maxPrice: 7.0
instanceTypes: ["c5.18xlarge"]
onDemandBaseCapacity: 0
onDemandPercentageAboveBaseCapacity: 0
spotInstancePools: 2
- name: r48xlarge-spot
minSize: 0
maxSize: 10
privateNetworking: true
availabilityZones: ["cn-northwest-1a","cn-northwest-1b","cn-northwest-1c"]
VolumeSize: 40
labels: {"cluster": "v2.test.eks.local","spot":"true","instancegroup":"r48xlarge-spot"}
tags:
k8s.io/cluster-autoscaler/enabled: "true"
k8s.io/cluster-autoscaler/eks-beta: "owned"
ssh:
allow: true
publicKeyName: eks-ssh
instancesDistribution:
maxPrice: 4
instanceTypes: ["r4.8xlarge"]
onDemandBaseCapacity: 0
onDemandPercentageAboveBaseCapacity: 0
spotInstancePools: 2
- name: c54xlarge-spot
minSize: 0
maxSize: 10
privateNetworking: true
availabilityZones: ["cn-northwest-1a","cn-northwest-1b","cn-northwest-1c"]
VolumeSize: 40
labels: {"cluster": "v2.test.eks.local","spot":"true","instancegroup":"c54xlarge-spot","usage":"gene-relation"}
tags:
k8s.io/cluster-autoscaler/enabled: "true"
k8s.io/cluster-autoscaler/eks-beta: "owned"
ssh:
allow: true
publicKeyName: eks-ssh
instancesDistribution:
maxPrice: 2
instanceTypes: ["c5.4xlarge"]
onDemandBaseCapacity: 0
onDemandPercentageAboveBaseCapacity: 0
spotInstancePools: 2
这里的iam的proflie以及role与控制台中的角色对应