KubraGen2:编程Kubernetes YAML生成器

kubragen2的Python项目详细描述


KubraGen2:编程的Kubernetes YAML生成器

PyPI versionSupported Python versions

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

结合Helmion,可以使用Helm 作为kubernetesyaml源代码,定制它们,并生成一个脚本来直接应用它,而不需要使用 舵手释放过程。在

请参阅Kubragen2 Samples以获取实际示例。在

概述

示例请参见源代码

示例

importargparseimportdatetimeimportosfromhelmion.chartimportProcessorChain,Chartfromhelmion.helmchartimportHelmRequestfromhelmion.processorimportDefaultProcessor,FilterRemoveHelmData,ListSplitterfromhelmion.resourceimportis_any_resourcefromkubragen2.buildimportBuildDatafromkubragen2.dataimportValueDatafromkubragen2.kdataimportKData_PersistentVolume_HostPath,KData_PersistentVolumeClaim, \
    KData_PersistentVolumeClaim_NoSelector,KData_PersistentVolume_Request,KData_PersistentVolume_CSI, \
    KData_PersistentVolumeClaim_Requestfromkubragen2.outputimportOutputProject,OutputFile_ShellScript,OutputFile_Kubernetes,OD_FileTemplate, \
    OutputDriver_Directoryfromkubragen2.provider.awsimportKData_PersistentVolume_CSI_AWSEBSfromkubragen2.provider.digitaloceanimportKData_PersistentVolume_CSI_DOBSfromkubragen2.provider.gcloudimportKData_PersistentVolume_GCEPersistentDiskdefmain():parser=argparse.ArgumentParser(description='Kube Creator')parser.add_argument('-p','--provider',help='provider',required=True,choices=['google-gke','amazon-eks','digitalocean-kubernetes','k3d',])parser.add_argument('--no-resource-limit',help='don''t limit resources',action='store_true')parser.add_argument('-o','--output-path',help='output path',default='output')args=parser.parse_args()## Persistent Volumes#pv_volumes=Nonepvc_volumes=Noneifargs.provider=='k3d':pv_volumes=KData_PersistentVolume_HostPath()pvc_volumes=KData_PersistentVolumeClaim_NoSelector()elifargs.provider=='google-gke':pv_volumes=KData_PersistentVolume_GCEPersistentDisk()elifargs.provider=='digitalocean-kubernetes':pv_volumes=KData_PersistentVolume_CSI_DOBS()elifargs.provider=='amazon-eks':pv_volumes=KData_PersistentVolume_CSI_AWSEBS()else:raiseException('Unknown target')ifpvc_volumesisNone:pvc_volumes=KData_PersistentVolumeClaim()## Volumes#pv_prometheus_files=KData_PersistentVolume_Request(name='prometheus-storage',selector_labels={'pv.role':'prometheus',},storageclassname='',storage='50Gi',access_modes=['ReadWriteOnce'],configs=[KData_PersistentVolume_HostPath.Config(hostpath={'path':'/var/storage/prometheus'}),KData_PersistentVolume_CSI.Config(csi={'fsType':'ext4'}),])pvc_prometheus_files=KData_PersistentVolumeClaim_Request(name='prometheus-claim',namespace='monitoring',pvreq=pv_prometheus_files,)# Add namespace to items, and filter Helm data from labels and annotationshelm_default_processor=ProcessorChain(DefaultProcessor(add_namespace=True),FilterRemoveHelmData())defhelm_splitter_crd(cat,chart,data):returnis_any_resource(data,{'apiVersionNS':'apiextensions.k8s.io','kind':'CustomResourceDefinition'})defhelm_splitter_config(cat,chart,data):returnis_any_resource(data,{'apiVersionNS':'rbac.authorization.k8s.io'},{'apiVersionNS':'policy'},{'apiVersionNS':'','kind':'ServiceAccount'},{'apiVersionNS':'','kind':'Secret'},{'apiVersionNS':'','kind':'ConfigMap'},{'apiVersionNS':'monitoring.coreos.com'},{'apiVersionNS':'admissionregistration.k8s.io'},)defhelm_splitter_job(cat,chart,data):returnis_any_resource(data,{'apiVersionNS':'batch'})defhelm_splitter_service(cat,chart,data):returnis_any_resource(data,{'apiVersionNS':'','kind':'Service'},{'apiVersionNS':'','kind':'Pod'},{'apiVersionNS':'','kind':'List'},{'apiVersionNS':'apps','kind':'Deployment'},{'apiVersionNS':'apps','kind':'DaemonSet'},{'apiVersionNS':'apps','kind':'StatefulSet'})# Start outputout=OutputProject()shell_script=OutputFile_ShellScript('create_{}.sh'.format(args.provider))out.append(shell_script)shell_script.append('set -e')## Provider setup#ifargs.provider=='k3d':storage_directory=os.path.join(os.getcwd(),'output','storage')ifnotos.path.exists(storage_directory):os.makedirs(storage_directory)ifnotos.path.exists(os.path.join(storage_directory,'prometheus')):os.makedirs(os.path.join(storage_directory,'prometheus'))shell_script.append(f'# k3d cluster create kg2sample-prometheus-stack --port 5051:80@loadbalancer --port 5052:443@loadbalancer -v {storage_directory}:/var/storage')## OUTPUTFILE: namespace.yaml#file=OutputFile_Kubernetes('namespace.yaml')file.append([{'apiVersion':'v1','kind':'Namespace','metadata':{'name':'monitoring',},}])out.append(file)shell_script.append(OD_FileTemplate(f'kubectl apply -f ${{FILE_{file.fileid}}}'))## OUTPUTFILE: storage.yaml#file=OutputFile_Kubernetes('storage.yaml')file.append(pv_volumes.build(pv_prometheus_files))# file.append(pv_volumes.build_claim(pvc_volumes, pvc_prometheus_files)) # this will be used only as spec in Helmout.append(file)shell_script.append(OD_FileTemplate(f'kubectl apply -f ${{FILE_{file.fileid}}}'))## HELM: traefik2#helmreq=HelmRequest(repository='https://helm.traefik.io/traefik',chart='traefik',version='9.11.0',releasename='traefik-router',# rename to avoid conflict with k3dnamespace='monitoring',values=BuildData({'ingressRoute':{'dashboard':{'enabled':False,}},'providers':{'kubernetesCRD':{'enabled':True,'namespaces':['default','monitoring',]},'kubernetesIngress':{'enabled':False,}},'logs':{'access':{'enabled':True,}},'globalArguments':['--global.checkNewVersion=false','--global.sendAnonymousUsage=false',],'additionalArguments':['--api.debug=true','--api.dashboard=true','--api.insecure=false','--metrics.prometheus=true','--metrics.prometheus.entryPoint=metrics','--metrics.prometheus.addEntryPointsLabels=true',],'ports':{'web':{'expose':True,'exposedPort':80,},'websecure':{'expose':False,},'api':{'port':8080,'expose':True,},'metrics':{'expose':True,'port':9090,},},'service':{'type':'NodePort'ifargs.provider!='k3d'else'ClusterIP',},'resources':ValueData(value={'requests':{'cpu':'100m','memory':'200Mi',},'limits':{'cpu':'200m','memory':'300Mi',},},enabled=notargs.no_resource_limit),}))traefik_helmchart=helmreq.generate().process(helm_default_processor).split(ListSplitter({'crd':helm_splitter_crd,'config':helm_splitter_config,'service':helm_splitter_service,},exactly_one_category=True))## OUTPUTFILE: traefik-config-crd.yaml#file=OutputFile_Kubernetes('traefik-config-crd.yaml')file.append(traefik_helmchart['crd'].data)out.append(file)shell_script.append(OD_FileTemplate(f'kubectl apply -f ${{FILE_{file.fileid}}}'))## OUTPUTFILE: traefik-config.yaml#file=OutputFile_Kubernetes('traefik-config.yaml')file.append(traefik_helmchart['config'].data)file.append([{'apiVersion':'traefik.containo.us/v1alpha1','kind':'IngressRoute','metadata':{'name':'traefik-api','namespace':'monitoring',},'spec':{'entryPoints':['api'],'routes':[{'match':'Method(`GET`)','kind':'Rule','services':[{'name':'api@internal','kind':'TraefikService'}]}]}}])out.append(file)shell_script.append(OD_FileTemplate(f'kubectl apply -f ${{FILE_{file.fileid}}}'))## HELM: prometheus#helmreq=HelmRequest(repository='https://prometheus-community.github.io/helm-charts',chart='kube-prometheus-stack',version='12.2.3',releasename='kube-prometheus-stack',namespace='monitoring',values=BuildData({'alertmanager':{'resources':ValueData(value={'requests':{'cpu':'50m','memory':'100Mi'},'limits':{'cpu':'100m','memory':'150Mi',},},enabled=notargs.no_resource_limit),},'grafana':{'enabled':True,'adminPassword':'grafana123','resources':ValueData(value={'requests':{'cpu':'50m','memory':'100Mi'},'limits':{'cpu':'100m','memory':'128Mi',},},enabled=notargs.no_resource_limit),},'prometheusOperator':{'enabled':True,'resources':ValueData(value={'requests':{'cpu':'50m','memory':'50Mi'},'limits':{'cpu':'120m','memory':'120Mi'},},enabled=notargs.no_resource_limit),},'kube-state-metrics':{'resources':ValueData(value={'requests':{'cpu':'10m','memory':'32Mi',},'limits':{'cpu':'100m','memory':'64Mi',}},enabled=notargs.no_resource_limit),},'prometheus-node-exporter':{'resources':ValueData(value={'requests':{'cpu':'150m','memory':'150Mi',},'limits':{'cpu':'200m','memory':'200Mi'},},enabled=notargs.no_resource_limit),},'prometheus':{'service':{'port':80,},'prometheusSpec':{'containers':[{'name':'prometheus','readinessProbe':{'initialDelaySeconds':30,'periodSeconds':30,'timeoutSeconds':8,},}],'resources':ValueData(value={'requests':{'cpu':'150m','memory':'350Mi'},'limits':{'cpu':'300m','memory':'800Mi'},},enabled=notargs.no_resource_limit),'storageSpec':{'volumeClaimTemplate':{'spec':pv_volumes.build_claim(pvc_volumes,pvc_prometheus_files)['spec'],},}}},'coreDns':{'enabled':args.provider!='google-gke',},'kubeDns':{'enabled':args.provider=='google-gke',},}))prometheus_helmchart=helmreq.generate().process(helm_default_processor).split(ListSplitter({'crd':helm_splitter_crd,'config':helm_splitter_config,'job':helm_splitter_job,'service':helm_splitter_service,},exactly_one_category=True))## OUTPUTFILE: prometheus-crd.yaml#file=OutputFile_Kubernetes('prometheus-crd.yaml')out.append(file)file.append(prometheus_helmchart['crd'].data)shell_script.append(OD_FileTemplate(f'kubectl apply -f ${{FILE_{file.fileid}}}'))## OUTPUTFILE: prometheus-config.yaml#file=OutputFile_Kubernetes('prometheus-config.yaml')out.append(file)file.append(prometheus_helmchart['config'].data)shell_script.append(OD_FileTemplate(f'kubectl apply -f ${{FILE_{file.fileid}}}'))## OUTPUTFILE: prometheus-job.yaml#file=OutputFile_Kubernetes('prometheus-job.yaml')out.append(file)file.append(prometheus_helmchart['job'].data)shell_script.append(OD_FileTemplate(f'kubectl apply -f ${{FILE_{file.fileid}}}'))## OUTPUTFILE: prometheus.yaml#file=OutputFile_Kubernetes('prometheus.yaml')out.append(file)file.append(prometheus_helmchart['service'].data)file.append([{'apiVersion':'traefik.containo.us/v1alpha1','kind':'IngressRoute','metadata':{'name':'admin-prometheus','namespace':'monitoring',},'spec':{'entryPoints':['web'],'routes':[{'match':f'Host(`admin-prometheus.localdomain`)','kind':'Rule','services':[{'name':'kube-prometheus-stack-prometheus','namespace':'monitoring','port':80,}],}]}},{'apiVersion':'traefik.containo.us/v1alpha1','kind':'IngressRoute','metadata':{'name':'admin-grafana','namespace':'monitoring',},'spec':{'entryPoints':['web'],'routes':[{'match':f'Host(`admin-grafana.localdomain`)','kind':'Rule','services':[{'name':'kube-prometheus-stack-grafana','namespace':'monitoring','port':80,}],}]}}])shell_script.append(OD_FileTemplate(f'kubectl apply -f ${{FILE_{file.fileid}}}'))## OUTPUTFILE: http-echo.yaml#file=OutputFile_Kubernetes('http-echo.yaml')out.append(file)file.append([{'apiVersion':'apps/v1','kind':'Deployment','metadata':{'name':'echo-deployment','namespace':'default','labels':{'app':'echo'}},'spec':{'replicas':1,'selector':{'matchLabels':{'app':'echo'}},'template':{'metadata':{'labels':{'app':'echo'}},'spec':{'containers':[{'name':'echo','image':'mendhak/http-https-echo','ports':[{'containerPort':80},{'containerPort':443}],}]}}}},{'apiVersion':'v1','kind':'Service','metadata':{'name':'echo-service','namespace':'default',},'spec':{'selector':{'app':'echo'},'ports':[{'name':'http','port':80,'targetPort':80,'protocol':'TCP'}]}},{'apiVersion':'traefik.containo.us/v1alpha1','kind':'IngressRoute','metadata':{'name':'http-echo','namespace':'default',},'spec':{'entryPoints':['web'],'routes':[{# 'match': f'Host(`http-echo.localdomain`)','match':f'PathPrefix(`/`)','kind':'Rule','services':[{'name':'echo-service','port':80,}],}]}}])shell_script.append(OD_FileTemplate(f'kubectl apply -f ${{FILE_{file.fileid}}}'))## OUTPUTFILE: traefik.yaml#file=OutputFile_Kubernetes('traefik.yaml')file.append(traefik_helmchart['service'].data)file.append({'apiVersion':'traefik.containo.us/v1alpha1','kind':'IngressRoute','metadata':{'name':'admin-traefik','namespace':'monitoring',},'spec':{'entryPoints':['web'],'routes':[{'match':f'Host(`admin-traefik.localdomain`)','kind':'Rule','services':[{'name':'traefik-router','port':8080,}],}]}})file.append({'apiVersion':'monitoring.coreos.com/v1','kind':'ServiceMonitor','metadata':{'name':'traefik','namespace':'monitoring','labels':{'release':'kube-prometheus-stack',},},'spec':{'selector':{'matchLabels':{'app.kubernetes.io/name':'traefik','app.kubernetes.io/instance':'traefik-router',},},'namespaceSelector':{'matchNames':['monitoring']},'endpoints':[{'port':'metrics','path':'/metrics',}],},})out.append(file)shell_script.append(OD_FileTemplate(f'kubectl apply -f ${{FILE_{file.fileid}}}'))## OUTPUTFILE: ingress.yaml#file=OutputFile_Kubernetes('ingress.yaml')http_path='/'ifargs.provider!='k3d':http_path='/*'ingress_chart=Chart(data=[{'apiVersion':'extensions/v1beta1','kind':'Ingress','metadata':{'name':'ingress','namespace':'monitoring',},'spec':{'rules':[{'http':{'paths':[{'path':http_path,'backend':{'serviceName':'traefik-router','servicePort':80,}}]}}]}},])ifargs.provider=='amazon-eks':ingress_chart=ingress_chart.process(DefaultProcessor(jsonpatches=[{'condition':[{'op':'check','path':'/kind','cmp':'equals','value':'Ingress'},],'patch':[{'op':'merge','path':'/metadata','value':{'annotations':{'kubernetes.io/ingress.class':'alb','alb.ingress.kubernetes.io/scheme':'internet-facing','alb.ingress.kubernetes.io/listen-ports':'[{"HTTP": 80}]',}}}]}]))file.append(ingress_chart.data)out.append(file)shell_script.append(OD_FileTemplate(f'kubectl apply -f ${{FILE_{file.fileid}}}'))## OUTPUT#output_path=os.path.join(args.output_path,'{}-{}'.format(args.provider,datetime.datetime.today().strftime("%Y%m%d-%H%M%S")))print('Saving files to {}'.format(output_path))ifnotos.path.exists(output_path):os.makedirs(output_path)out.output(OutputDriver_Directory(output_path))if__name__=="__main__":main()

输出:

^{pr2}$

作者

范围实数(rangelreale@gmail.com

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

推荐PyPI第三方库


热门话题
使用applets查询的多人java游戏?   java如何基于字符串生成数组   基于java多边形的路径查找   java如何对多列ArrayList排序   java批处理更新从更新中返回了意外的行数(Spring/Hibernate)   java如何使用SeleniumWebDriver列出<tr>标记内的所有<td>   java如何使用SimpleFlatMapper将前缀为CSV的列别名到映射?   java为什么通过eclipse运行/调试TomCat时会出现ClassNotFoundException   java Android滚动视图上次视图未显示内部线性布局   替换字符串中不带空格的字符序列   调用方法时Java Swing GUI冻结   java是否允许/建议重用收集器?   在同步方法中使用java hashmap迭代器时   在java XMLDecoder XMLEncoder中写入XMLdatabase   java I无法在活动的片段中填充recyclerview   java Jitsi在调用过程中播放WAV文件如果可能,与音频混合   java JPA为什么我看到DB中每行有两个实体实例?