本文介绍使用非页面控制台,也就是使用命令行的方式快速的在AWS海外区创建AWS EKS资源的流程,并通过为这个AWS EKS集群设置节点组来提供底层计算资源。和AWS EKS安装[AWS 中国宁夏区] 相比,逻辑和流程基本一样,只是改为了非页面控制台的方式,安装的过程可以很方便的记录成脚本,轻松的集成到DevOps CI/CD流程中。
创建AWS资源的几种方法
在操作前我们可以先了解下AWS提供的几种主要的自动化资源定义/创建方式:
| 名称 | 文档 | 简介 |
|---|---|---|
| CloudFormation | AWS CloudFormation Doc | 基于基础设施即代码概念打造的云端资源定义服务,目的是大幅度简化基础设施管理。我们可以把AWS的云上资源用YAML或者JSON的方式定义好并方便的执行预制逻辑。CloudFormation可以轻松的和CICD系统整合,完成AWS资源的设计和资源的管理 |
| CDK | AWS Cloud Development Kit (AWS CDK) v2 Doc | 面向运维/软件开发人员推出的开发工具包,和CloudFormation使用比较僵化的YAML或JSON定义AWS资源不同,CDK主要是通过编程语言(Python、JS、Java等)定义AWS资源,带来更高的灵活性和逻辑控制力,减少了复杂场景下CloudFormation内容编写麻烦和内容冗长的问题。原理是先用编程语言描述耗资源创建逻辑,然后翻译为CloudFormation并提交给AWS进行资源创建 |
| AWS Cli v2 | AWS Cli v2 Doc | AWS 通用的命令行工具(工作逻辑类似Linux shell),通过它我们可以使用命令行控制AWS并利用执行脚本来自动执行复杂任务。AWS Cli会通过AWS API调用的方式来执行控制逻辑。 |
| AWS eksctl | eksctl.io | AWS EKS专用的命令行工具,用于在 Amazon EKS 上创建和管理 Kubernetes 集群 |
总结:
- CloudFormation和CDK都是基于基础设施即代码的理念进行设计,侧重在资源定义/创建的代码化版本化管理和沿袭
- AWS Cli v2侧重在以命令行(通过API请求)的方式来控制AWS,而不是传统的web页面点击的低效、繁重、易出错的交互方式
- AWS eksctl是专用于AWS EKS控制的命令行工具,进一步简化了AWS Cli的控制逻辑
- 这几种方式可以自由的组合搭配并和CICD系统整合
这几种方式都可以帮助我们创建AWS资源,最大的区别是其中CloudFormation、CDK、Cli是通用的、可以适用于几乎全部的AWS服务,eksctl专用于AWS EKS服务
安装流程
安装涉及到如下的2部分:
- EKS控制面的安装
- 添加EC2节点组
环境
| Software | version | install location |
|---|---|---|
| AWS EKS | 1.34 | AWS(俄勒冈region) |
| eksctl | 0.215.0 | 本地电脑 |
| kubectl | 1.34 | 本地电脑 |
| aws cli | 2.21.0 | 本地电脑 |
IAM 权限准备
创建Cluster IAM Role
首先参考Amazon EKS cluster IAM role来创建Cluster IAM Role,Cluster IAM Role将提供给EKS集群控制面使用。
将如下的trust-policy内容保存为cluster-trust-policy.json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "eks.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
创建AWS role名称为AmazonEKSClusterRole并记住role ARN,ARN一般的格式为arn:aws:iam::<aws-account>:role/AmazonEKSClusterRole
aws iam create-role --role-name AmazonEKSClusterRole --assume-role-policy-document file://"cluster-trust-policy.json"
名称为AmazonEKSClusterRole的role ARN会在创建后输出,如下图:
给AmazonEKSClusterRole关联AmazonEKSClusterPolicy策略
aws iam attach-role-policy --policy-arn arn:aws:iam::aws:policy/AmazonEKSClusterPolicy --role-name AmazonEKSClusterRole
在AWS网页控制台的IAM服务中也可以检索到AmazonEKSClusterRole的创建结果
创建Node IAM Role
将如下的trust-policy内容保存为node-role-trust-relationship.json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "ec2.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
创建AWS role名称为AmazonEKSNodeRole并记住role arn一般的格式为arn:aws:iam::<aws-account>:role/AmazonEKSNodeRole
aws iam create-role --role-name AmazonEKSNodeRole --assume-role-policy-document file://"node-role-trust-relationship.json"
给AmazonEKSNodeRole role关联AmazonEKSWorkerNodePolicy、AmazonEC2ContainerRegistryReadOnly、AmazonEKS_CNI_Policy策略
aws iam attach-role-policy --policy-arn arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy --role-name AmazonEKSNodeRole
aws iam attach-role-policy --policy-arn arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly --role-name AmazonEKSNodeRole
aws iam attach-role-policy --policy-arn arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy --role-name AmazonEKSNodeRole
创建AWS EKS集群控制面
创建EKS集群,参考aws cli create-cluster
请结合你自己AWS账号的信息来调整变量,将<your-aws-region-id>,<your-eks-cluster-name>,<your-aws-account-id>替换为你自己实际的名称,补充自己的AmazonEKSClusterRole的ARN,VPC内的子网(至少2个不同可用区的子网)和安全组等
# windows环境要注意命令行换行
aws eks create-cluster --region <your-aws-region-id> \
--name <your-eks-cluster-name> \
--kubernetes-version 1.34 \
--role-arn arn:aws:iam::<your-aws-account-id>:role/AmazonEKSClusterRole \
--resources-vpc-config subnetIds=subnet-08c7xxxf15f74dcbb,subnet-040dxxx3b13e5296e,subnet-018cxxxbca811e5ab,securityGroupIds=sg-0338xxx26f06e8a32,endpointPublicAccess=true,endpointPrivateAccess=true
执行命令进行创建
命令执行完了,我们会在控制台上看到EKS集群正在创建中....
等待EKS集群创建完成后,我们接着执行下面的语句,为EKS集群添加必须的基础插件,参考aws cli create-addon
添加插件
执行下面命令添加插件(被安装的插件清单和控制台按照的方式完全一样)
# 第一个插件 vpc-cni
aws eks create-addon --region us-west-2 --cluster-name eks-poc-us --addon-name vpc-cni
# 第二个插件 coredns
aws eks create-addon --region us-west-2 --cluster-name eks-poc-us --addon-name coredns
# 第三个插件 kube-proxy
aws eks create-addon --region us-west-2 --cluster-name eks-poc-us --addon-name kube-proxy
# 第四个插件 eks-pod-identity-agent
aws eks create-addon --region us-west-2 --cluster-name eks-poc-us --addon-name eks-pod-identity-agent
# 第五个插件 external-dns
aws eks create-addon --region us-west-2 --cluster-name eks-poc-us --addon-name external-dns
# 第六个插件 metrics-server
aws eks create-addon --region us-west-2 --cluster-name eks-poc-us --addon-name metrics-server
插件安装时的效果
插件成功运行需要有底层的硬件承载,这需要我们接着为AWS EKS添加节点组来提供EC2计算资源...
设置EKS Node Group
等待EKS集群控制面创建完成后,我们接着执行下面的语句,为EKS集群添加节点组,参考aws cli create-nodegroup
请结合你自己的账号的AmazonEKSNodeRole,VPC内的子网(至少2个不同可用区的子网)和EC2配置等信息来具体设置,这里我以创建一个AWS自研的基于ARM64的Graviton CPU机型为例,创建一个按需购买t4g.medium ec2的node group.
aws eks create-nodegroup --region us-west-2 \
--cluster-name eks-poc-us \
--nodegroup-name od-arm64 \
--subnets subnet-08c7xxxf15f74dcbb subnet-040dxxx3b13e5296e subnet-018cxxxbca811e5ab \
--instance-types t4g.medium \
--disk-size 32 \
--node-role arn:aws:iam::596xxxxx068:role/AmazonEKSNodeRole \
--ami-type AL2023_ARM_64_STANDARD \
--capacity-type ON_DEMAND \
--scaling-config minSize=0,maxSize=5,desiredSize=1
如果你需要在AWS中国区使用EKS,请看: AWS EKS 创建K8S集群[AWS 中国宁夏区]
执行命令来创建节点组
执行完后我们需要等待执行成功
到这里EKS集群就创建好了,我们可以发现命令行创建EKS集群,操作更加简单。此外eksctl.io也可以帮助我们快速创建EKS集群,具体可以自己研究。
我们可以按照上述创建节点组的方式继续添加其他软硬件组合的node group
如果你需要在AWS中国区使用EKS,请看: AWS EKS 创建K8S集群[AWS 中国宁夏区]