aws cdk 创建eks集群和ecs集群并部署服务
admin
2024-03-27 04:13:09
0

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 }

相关内容

热门资讯

linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
C++ 机房预约系统(六):学... 8、 学生模块 8.1 学生子菜单、登录和注销 实现步骤: 在Student.cpp的...
A.机器学习入门算法(三):基... 机器学习算法(三):K近邻(k-nearest neigh...
数字温湿度传感器DHT11模块... 模块实例https://blog.csdn.net/qq_38393591/article/deta...
有限元三角形单元的等效节点力 文章目录前言一、重新复习一下有限元三角形单元的理论1、三角形单元的形函数(Nÿ...
Redis 所有支持的数据结构... Redis 是一种开源的基于键值对存储的 NoSQL 数据库,支持多种数据结构。以下是...
win下pytorch安装—c... 安装目录一、cuda安装1.1、cuda版本选择1.2、下载安装二、cudnn安装三、pytorch...
MySQL基础-多表查询 文章目录MySQL基础-多表查询一、案例及引入1、基础概念2、笛卡尔积的理解二、多表查询的分类1、等...
keil调试专题篇 调试的前提是需要连接调试器比如STLINK。 然后点击菜单或者快捷图标均可进入调试模式。 如果前面...
MATLAB | 全网最详细网... 一篇超超超长,超超超全面网络图绘制教程,本篇基本能讲清楚所有绘制要点&#...
IHome主页 - 让你的浏览... 随着互联网的发展,人们越来越离不开浏览器了。每天上班、学习、娱乐,浏览器...
TCP 协议 一、TCP 协议概念 TCP即传输控制协议(Transmission Control ...
营业执照的经营范围有哪些 营业执照的经营范围有哪些 经营范围是指企业可以从事的生产经营与服务项目,是进行公司注册...
C++ 可变体(variant... 一、可变体(variant) 基础用法 Union的问题: 无法知道当前使用的类型是什...
血压计语音芯片,电子医疗设备声... 语音电子血压计是带有语音提示功能的电子血压计,测量前至测量结果全程语音播报࿰...
MySQL OCP888题解0... 文章目录1、原题1.1、英文原题1.2、答案2、题目解析2.1、题干解析2.2、选项解析3、知识点3...
【2023-Pytorch-检... (肆十二想说的一些话)Yolo这个系列我们已经更新了大概一年的时间,现在基本的流程也走走通了,包含数...
实战项目:保险行业用户分类 这里写目录标题1、项目介绍1.1 行业背景1.2 数据介绍2、代码实现导入数据探索数据处理列标签名异...
记录--我在前端干工地(thr... 这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前段时间接触了Th...
43 openEuler搭建A... 文章目录43 openEuler搭建Apache服务器-配置文件说明和管理模块43.1 配置文件说明...