Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >使用 AWS CDK Python 从零开始构建 EKS 集群

使用 AWS CDK Python 从零开始构建 EKS 集群

作者头像
郭旭东
发布于 2021-01-29 07:43:12
发布于 2021-01-29 07:43:12
2K00
代码可运行
举报
文章被收录于专栏:云原生工具箱云原生工具箱
运行总次数:0
代码可运行

记得点击上方云原生之路”关注哦

前言

上篇文章《AWS CDK | IaC 何必只用 Yaml》笔者介绍了 AWS CDK 的概念和基本使用方法,本篇文章就来使用 CDK 在 AWS 从零开始构建一个全新的 KES 集群,实际感受一下使用 AWS CDK 创建和管理云资源的简单和便捷。

资源清单

本文中,笔者会创建以下资源:

  • 创建一个 EKS 集群
  • 为 EKS master 配置一个 IAM Role
  • 创建一个 VPC(包含子网和 NAT
  • 为 EKS 创建一个 Node Group 用来管理一组 Worker 节点
  • 为 EKS 创建一个 Auto Scaling Group 用来管理弹性伸缩节点

Show me the code

本文代码已全部上传 GitHub,配合代码阅读本文体验更佳。

https://github.com/sunny0826/aws-cdk-eks

安装 AWS CDK

首先其实需要有 AWS CLI 命令行工具,并配置了 AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYAWS_DEFAULT_REGION,这里就不做详细介绍了,同时还要安装 Node.js 10.3.0 以上的版本。

使用 npm 安装:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ npm install -g aws-cdk

安装完成后,检查 AWS CDK 版本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ cdk --version

创建 APP

AWS CDK 安装完成后,就可以开始创建项目了。

新建一个目录:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ mkdir aws-cdk-eks
$ cd aws-cdk-eks

初始化项目:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ cdk init app --language python
$ source .venv/bin/activate
$ python -m pip install -r requirements.txt

这里就会生成一个 Python 项目,目录结构如下如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ tree
.
├── README.md
├── app.py
├── cdk.json
├── cdk_python
│   ├── __init__.py
│   └── cdk_python_stack.py   # 主要文件
├── requirements.txt
├── setup.py
└── source.bat

之后的代码就是写在 cdk_python_stack.py 中。

Codeing

接下来就是写代码时间了。

创建 VPC

首先 EKS 需要一个 VPC,这里有三种方式:

  • 使用 default VPC
  • 指定一个已有 VPC
  • 新建一个 VPC

直接使用 default VPC:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
vpc = ec2.Vpc.from_lookup(self, id='Vpc', is_default=True)

指定现有 VPC:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
vpc = ec2.Vpc.from_lookup(self, id='Vpc', vpc_id='vpc-0417e46d')

新建 VPC:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
vpc = ec2.Vpc(self,
    'eks-vpc', # VPC id
    cidr='10.3.0.0/16', # CIDR
    max_azs=3,  # 跨3AZ
    nat_gateways=1 # 新建一个 NAT Gateway
    )

还有很多其他参数可以配置,这里用不到直接使用默认值。

创建 IAM

这里需要给 k8s 的 master 创建一个 IAM Role,这样我们才能对 EKS 进行管理。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
eks_master_role = iam.Role(self, 'EksMasterRole',
    role_name='EksAdminRole',
    assumed_by=iam.AccountRootPrincipal()
    )
创建 EKS

VPC 和 IAM 都已经准备好了,现在可以创建 EKS 集群了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cluster = eks.Cluster(self, 
    'Cluster',  # 集群 id
    vpc=vpc,  # 指定 VPC
    version=eks.KubernetesVersion.V1_18,  # K8S 版本
    masters_role=eks_master_role, # naster 的 IAM Role
    default_capacity=0  # 这里不需要 worker 节点,后面采用 MNGASG 来管理
    )

可以看到先前定义的 vpceks_master_role 都作为参数被传给了 cluster,而 default_capacity 是定义默认 worker 节点的,下面我们会采用 MNG 和 ASG 来管理 worker 节点,所以这里设置为 0.

为 EKS 添加 MNG

cluster 定义好后,相当于 K8S 的 master 节点已经配置完成,接下来就是 worker 节点的配置。EKS 可以使用 MNG 和 ASG 来管理 worker 节点。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cluster.add_nodegroup_capacity(
    'MNG',  # MNG id
    capacity_type=eks.CapacityType.SPOT,  # 节点类型
    desired_size=2, # 节点数量
    instance_types=[  # 节点规格
        ec2.InstanceType('t3.large'),
        ec2.InstanceType('m5.large'),
        ec2.InstanceType('c5.large'),
    ]),
为 EKS 添加 ASG
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cluster.add_auto_scaling_group_capacity(
  'ASGNG', # ASG id
  instance_type=[  # 节点规格
        ec2.InstanceType('t3.large'),
        ec2.InstanceType('m5.large'),
        ec2.InstanceType('c5.large'),
  ],
  desired_capacity=2 # 节点数量
  )

当然 MNG 和 ASG 都可以设置 max_sizemin_size,也就是可以实现节点级别的弹性伸缩,但是目前测试下来只有 ASG 可以将配置的资源 TAG 带入 EC2 的配置,而 MNG 需要通过定制 launch_template_spec 的方式才能实现。如果对这方面没有要求的话推荐使用 MNG。

到这里代码就写好了,只有几十行代码,下面我们就是检查和部署了。

Bootstrap

如果是第一次使用 AWS CDK 需要先执行 cdk bootstrap 命令,这个命令会在 S3 创建一个名为 cdktoolkit-XXX 的 bucket 用来存放 CDK 配置。

检查

执行 cdk diff 命令,这时就会打印出一系列列表,告诉你会有哪些资源变化,大致内容如下图。

cdk diff

可以执行 cdk synth 命令用来查看生成的 AWS CloudFormation template,笔者统计了一下生成 AWS CloudFormation template 的行数,这几十行代码居然生成了 1156 行的 CloudFormation 配置!

部署

在检查无误后就可以开始部署了,执行命令 cdk deploy 并输入 y 确认,之后可以看到部署的进度条。如果部署中间出现错误, CDK 会自动进行回滚,之前创建和修改的资源都会被恢复原样,可以放心使用。

部署成功

到这里,EKS 集群就已经部署成功了,执行两条命令,就能生成 kubeconfig 并使用 kubectl 访问了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ aws eks updata-kubeconfig ...
$ aws eks get-token ...

销毁

在完成测试后,执行命令 cdk destroy 对创建的资源进行释放。

结语

非常感谢来自 AWS 的 @pahud[1] 同学的指导和帮助,总体来说 Python 版本的 CDK 使用起来比较方便,但文档和源码中的说明略有不足。AWS CDK 的核心引擎其实是使用 Typescript 编写,其他语言的版本都是采用 JSii[2] 通过 TypeScript 转化而来。如果要深入使用,这里还是推荐使用 Typescript 的版本(其实我已经换成 Typescript 来写了),难度不是很大,值得一试。

参考资料

[1]

@pahud: https://github.com/pahud

[2]

JSii: https://github.com/aws/jsii

- END -

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云原生之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
在 EKS 上管理 NodeGroup
最初使用的 NodeGroup 的 InstantType 规格太低,不太好用,所以需要增加一个新的 NodeGroup 。
云云众生s
2024/03/27
1890
基于AWS EKS的K8S实践 - 集群搭建
基于AWS EKS的K8S实践系列文章是基于企业级的实战文章,一些设置信息需要根据公司自身的网络等要求进行设置,如果大家有问题讨论或咨询可以后台私信我或者加入知识星球问我,知识星球的加入方式在文章末尾。
shysh95
2023/08/23
6940
基于AWS EKS的K8S实践 - 集群搭建
AWS CDK | IaC 何必只用 Yaml
近年来基础设施即代码(IaC)的方式被越来越多的开发者和管理者所采用,各大公有云都提供了使用 IaC 管理自己云资源的方式,如 AWS 的 CloudFormation、阿里云的 ROS 等,而第三方的 Terraform 也有各大公有云的 Provider。越来越多像我一样的云资源运维和管理者开始采用 IaC 的方式对云资源进行创建、运维和管理。
郭旭东
2021/02/01
2.2K0
Terraform:多云、混合云环境下实现基础设施即代码
将基础设施代码化,使用代码对硬件进行管理,在运维领域借用软件领域的最佳实践,将基础设施的运维纳入软件工程的范畴,最终整体改善软件开发和软件交付的过程。
yeedomliu
2024/01/24
1.5K0
Terraform:多云、混合云环境下实现基础设施即代码
K8S-Node自动扩容项目CA源码分析(上)
上一篇文章介绍了 k8s 自动扩缩容的三种方式:HPA、VPA、CA,以及各自的使用场景和架构。本文针对 CA 做源码分析。
kinnylee
2022/07/02
1.2K0
基于AWS EKS的K8S实践 - 如何打通云企业网集群内外服务调用
service 通常用作集群内服务之前的通信,ingress 通常用于暴露给集群外的服务使用。
shysh95
2023/08/23
4940
基于AWS EKS的K8S实践 - 如何打通云企业网集群内外服务调用
Tungsten Fabric知识库丨构建、安装与公有云部署
这里的repo文件的说明文档大部分是有效的。 https://github.com/Juniper/contrail-dev-env--
Tungsten Fabric
2020/09/08
1.3K0
创建 EKS 管理员
EKS 管理员不仅需要登录管理控制台,也需要通过 eksctl 管理集群,还需要能够管理 EC2 和 CloudFormation 等资源,所以需要较高的权限。
云云众生s
2024/03/27
2710
(译)Zalando 是如何管理 140 多个 Kubernetes 集群的
最近我接到一个问题:“你是如何管理这么多 Kubernetes 的?”。本文试图揭示 Zalando 在 AWS 管理 140 多个 Kubernetes 集群的秘密。
崔秀龙
2019/11/05
1.1K0
(译)Zalando 是如何管理 140 多个 Kubernetes 集群的
管理数千个集群:Gardener项目更新
作者:Rafael Franzke(SAP),Vasu Chandrasekhara(SAP)
CNCF
2019/12/10
2.4K0
管理数千个集群:Gardener项目更新
配置 Windows 节点组
创建 cluster 时我们没有指定 --install-vpc-controllers 参数,所以我们需要首先安装 vpc controller :
云云众生s
2024/03/27
1640
零停机给Kubernetes集群节点打系统补丁
Salesforce 的 Einstein Vision 和语言服务部署在 AWS Elastic Kubernetes Service(EKS) 集群上。其中有一个最主要的安全和合规性需求,就是给集群节点的操作系统打补丁。部署服务的集群节点需要通过打补丁的方式进行系统的定期更新。这些补丁减少了可能让虚拟机暴露于攻击之下的漏洞。
深度学习与Python
2021/06/08
1.4K0
零停机给Kubernetes集群节点打系统补丁
蜂窝架构:一种云端高可用性架构
蜂窝架构是一种有助于在多租户应用程序中实现高可用性的设计模式。其目标是在设计应用程序时将所有组件部署到一个完全自给自足的隔离“单元”中,然后创建许多这种“单元”的离散部署,它们之间没有任何依赖关系。
深度学习与Python
2024/05/06
3950
蜂窝架构:一种云端高可用性架构
使用Ansible快速部署CDH集群
ansible是一种自动化运维工具,基于paramiko开发的,并且基于模块化工作,Ansible是一种集成IT系统的配置管理、应用部署、执行特定任务的开源平台,它是基于python语言,由Paramiko和PyYAML两个关键模块构建。集合了众多运维工具的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能.ansible是基于模块工作的,本身没有批量部署的能力.真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架.ansible不需要在远程主机上安装client/agents,因为它们是基于ssh来和远程主机通讯的.
大数据杂货铺
2020/02/11
3K0
使用Ansible快速部署CDH集群
配置语言的黄金时代
我认为我们当前所认知的 DevOps 即将走到尽头。至少,其中的 Ops 会如此。随着云基础设施成为应用程序关注的重点,越来越多的 ops 任务由云本身完成或内置于应用程序中。剩下的就是供应和管理应用程序所需的基础设施。这关系到所有的相关附属内容,例如安全性和网络。
深度学习与Python
2021/03/12
3.4K0
AWS 容器服务的安全实践
随着微服务的设计模式得到越来越多开发者的实践,容器和微服务已经在生产环境中开始了规模化的部署。在这一过程中,也面临着越来越多的挑战。比如说,很多的微服务之间是相互依赖的,我们需要有更多的手段和方式来进行微服务的计划,扩展和资源管理,另外微服务之间的隔离更少,它们通常会共享内核或者网络,也对安全性提出了更高的要求。
我是阳明
2021/06/25
3K0
AWS 容器服务的安全实践
干货 | 携程酒店AWS实践
随着携程海外酒店业务的发展,遍布全球的海外供应商与携程总部IDC之间的数据传输量快速增长。技术上,这种日益增长的数据量对跨境网络专线的带宽、延迟等提出了更高的要求;业务上,由于当前有限的跨境网络专线资源对业务处理效率及用户体验也造成了一定的影响;成本上,跨境网络专线作为一种昂贵的资源,通过单纯的专线扩容又会给IT成本造成巨大压力。所以我们开始思考是否可以通过公有云结合酒店直连的业务特性来解决日益增长的带宽压力和供应商接口延迟的问题。
携程技术
2021/09/10
1.4K1
干货 | 携程酒店AWS实践
为 EKS 创建普通用户
本文介绍了如何根据 IAM 和 Kubernetes 的最佳实践,管理 IAM 和 EKS 用户。
云云众生s
2024/03/27
2340
从Wiz Cluster Games 挑战赛漫谈K8s集群安全
11月初,云安全公司WIZ发起了一项名为“EKS Cluster Games”的CTF挑战赛[1],引发了众多云安全爱好者的参与。本次挑战赛的主题是关于容器集群的攻击技巧。比赛共包括5个场景,整体存在一定的难度,非常值得挑战和学习。
云鼎实验室
2023/12/16
7240
从Wiz Cluster Games 挑战赛漫谈K8s集群安全
如何使用IMDShift提升AWS工作负载的安全性
IMDShift是一款功能强大的AWS工作负载安全增强工具,该工具基于纯Python开发,可以帮助广大研究人员更好地提升AWS工作负载的安全。
FB客服
2023/09/26
2290
如何使用IMDShift提升AWS工作负载的安全性
相关推荐
在 EKS 上管理 NodeGroup
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验