AWS EKS 创建K8S集群[AWS 海外区]

1,111 阅读6分钟

本文介绍使用非页面控制台,也就是使用命令行的方式快速的在AWS海外区创建AWS EKS资源的流程,并通过为这个AWS EKS集群设置节点组来提供底层计算资源。和AWS EKS安装[AWS 中国宁夏区] 相比,逻辑和流程基本一样,只是改为了非页面控制台的方式,安装的过程可以很方便的记录成脚本,轻松的集成到DevOps CI/CD流程中。

创建AWS资源的几种方法

在操作前我们可以先了解下AWS提供的几种主要的自动化资源定义/创建方式:

名称文档简介
CloudFormationAWS CloudFormation Doc基于基础设施即代码概念打造的云端资源定义服务,目的是大幅度简化基础设施管理。我们可以把AWS的云上资源用YAML或者JSON的方式定义好并方便的执行预制逻辑。CloudFormation可以轻松的和CICD系统整合,完成AWS资源的设计和资源的管理
CDKAWS Cloud Development Kit (AWS CDK) v2 Doc面向运维/软件开发人员推出的开发工具包,和CloudFormation使用比较僵化的YAML或JSON定义AWS资源不同,CDK主要是通过编程语言(Python、JS、Java等)定义AWS资源,带来更高的灵活性和逻辑控制力,减少了复杂场景下CloudFormation内容编写麻烦和内容冗长的问题。原理是先用编程语言描述耗资源创建逻辑,然后翻译为CloudFormation并提交给AWS进行资源创建
AWS Cli v2AWS Cli v2 DocAWS 通用的命令行工具(工作逻辑类似Linux shell),通过它我们可以使用命令行控制AWS并利用执行脚本来自动执行复杂任务。AWS Cli会通过AWS API调用的方式来执行控制逻辑。
AWS eksctleksctl.ioAWS 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部分:

  1. EKS控制面的安装
  2. 添加EC2节点组

环境

Softwareversioninstall location
AWS EKS1.34AWS(俄勒冈region)
eksctl0.215.0本地电脑
kubectl1.34本地电脑
aws cli2.21.0本地电脑

IAM 权限准备

创建Cluster IAM Role

首先参考Amazon EKS cluster IAM role来创建Cluster IAM RoleCluster 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会在创建后输出,如下图:

eks-us-01.png

AmazonEKSClusterRole关联AmazonEKSClusterPolicy策略

aws iam attach-role-policy  --policy-arn arn:aws:iam::aws:policy/AmazonEKSClusterPolicy  --role-name AmazonEKSClusterRole

eks-us-02.png

在AWS网页控制台的IAM服务中也可以检索到AmazonEKSClusterRole的创建结果

eks-us-03.png

创建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关联AmazonEKSWorkerNodePolicyAmazonEC2ContainerRegistryReadOnlyAmazonEKS_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

eks-us-04.png

创建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-us-05.png

命令执行完了,我们会在控制台上看到EKS集群正在创建中....

eks-us-06.png

等待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

eks-us-08.png

插件安装时的效果

eks-us-09.png

插件成功运行需要有底层的硬件承载,这需要我们接着为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-us-10.png

执行完后我们需要等待执行成功

eks-us-11.png

eks-us-12.png 到这里EKS集群就创建好了,我们可以发现命令行创建EKS集群,操作更加简单。此外eksctl.io也可以帮助我们快速创建EKS集群,具体可以自己研究。

我们可以按照上述创建节点组的方式继续添加其他软硬件组合的node group

如果你需要在AWS中国区使用EKS,请看: AWS EKS 创建K8S集群[AWS 中国宁夏区]