AWS EKS 创建K8S集群[AWS 中国宁夏区]

1,282 阅读9分钟

本文介绍使用AWS控制台页面点击的方式,在AWS中国宁夏区域安装AWS EKS的全部流程,并通过为这个AWS EKS集群设置节点组来提供底层计算资源。

环境

Softwareversioninstall location
AWS EKS1.34AWS(宁夏Region)
eksctl0.215.0本地电脑
kubectl1.34本地电脑
aws cli2.21.0本地电脑

安装流程

安装涉及到如下的2部分:

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

EKS控制面的安装

网络规划和设计

AWS EKS在中国宁夏区创建前,我们现需要保证自己的VPC网络符合Amazon EKS VPC and subnet requirements and considerations要求,比如VPC中必须要有足够的private ip,必须同时开启DNS hostnameDNS resolution,必须为AWS EKS控制面提供至少2个AZ的子网等。

关于AWS网络规划实践可以参考一文看懂 Amazon EKS 中的网络规划

本文我为VPC开启DNS hostnameDNS resolution

eks-cn-01.png

本文我为EKS分配了3个AZ的子网;设计上AWS EKS管理的EC2在container-ec2-subnet子网,AWS EKS管理的Pod在containers-subnet子网,这样把EC2的private ip cidr和pod的private ip cidr分开管理;如果你不计划分开EC2和Pod的private ip cidr也完全没问题,这也是默认设置。

eks-cn-02.png

我们创建AWS EKS的时候,实际上只是创建了K8S的控制面(控制面做了自动的跨AZ高可用),后续的EC2/Fargate计算资源的管理、K8S deployment、service的管理、K8S插件的安装也会逐渐涉及。

权限设置

你在创建AWS EKS的时候,必须有AWS相关的足够的权限,详情请看Getting started with Amazon EKS – Amazon Web Services Management Console and Amazon CLI中的Required IAM permissions部分

创建cluster role

AWS EKS可以代替我们人工,自动化的管理资源并和其他AWS服务交互。所以我们必须给AWS EKS合适的role,让AWS EKS可以用这个role去执行相应的动作,详情可以看Amazon EKS cluster IAM role

AWS IAM控制台中,我们可以创建一个名为AmazonEKSClusterRole的role

eks-cn-03.png

检查AmazonEKSClusterPolicy是否被正确的选择了

eks-cn-04.png

最后检查下详情并创建role,名称我填的是AmazonEKSClusterRole

eks-cn-05.png

创建成功后我们在AWS IAM控制台可以看到相应的role

eks-cn-06.png

创建AWS EKS控制面

AWS EKS控制台,我们可以接着创建AWS EKS控制面

eks-cn-07.png

在创建EKS的时候选择刚才创建的名为AmazonEKSClusterRole的role来给EKS合适的权限,同时也建议选择最新的EKS版本。AWS EKS的发布周期和维护周期和K8S的支持周期基本一致,Amazon EKS Kubernetes versions里面列出了可选的版本,EKS一般每个版本的支持周期大约为12个月,当支持周期结束前建议大家提前安排好版本更新,避免由于结束支持后失去安全和bug修复保证。更多的详情可以看Amazon EKS Kubernetes versionsAmazon EKS platform versions

这里我设置自己的EKS集群名称为eks-poc-cn,EKS版本选择1.34,role选择AmazonEKSClusterRole

eks-cn-08.png

Secrets encryption是可选的,用于对EKS里面的Kubernetes secrets数据做加密进一步的保证安全

eks-cn-09.png

接着我们选择网络,一般我推荐选择3个子网(subnet)跨越3个AZ保证绝对的可靠;然后EKS控制面会在这些子网里面放置网络接口,通过网络接口暴露控制面的API服务,这样我们后面的EC2/Fargate等安装了kubelet的计算资源以及pod就可以和这些网络接口通信,我们可以通过下面的security group做精细的控制)。此外cluster enpoint access我们可以按照自己的需求选择,详情请看Amazon EKS cluster endpoint access control,测试/开发环境建议选择public+private(互联网能访问控制面API,也能在VPC内访问控制面API,这样方便运维在本地电脑控制EKS),正式环境建议选择private(互联网不能访问控制面API,只能在VPC内访问控制面API,这样绝对避免互联网网络访问,就更安全)

eks-cn-10.png

Additional security groups是可选的,用于对EKS所控制的网络接口和EC2做进一步的网络防护

eks-cn-11.png

对需要本地电脑访问控制面的方式建议选择Cluster endpoint access的Public and private选项,这对开发环境很方便,可以直接本地执行kubectl控制命令,对于正式环境建议选择Public选项,这时你只能在VPC内部执行kubectl命令

AWS EKS可以选择开启日志,你可以按自己需求选择

eks-cn-12.png

AWS EKS默认会安装必要的插件,这里建议按照EKS推荐的插件并选择默认版本或者最新的版本即可

eks-cn-13.png

检查全部的配置

eks-cn-14.png

提交创建,我们需要等几分钟等待AWS EKS创建完成

eks-cn-15.png

就绪后就可以使用了

eks-cn-16.png

EKS创建成功后,会自动创建一个安全组,它被标记为Cluster security group

