aws cdk 创建eks集群和ecs集群并部署服务

news/2024/10/21 5:33:06/

cdk 和 eks

使用cdk版本2.45通过cdk创建eks集群

const cdk = require("aws-cdk-lib");
const eks = require("aws-cdk-lib/aws-eks");
const ec2 = require("aws-cdk-lib/aws-ec2");
const iam = require("aws-cdk-lib/aws-iam");class EksCdkStack extends cdk.Stack {constructor(scope, id, props) {super(scope, id, props);//引用已有的vpcvar myvpc = ec2.Vpc.fromLookup(this, 'Vpc', {region: 'cn-north-1',vpcId: 'vpc-07xxxxxx0d0'})// 将已有的role配置为集群adminvar masterrole = iam.Role.fromRoleArn(this, "mymasterrole", 'arn:aws-cn:iam::xxxxxxxxx:role/xxxxxxxxx', {})var mycluster = new eks.Cluster(this, 'WorklearnCLuster', {endpointAccess: eks.EndpointAccess.PUBLIC_AND_PRIVATE,version: '1.23',vpc: myvpc,// 默认启动容量类型为managednode,默认实例类型为m5.large// defaultCapacityInstance: 't3.large',// defaultCapacityType: eks.DefaultCapacityType.EC2,defaultCapacityType: eks.DefaultCapacityType.NODEGROUP,vpcSubnets: [{ subnetId: 'subnet-xxxxxxxx' }, { subnetId: 'subnet-xxxxxxxx' }],// 默认启动数量为2defaultCapacity: 1,mastersRole: masterrole,outputMastersRoleArn: true});// 安装ebs驱动// new eks.CfnAddon(this, 'MyEbsAddon', {//   addonName: 'aws-ebs-csi-driver',//   clusterName: mycluster.clusterName// })new cdk.CfnOutput(this, 'clusterArn', {value: mycluster.clusterArn});new cdk.CfnOutput(this, 'clusterName', {value: mycluster.clusterName});new cdk.CfnOutput(this, 'matserRoleName', {value: masterrole.roleArn});}
}module.exports = { EksCdkStack }

通过cdk创建eks集群最终会创建4个堆栈(嵌套堆栈),按照时间顺序排列,2和4是嵌套堆栈

  • 堆栈1:角色(eks集群角色,节点角色,创建集群的角色),节点组,ssm参数,eks集群,堆栈2,堆栈3
  • 堆栈2:角色(lambda执行角色),StepFunctions状态机,5个lambda函数(获取集群信息,处理自定义命令),将额外配置的master role加入aws-auth就是由这个lambda完成的
  • 堆栈3:角色(cfn上传),s3桶(存放cdk资料)
  • 堆栈4:角色(lambda执行角色),2个lambda函数

lambda实际上就是cfn的自定义资源,有一个关键的lambda函数处理客户的自定义逻辑

import json
import loggingfrom apply import apply_handler
from helm import helm_handler
from patch import patch_handler
from get import get_handlerdef handler(event, context):print(json.dumps(dict(event, ResponseURL='...')))resource_type = event['ResourceType']if resource_type == 'Custom::AWSCDK-EKS-KubernetesResource':return apply_handler(event, context)if resource_type == 'Custom::AWSCDK-EKS-HelmChart':return helm_handler(event, context)if resource_type == 'Custom::AWSCDK-EKS-KubernetesPatch':return patch_handler(event, context)if resource_type == 'Custom::AWSCDK-EKS-KubernetesObjectValue':return get_handler(event, context)raise Exception("unknown resource type %s" % resource_type)

我们可以在相应的cw logs中看到具体的执行逻辑

例如helm安装的命令解析如下

['helm', 'upgrade', 'tekscdkstackworklearnclusterchartnginxingress00e4b90f', 'aws-ebs-csi-driver', '--install', '--create-namespace', '--repo', 'https://kubernetes-sigs.github.io/aws-ebs-csi-driver', '--values', '/tmp/values.yaml', '--namespace', 'kube-system', '--kubeconfig', '/tmp/kubeconfig']

cdk 和 ecs

通过cdk部署ecs服务比较简单

引用已经存在的资源避免重复创建

const cdk = require("aws-cdk-lib");
const ecs = require("aws-cdk-lib/aws-ecs");
const ec2 = require("aws-cdk-lib/aws-ec2");
const iam = require("aws-cdk-lib/aws-iam");
const aws = require("aws-cdk-lib");class EcsCdkStack extends cdk.Stack {constructor(scope, id, props) {super(scope, id, props);//引用已经存在的vpcvar myvpc = ec2.Vpc.fromLookup(this, 'Vpc', {region: 'cn-north-1',vpcId: 'vpc-xxxxxxxxx'})//引用已经存在的ecs集群var ecscluster = ecs.Cluster.fromClusterAttributes(this, 'myecscluster', {clusterName: 'xxxxxxx',securityGroups: ['sg-xxxxxxxx'],vpc: myvpc,clusterArn: 'arn:aws-cn:ecs:cn-north-1:xxxxx:cluster/xxxxxx'})// 引用已存在的角色var taskrole = iam.Role.fromRoleArn(this, "mytaskrole", 'arn:aws-cn:iam::xxxxx:role/ecsTaskRole', {})var taskexecrole = iam.Role.fromRoleArn(this, "mytaskexecrole", 'arn:aws-cn:iam::xxxxxxx:role/ecsTaskExecutionRole', {})const mytaskDefinition = new ecs.Ec2TaskDefinition(this, 'myTaskDef', {// 指定任务网络模式为awsvpcnetworkMode: ecs.NetworkMode.AWS_VPC,// networkMode: ecs.NetworkMode.BRIDGE,taskRole: taskrole,executionRole: taskexecrole,});// 向任务定义添加containervar nginxContainer = mytaskDefinition.addContainer('myNginxContainer', {containerName: 'nginx',image: ecs.ContainerImage.fromRegistry('nginx:latest'),memoryLimitMiB: 256,});nginxContainer.addPortMappings({containerPort: 80,protocol: ecs.Protocol.TCP})var mysg = ec2.SecurityGroup.fromSecurityGroupId(this, 'mysg', 'sg-xxxxxxx')// 创建ecs服务new ecs.Ec2Service(this, 'myEC2Service', {cluster: ecscluster,taskDefinition: mytaskDefinition,desiredCount: 1,securityGroups: [mysg],// assignPublicIp: true,vpcSubnets: {subnetType: ec2.SubnetType.PUBLIC}});new cdk.CfnOutput(this, 'clusterArn', { value: ecscluster.clusterArn });new cdk.CfnOutput(this, 'clusterName', { value: ecscluster.clusterName });new cdk.CfnOutput(this, 'matserRoleName', { value: mytaskDefinition.taskDefinitionArn });}
}module.exports = { EcsCdkStack }

http://www.ppmy.cn/news/2690.html

相关文章

编译原理 2 - 词法分析

第3章 词法分析3.1 词法分析器的功能和结构3.2 状态转换图3.3 正则文法 和 正则表达式3.4 有限自动机 DFA与NFA测试第3章 词法分析 重点:① 词法分析器的输入、输出;② 用于识别符号的状态转移图的构造;③ 根据状态转移图实现词法分析器 难点…

Google Earth Engine(GEE)——将每小时降水量转化为逐日的降水量

很多时候我们获取影像的时间分辨率为逐小时,但是如何获取影像的累积降水量?这里的整体思路就是获取不同时间影像的时间序列,然后分别获取每天的降水量,最后同一秋累计值,如果要进行时序图片展示的情况,我们就可以再秋累计值的时候就可以建立一个时间属性,这样可以建立时…

Java_笔记_多态_包_final_权限修饰符_代码块

封装:对象代表什么,就得封装对应的数据,并提供数据对应的行为。 一、多态:对象的多种形态。同类型的对象,表现出的不同形态。 1.多态的表现形式:父类类型 对象名称 子类对象; 学生形态 对象 Student s …

[附源码]计算机毕业设计JAVA中小型艺术培训机构管理系统

[附源码]计算机毕业设计JAVA中小型艺术培训机构管理系统 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: S…

真人踩过的坑,告诉你避免自动化测试入门常犯的10个错误

虽然从自己的错误中学习也不错,但从别人的错误中学习总是更好的。 作为一个自动化测试人员,分享常见的容易犯的10个错误,可以从中吸取教训,引以为鉴。 一、必要时才自动化 新人小王接到为Web应用程序自动化测试脚本的任务时&…

InnoDB_Buffer_Pool

说明 对于使用InnoDB存储引擎的表来说, 无论是用于存储用户数据的索引,还是系统数据,都是以页的形式存放在表空间(tablespace)中。所谓的表空间(tablespace),实际是InnoDB对一个或几个实际文件的抽象,最终还是存在磁盘上。当InnoDB处理客户端请求时,如果需要访问某个页的…

30分钟了解linux操作系统内核总结

【推荐阅读】 概述Linux内核驱动之GPIO子系统API接口 一篇长文叙述Linux内核虚拟地址空间的基本概括 轻松学会linux下查看内存频率,内核函数,cpu频率 纯干货,linux内存管理——内存管理架构(建议收藏) Linux 内核性能优化的全景指南&#xff…

【web课程设计】HTML+CSS仿QQ音乐网站

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…