KubraGen:编程的Kubernetes YAML生成器

kubragen的Python项目详细描述


KubraGen:编程的Kubernetes YAML生成器

PyPI versionSupported Python versions

概述

KubraGen是一个Kubernetes YAML生成器库,它可以生成 配置使用Python编程语言的全部功能。在

使用插件(称为构建器),可以包含知道如何配置的库 特定的服务,如Prometheus、RabbitMQ、Traefik等

使用jsonpatchext库(jsonpatch的扩展)来检查和修改输出 对象,而不直接访问返回的dict,包括使用deepmerge合并dict 图书馆。在

示例请参见源代码

样品

建筑商

提供商

  • 核心(亚马逊EKS,Google GKE,DigitalOcean Kubernetes,K3D,KIND):kgpr_core

插件

示例

这个例子有目的地复杂化,以说明库的许多特性。在

fromkubragenimportKubraGenfromkubragen.constsimportPROVIDER_GOOGLE,PROVIDERSVC_GOOGLE_GKEfromkubragen.dataimportValueDatafromkubragen.helperimportQuotedStrfromkubragen.jsonpatchimportFilterJSONPatches_Apply,FilterJSONPatch,ObjectFilterfromkubragen.kdataimportKData_Secretfromkubragen.objectimportObjectfromkubragen.optionimportOptionRootfromkubragen.optionsimportOptionsfromkubragen.outputimportOutputProject,OD_FileTemplate,OutputFile_ShellScript,OutputFile_Kubernetes, \
    OutputDriver_Printfromkubragen.providerimportProviderfromkg_rabbitmqimportRabbitMQBuilder,RabbitMQOptionskg=KubraGen(provider=Provider(PROVIDER_GOOGLE,PROVIDERSVC_GOOGLE_GKE),options=Options({'namespaces':{'default':'app-default','monitoring':'app-monitoring',},}))out=OutputProject(kg)shell_script=OutputFile_ShellScript('create_gke.sh')out.append(shell_script)shell_script.append('set -e')## OUTPUTFILE: app-namespace.yaml#file=OutputFile_Kubernetes('app-namespace.yaml')out.append(file)file.append(FilterJSONPatches_Apply([Object({'apiVersion':'v1','kind':'Namespace','metadata':{'name':'app-default','annotations':{'will-not-output':ValueData(value='anything',enabled=False),}},},name='ns-default',source='app'),Object({'apiVersion':'v1','kind':'Namespace','metadata':{'name':'app-monitoring',},},name='ns-monitoring',source='app'),],jsonpatches=[FilterJSONPatch(filters=ObjectFilter(names=['ns-monitoring']),patches=[{'op':'add','path':'/metadata/annotations','value':{'kubragen.github.io/patches':QuotedStr('true'),}},])]))shell_script.append(OD_FileTemplate(f'kubectl apply -f ${{FILE_{file.fileid}}}'))shell_script.append(f'kubectl config set-context --current --namespace=app-default')## SETUP: rabbitmq#rabbitmq_config=RabbitMQBuilder(kubragen=kg,options=RabbitMQOptions({'namespace':OptionRoot('namespaces.monitoring'),'basename':'myrabbit','config':{'erlang_cookie':KData_Secret(secretName='app-global-secrets',secretData='erlang_cookie'),'enable_prometheus':True,'prometheus_annotation':True,'authorization':{'serviceaccount_create':True,'roles_create':True,'roles_bind':True,},},'kubernetes':{'volumes':{'data':{'persistentVolumeClaim':{'claimName':'rabbitmq-storage-claim'}}},'resources':{'statefulset':{'requests':{'cpu':'150m','memory':'300Mi'},'limits':{'cpu':'300m','memory':'450Mi'},},},}})).jsonpatches([FilterJSONPatch(filters={'names':[RabbitMQBuilder.BUILDITEM_SERVICE]},patches=[{'op':'check','path':'/spec/ports/0/name','cmp':'equals','value':'http'},{'op':'replace','path':'/spec/type','value':'LoadBalancer'},]),])rabbitmq_config.ensure_build_names(rabbitmq_config.BUILD_ACCESSCONTROL,rabbitmq_config.BUILD_CONFIG,rabbitmq_config.BUILD_SERVICE)## OUTPUTFILE: rabbitmq-config.yaml#file=OutputFile_Kubernetes('rabbitmq-config.yaml')out.append(file)file.append(rabbitmq_config.build(rabbitmq_config.BUILD_ACCESSCONTROL,rabbitmq_config.BUILD_CONFIG))shell_script.append(OD_FileTemplate(f'kubectl apply -f ${{FILE_{file.fileid}}}'))## OUTPUTFILE: rabbitmq.yaml#file=OutputFile_Kubernetes('rabbitmq.yaml')out.append(file)file.append(rabbitmq_config.build(rabbitmq_config.BUILD_SERVICE))shell_script.append(OD_FileTemplate(f'kubectl apply -f ${{FILE_{file.fileid}}}'))## OUTPUT#out.output(OutputDriver_Print())# out.output(OutputDriver_Directory('/tmp/app-gke'))

输出:

^{pr2}$

设计理念

  • 由于生成的Kubernetes文件可能会产生严重的后果,因此库被设计为在最小程度上失败 错误的可能性,也给用户提供了工具库来检查任何生成的关键值 选项,使用jsonpatchext库检查生成器输出的数据。在

  • 为了减少dict连接的使用,一个特殊类型库布拉根数据数据可以在对象的任何地方使用, 它有一个is_enabled()方法,该方法删除该值(如果该值包含在dict/list中,则删除它的键) 如果返回False。在

  • 库只支持YAML,目前无法直接生成JSON。在

作者

范围实数(rangelreale@gmail.com

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何在导入到Google工作表时使用ApachePOI显示系列标签   java在Swing表上修改数据生成SQL   java TCP数据包在网络级别合并   java自动连线bean在线程位置为空   javasocket。禁用无线连接时getOutputStream()阻塞   JSON上的javascript字符串数组。stringify输出unicode字符   java在Oracle数据库中存储不同类型数据的最佳体验   Spring MVC中模板引擎后的java进程输出   不知从哪里来的java空字符串。   如何加载java。使用Adobe Flex的客户端的属性文件?   java如何替换多层括号之间的所有内容?   {JSONObject必须以java'开头   java使用commandButton或commandLink返回并管理HTML控件值   java Android大文本视图动态   java JMock需要自定义类   java Android应用程序在emulator中工作,但在设备中失败   java连接到derby数据库时使用什么文件路径格式?   java在一个函数调用中返回两个结果?