KubraGen:编程的Kubernetes YAML生成器
kubragen的Python项目详细描述
KubraGen:编程的Kubernetes YAML生成器
概述
KubraGen是一个Kubernetes YAML生成器库,它可以生成 配置使用Python编程语言的全部功能。在
使用插件(称为构建器),可以包含知道如何配置的库 特定的服务,如Prometheus、RabbitMQ、Traefik等
使用jsonpatchext库(jsonpatch的扩展)来检查和修改输出 对象,而不直接访问返回的dict,包括使用deepmerge合并dict 图书馆。在
示例请参见源代码
- 网址:https://github.com/RangelReale/kubragen
- 存储库:https://github.com/RangelReale/kubragen.git
- 文档:https://kubragen.readthedocs.org/
- PyPI:https://pypi.python.org/pypi/kubragen
样品
- 真实世界示例:kubragen_samples
建筑商
- 拉比MQ:kg_rabbitmq
- 路径2:kg_traefik2
- 钥匙斗篷:kg_keycloak
- 入口NGINX:kg_ingressnginx
- 普罗米修斯:kg_prometheus
- 格拉法纳:kg_grafana
- 节点导出器:kg_nodeexporter
- Kube状态度量:kg_kubestatemetrics
- 洛基:kg_loki
- 提示:kg_promtail
- Kube资源报告:kg_kuberesourcereport
- RabbitMQ(在线YAML下载):kg_rabbitmqonline
- Prometheus堆栈(Prometheus,Grafana,Node Exporter,Kube State Metrics):kg_prometheusstack
- EFK堆栈(Elasticsearch,Fluentd,Kibana):kg_efk
- 洛基栈(Loki,Promtail,Grafana):kg_lokistack
提供商
- 核心(亚马逊EKS,Google GKE,DigitalOcean Kubernetes,K3D,KIND):kgpr_core
插件
- 配置呈现器-TOML:kgp_configrendertoml
示例
这个例子有目的地复杂化,以说明库的许多特性。在
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)
- 项目
标签: