库伯内斯的CDK

2020-05-15 00:04:05

在AWS,我们看到客户迅速采用Kubernetes在全球部署应用程序,大规模训练机器学习模型,并标准化其跨数据中心和云交付创新的方式。使用Kubernetes,客户正在构建自动化工具以取代手动流程,为其基础设施的每一部分实施操作管道,并使开发团队能够获得对其应用程序如何运行的精细控制。

传统上,Kubernetes应用程序是用开发人员编写和维护的人类可读的静态YAML数据文件定义的。构建新的应用程序需要编写大量的样板配置,从其他项目复制代码,并应用手动调整和自定义。随着应用程序的发展和团队的壮大,这些YAML文件变得更难管理。共享最佳实践或进行更新涉及手动更改和复杂的迁移。

YAML是描述集群所需状态的优秀格式,但它没有用于表达逻辑和可重用抽象的原语。Kubernetes生态系统中有多种工具(kustomize、jsonnet、jkcfg、kubecfg、kubeen和Pulumi等)试图以各种方式弥补这些差距。

我们意识到这与我们的客户在通过CloudForformationTemplates定义其应用程序时所面临的问题完全相同,该问题已由AWS CDK解决,我们可以应用AWS CDK中的相同设计概念来帮助所有Kubernetes用户。

2018年,我们推出了AWS云开发工具包(AWS CDK)来帮助出于许多相同原因想要替代YAML的AWS CloudForment客户。AWS CDK是一个开源框架,用于使用熟悉的编程语言(如TypeScript、Python、Java和.NET)定义云基础架构。客户喜欢AWS CDK使他们能够使用现有工具和工作流编写和调配其基础架构,从而简化开发流程。他们还喜欢AWS CDK的可组合性,这使他们可以轻松抽象出配置和样板细节。我们的许多客户问我们,是否有可能将同样的概念和技术应用到库伯内斯空间。

今天,我想告诉您有关Kubernetes的CDK,或cdk8s,这是一个新的开源项目,允许您使用熟悉的编程语言定义Kubernetes应用程序和可重用组件。cdk8s(发音为“cd Kates”)允许您使用TypeScript或Python等编程语言来生成标准的Kubernetes YAML-这意味着您可以使用它来定义在任何地方运行的任何Kubernetes集群的应用程序,包括内部部署和云环境。

cdk8S允许您将核心Kubernetes API对象和自定义资源(CRD)作为称为“构造”的强类型类导入。这意味着您可以利用面向对象编程的所有强大原语来定义Kubernetes应用程序。最强大的功能之一是编写您自己的抽象的能力。

使用cdk8,您可以将常见的Kubernetes模式发布为代码库,然后在任何应用程序中引用这些库。这简化了为所有Kubernetes用户定义和维护应用程序,并构建在Kubernetes声明性API方法之上,同时从根本上尊重其功能和灵活性。这还意味着您可以使用您熟悉的语言、IDE、工具和技术来编写Kubernetes应用程序。

适用于任何群集cdk8与环境无关。它在您的机器上本地运行,并生成标准的Kubernetes YAML数据,因此您可以在任何地方运行的任何Kubernetes集群上使用它,包括内部部署和云。

声明性状态的命令性方法cdk8s代码是使用命令性语言编写的,但最终会将所需的状态输出为纯Kubernetes YAML。这意味着您可以享受命令式编程的表现力和简单性,而不会影响声明性期望状态方法的健壮性。

使用任何Kubernetes API版本和自定义资源cdk8包括一个漂亮的CLI工具,它允许您将任何版本的Kubernetes API导入到您的项目中,并在需要时进行更新以利用新的API版本。您还可以导入自定义资源定义。

语言支持cdk8允许您使用TypeScript、JavaScript和Python定义应用程序。计划支持更多语言,包括围棋。

开源的cdk8s是开源的,我们欢迎社区的贡献。我们为整个Kubernetes社区构建了cdk8,而不仅仅是AWS客户。

让我们看看如何使用cdk8定义一个简单的Kubernetes应用程序。