eks-cn-17.png

为了方便VPC内访问EKS控制的pod、service和ec2,一般我也会在前面创建EKS控制面的时候补充一个可选的Additional security groups,补充设置这个安全组的规则,放行vpc自身cidr的全部入栈流量,当然你也可以按需精细化自定义设置。

eks-cn-18.png

添加EC2节点组

当AWS EKS控制面创建完成后,控制面就提供给我们了。这时我们其实是没有底层计算资源的,我们有2种选择: ec2 node groupfargate,其中ec2 node group建议优先托管节点组(Managed node groups),它可以帮我们做好ec2的故障恢复,让EC2数量随业务压力的动态伸缩

添加EC2节点组,为AWS EKS提供底层计算资源,这样我们运行程序所需的CPU,内存和GPU资源才有底层硬件来承载。

下图是AWS EKS提示我们继续设置ec2 node group或者fargate来提供底层计算资源

eks-cn-19.png

设置托管节点组

创建ec2 node role

我们需要给EC2合适的role,这样EC2在创建后会有合适的权限加入EKS集群或者做其他的操作,我们可以参考Amazon EKS node IAM role

我们首先在AWS IAM控制台创建role

eks-cn-20.png

选择添加3个必要的policy:AmazonEKSWorkerNodePolicy,AmazonEC2ContainerRegistryReadOnly,AmazonEKS_CNI_Policy

eks-cn-21.png

确认3个policy选择正确后提交,role名称我填为AmazonEKSNodeRole

eks-cn-22.png

AmazonEKSNodeRole role创建成功

eks-cn-23.png

创建托管节点组

在EKS控制台,我们开始创建托管节点组。

eks-cn-24.png

给这个节点组的节点赋予我们刚才创建的role

eks-cn-25.png

节点组中我们可以进一步的设置,比如选择操作系统,购买类型,机型,这个节点组的最小,最大节点数和当前期望的节点数

操作系统建议选择Amazon Linux 2023或者更新的版本,以获得长期的支持和软件兼容性

eks-cn-26.png

eks-cn-27.png

EC2节点的网络保持默认就好,你也可以选择为EC2节点打开SSH访问

eks-cn-28.png

检查设置并创建

eks-cn-29.png

创建中,需要等待几分钟

eks-cn-30.png

创建成功后的效果,我们可以看待节点组创建成功了,并且节点加入了集群

eks-cn-31.png

补充说明:

  1. 你可以后面自己手动调整节点组中EC2节点的数量
  2. 你可以在操作系统的选择上可以选择标准的Amazon Linux和专为容器优化的Bottlerocket
  3. 你可以选择普通的按需购买或者spot购买,后者更便宜但是有EC2回收的可能(回收前2分钟通知,做好优雅停机即可)
  4. 你可以选择X86架构的CPU和ARM架构的AWS Graviton CPU,后者更便宜
  5. 你可以按照上面的属性的组合创建多个节点组并在EKS里面混合使用

详情请看Managed node groups

混合多种CPU架构和OS的多节点组

我可以结合spot/on-demandx86/arm64amazon linux/bottlerocket创建多个节点组,多元化使用,实现更灵活的弹性来取得性能和成本的平衡;多种不同的组合提供的多元化底层计算资源也可以极大的避免某个单一的硬件或软件故障导致的服务中断,这极大的提供了可靠性;使用多种不同的组合也可以提供更多计算资源选择,避免某类硬件资源供应短缺的情况发生。

eks-cn-32.png

接下来我们可以继续完善AWS EKS集群,请看下一篇文章:AWS EKS 计算资源自动扩缩之Cluster Autoscaler[AWS 中国宁夏区]

关于AWS中国和AWS海外的差异点备注

Amazon Resource Name(ARN)唯一标识 AWS 资源。当您需要在 AWS 全局环境中(比如 IAM policy、Amazon Relational Database Service (Amazon RDS) 标签和 API 调用中)明确指定一项资源时,我们要求使用 ARN。

对于在中国大陆境内的AWS云,其实是和海外AWS云完全隔离的云计算平台,它的ARN以及对海外资源的可访问性不一样,这导致我们在按照AWS 文档(全球)或者亚马逊云科技文档(docs.amazonaws.cn)进行安装时,往往由于ARN填写错误或者对某些资源的网络访问受限导致软件安装错误或者权限错误,此外亚马逊云科技文档(docs.amazonaws.cn)有时会由于中英文翻译问题或者文档更新、服务更新于海外不一致的问题带给我们一些额外的运维压力。如果参考亚马逊云科技文档(docs.amazonaws.cn)出现运维方面的问题建议优先看亚马逊云科技文档(docs.amazonaws.cn)的英文版文档然后再对比AWS 文档(全球)

ARN的主要区别是中国、海外、美国政府云各自的partition不一样,详情见Amazon Resource Name(ARN)中国亚马逊 Web Services 的 ARN

在中国大陆,由于网络原因,可能一些Docker image,URL等资源无法访问或者下载,安装过程中出现的网络问题需要科学上网。

如果你需要在AWS海外使用EKS请看: AWS EKS 创建K8S集群[AWS 海外区]