Const Labels={app:';Guestbook';,tier:';前端&39;};new k8s.Service(this,';service';,{Metadata:{labels},spec:{type:';LoadBalancer';,ports:[{port:80}],selector:labels,}});new k8s.Deployment(this,';ployment';,{规范:{选择器:{matchLabels:Labels},副本:3,模板:{Metadata:{Labels},规范:{Containers:[{Name:';php-redis';,图片:';gcr.io/google-samples/gb-frontend:v4';,端口:[{ContainerPort:80}],资源:{请求:{cpu:';100m';,内存:';100-#39;}]});

这是Kubernetes留言簿前端的定义,合成后产生一个熟悉的YAML输出,我可以将其应用于我的集群:

apiVersion:v1种类:服务元数据:标签:应用程序:Guestbook层:前端名称:Guestbook-service-23e79b52规范:端口:-port:80选择器:App:Guestbook层:前端类型:负载均衡器-apiVersion:App/v1种类:部署元数据:名称:Guestbook-Deployment-8b2b7b76规范:副本:3选择器:Matchels:App:Guestbook层:前端模板。-redis端口:-tainerPort:80资源:请求:CPU:100M内存:100mi。

cdk8s包含所有KubernetesAPI的类型化类。这意味着当我编写它时,我可以从我心爱的IDE获得所有帮助,其中包括代码完成、类型安全(用于静态语言)、内联文档、重构工具以及所有Jazz:

那么如何将其部署到我的集群中呢?当执行cdk8s应用程序时,它会合成标准的Kubernetes YAML,用于将该YAML部署到集群的工作流和工具保持不变。

$cdk8s synth-o dist&;&;kubectl application-f dist/*dist/guestbook.k8s.yaml service/guestbook-service-23e79b52已创建部署。apps/guestbook-ployment-8b2b7b76已创建。

这也意味着cdk8s应用程序可以灵活地集成到任何标准的GitOps工作流程中。将cdk8与GitOps结合使用意味着您可以使用与构建应用程序相同的工作流来定义应用程序(用代码编写,使用CICD部署)。请查看Max Brenner关于将cdk8与Flux以及Argo CD集成的帖子。

CDK应用程序的构建块被称为“构建”(还记得矩阵吗?)。构造可以代表任何东西:从单个的Kubernetes资源(如Pods)到复杂的概念(如微服务或成熟的MongoDB集群)。它们甚至可以代表完整的系统来为您的整个集群建模。

cdk8可以为所有核心Kubernetes API对象(如Deployment、Service、ReplicaSet、Pod)自动生成(“导入”)构造,也可以从任何自定义资源定义生成(“导入”)构造。我们还计划增加对从Helm图表导入结构的支持。

导入后,我们可以使用这些构造来定义图表。图表表示单个Kubernetes YAML清单。一个App由属于同一项目的多个图表组成。

在下面的示例中,我声明了一个具有单个Kubernetes pod的图表类型HelloChart。

类HelloChart扩展了Chart{构造函数(Scope:Construct,Name:String){Super(Scope,Name);new k8s.Pod(this,';hello';,{spec:{Containers:[{name:';hello';,image:';world';}]}});}}。

const app=new App();new HelloChart(app,#39;hello&39;);//合成应用程序中的所有图表(清单)。app.synth();

接口HelloChartOpts{pods:number;}类HelloChart扩展Chart{构造函数(Scope:Construct,Name:String,Opts:HelloChartOpts){Super(Scope,Name);for(let i=0;i<;opts.pods;++i){new k8s.Pod(this,';hello';+i,{spec:{Containers:[{name:';hello';,image:&。}}}。

常量APP=new App();new HelloChart(app,#39;hello-dev&39;,{pods:1});new HelloChart(app,#39;hello-prod&39;,{pod:10000});app.synth();

这个应用程序将输出两个文件:hello-dev.k8s.yaml和hello-prod.k8s.yaml(我自己的小DOS应用程序)。基本上,一行cdk8会生成一个超过50K行的YAML。

关于构造的酷之处在于,将它们组合成更高级别的抽象是很简单的。

例如,在K8中,部署前面有一个服务是很常见的,所以我可以用一个称为“ServiceDeployment”的新构造类型来表示:

类WebService扩展了构造{Construction tor(Scope:Construct,Name:String,opts:ServiceDeploymentOpts){Super(Scope,Name);new k8s.Deployment(this,.);new k8s.Service(this,.);}。

这些组合也称为抽象层。这些层可以堆叠在一起:cdk8s应用程序的底层通常由从K8SAPI或CRD生成的导入构造组成,然后将这些构造组合成更高级别的抽象。更高层可以抽象API的复杂性(例如,通过提供智能缺省值),或者它们可以表示自以为是的想法,将主要细节抽象出来,以支持更简单的心理模型。

现在我已经编写了抽象,我可以通过包管理器(如NPM、PyPI、Maven Central、NuGet或任何内部包管理器)与任何人共享它们,就像任何其他类库一样。这使得使用cdk8在整个公司或与社区共享最佳实践变得很容易。

构造在我的代码中表示为面向对象的类。这意味着我可以使用面向对象设计的所有功能为我的构造创建漂亮而丰富的API。

const book=new k8s.Service(this,#39;book-Collection';,.);const book=new k8s.Service(this,#39;book&39;,.);const OAuth=new大使.Oauth2Filter(this,#39;auth&39;,{AuthizationUrl:';url&39;,//.});const API=new ambasador.Api(。api.get(';/book';,book);api.get(';/book/.*/';,book,{prefix Regex:true});api.post(';/book';,book,{filter:OAuth});api.put(';/book/.*/';,book,{filter:OAuth,prefix regex:true});

在这个模型中,ambasador.Api构造公开了一组方法,这些方法允许用户通过友好的强类型语法描述他们的路由映射和配置。

这是cdk8的第一天。我们正在探索设计一个涵盖核心KubernetesAPI的丰富的高级构造库的意义。我们的想法是通过一个很棒的类库公开Kubernetes的全部功能集。

要了解这可能是什么样子,请考虑Kubernetes中的常见模式,在该模式中,您可以使用ConfigMap来存储某些配置的内容,并通过卷将其提供给Pod。

通过以下YAML:apiVersion:v1 Kind:Pod Metadata:Name:dapi-test-pod spec:Containers:-name:test-tainer image:k8s.gcr.io/busybox命令定义Pod:[";/bin/sh";,";-c";,";ls/etc/config/";]volumemount:-name:config-volume mount tPath:/etc/confit。

//使用本地目录const config=ConfigMap.fromDirectory(this,./config';)中的所有文件定义配置映射;//定义pod const pod=new Pod(this,';dapi-test-pod';);//将配置映射添加为卷const volume=pod.addConfigMapVolume(Config);//向pod添加容器并挂载文件//);tainer.image=';k8s.gcr.io/busybox';;tainer.mount(volume,';/etc/config';);//<;--nices!tainer.command=[";/bin/sh";,";-c";,";ls/etc/config/";];tainer.restartPolicy=PodRestartPolicy.NEVER;

我希望这能让您感受到这种高级API的潜力。您可以在GitHub上的研究部分找到关于高级设计项目的更多详细信息。

今天我们宣布cdk8s处于“alpha”阶段。这意味着我们认为人们可以开始在他们的环境中玩耍了,并与我们合作使这个项目适用于他们的用例。

这也意味着,我们预计cdk8在未来几个月将继续大幅变化,直到我们感觉到它是稳定的。我们将在每个版本中发布一个ChangeLog,其中包含有关中断更改和新功能的信息。

cdk8s是一个开源项目,为整个Kubernetes社区构建。它是在https://github.com/awslabs/cdk8s上完全开发的,我们鼓励和庆祝所有的合作和贡献。

我们很乐意听取您的意见,并欢迎您就API、开发人员体验、与其他工具、文档或功能的集成发表意见。

以下是我们一直在探索的几个方向,以及他们的GitHub问题链接,因此您可以+1参与讨论:

增加对新语言的支持:Java、.NET和Go都在我们的雷达上。请让我们知道您还想看到哪些其他语言。

将构造发布为由通用“CDK合成器操作符”支持的自定义资源。

我们对这个项目感到难以置信的兴奋,并坚信它可以让使用Kubernetes的开发人员的生活变得令人难以置信地富有成效和乐趣。

要开始,请访问cdk8s.io。体验cdk8的最好方法是通过一个入门指南(无论是用文字脚本还是用Python)拿起它旋转一下。这些快速的小教程将引导您完成安装cdk8、使用k8sAPI甚至创作您自己的自定义构造的第一步。