使用python脚本自动生成K8S-YAML的方法示例


Posted in Python onJuly 12, 2020

1、生成 servie.yaml

1.1、yaml转json

service模板yaml

apiVersion: v1
kind: Service
metadata:
 name: ${jarName}
 labels:
  name: ${jarName}
  version: v1
spec:
 ports:
  - port: ${port}
   targetPort: ${port}
 selector:
  name: ${jarName}

转成json的结构

{
 "apiVersion": "v1",
 "kind": "Service",
 "metadata": {
  "name": "${jarName}",
  "labels": {
   "name": "${jarName}",
   "version": "v1"
  }
 },
 "spec": {
  "ports": [
   {
    "port": "${port}",
    "targetPort": "${port}"
   }
  ],
  "selector": {
   "name": "${jarName}"
  }
 }
}

1.2、关键代码

# 通过传入service_name及ports列表
def create_service_yaml(service_name, ports):

 # 将yaml读取为json,然后修改所有需要修改的${jarName}
 service_data['metadata']['name'] = service_name
 service_data['metadata']['labels']['name'] = service_name
 service_data['spec']['selector']['name'] = service_name

 # .spec.ports 比较特殊,是一个字典列表,由于传入的ports难以确定数量,难以直接修改
 # 新建一个列表,遍历传入的ports列表,将传入的每个port都生成为一个字典,添加入新列表中
 new_spec_ports = []
 for port in ports:
   port = int(port)
   new_port = {'port': port, 'targetPort': port}
   new_spec_ports.append(new_port)

 # 修改.spec.ports为新列表
 service_data['spec']['ports'] = new_spec_ports

2、生成 deployment.yaml

2.1、yaml转json

deployment模板yaml

apiVersion: apps/v1
kind: Deployment
metadata:
 name: ${jarName}
 labels:
  name: ${jarName}
spec:
 selector:
  matchLabels:
   name: ${jarName}
 replicas: 1
 template:
  metadata:
   labels:
    name: ${jarName}
  spec:
   containers:
   - name: ${jarName}
    image: reg.test.local/library/${jarName}:${tag}
   imagePullSecrets:
    - name: registry-secret

转成的json结构

{
 "apiVersion": "apps/v1",
 "kind": "Deployment",
 "metadata": {
  "name": "${jarName}",
  "labels": {
   "name": "${jarName}"
  }
 },
 "spec": {
  "selector": {
   "matchLabels": {
    "name": "${jarName}"
   }
  },
  "replicas": 1,
  "template": {
   "metadata": {
    "labels": {
     "name": "${jarName}"
    }
   },
   "spec": {
    "containers": [
     {
      "name": "${jarName}",
      "image": "reg.test.local/library/${jarName}:${tag}"
     }
    ],
    "imagePullSecrets": [
     {
      "name": "registry-secret"
     }
    ]
   }
  }
 }
}

2.2、关键代码

# 传入service_name及image tag
def create_deploy_yaml(service_name, tag):

 # 首先修改所有的${jarName}
 deploy_data['metadata']['name'] = service_name
 deploy_data['metadata']['labels']['name'] = service_name
 deploy_data['spec']['selector']['matchLabels']['name'] = service_name
 deploy_data['spec']['template']['metadata']['labels']['name'] = service_name 

 # 由于.spec.template.spec.containers的特殊性,我们采用直接修改的方式
 # 首先拼接image字段
 image = "reg.test.local/library/" + service_name + ":" + tag
 # 创建new_containers字典列表
 new_containers = [{'name': service_name, 'image': image}]
 deploy_data['spec']['template']['spec']['containers'] = new_containers

3、完整脚本

#!/usr/bin/python
# encoding: utf-8

"""
The Script for Auto Create Deployment Yaml.

File:        auto_create_deploy_yaml
User:        miaocunfa
Create Date:    2020-06-10
Create Time:    17:06
"""

import os
from ruamel.yaml import YAML

yaml = YAML()

def create_service_yaml(service_name, ports):

  service_mould_file = "mould/info-service-mould.yaml"
  isServiceMould = os.path.isfile(service_mould_file)

  if isServiceMould:
    # read Service-mould yaml convert json
    with open(service_mould_file, encoding='utf-8') as yaml_obj:
      service_data = yaml.load(yaml_obj)

    # Update jarName
    service_data['metadata']['name'] = service_name
    service_data['metadata']['labels']['name'] = service_name
    service_data['spec']['selector']['name'] = service_name

    # Update port
    new_spec_ports = []
    for port in ports:
      port = int(port)
      portname = 'port' + str(port)
      new_port = {'name': portname, 'port': port, 'targetPort': port}
      new_spec_ports.append(new_port)
    service_data['spec']['ports'] = new_spec_ports

    # json To service yaml
    save_file = tag + '/' + service_name + '_svc.yaml'
    with open(save_file, mode='w', encoding='utf-8') as yaml_obj:
      yaml.dump(service_data, yaml_obj)

    print(save_file + ": Success!")
  else:
    print("Service Mould File is Not Exist!")

def create_deploy_yaml(service_name, tag):

  deploy_mould_file = "mould/info-deploy-mould.yaml"
  isDeployMould = os.path.isfile(deploy_mould_file)

  if isDeployMould:
    with open(deploy_mould_file, encoding='utf-8') as yaml_obj:
      deploy_data = yaml.load(yaml_obj)

    # Update jarName
    deploy_data['metadata']['name'] = service_name
    deploy_data['metadata']['labels']['name'] = service_name
    deploy_data['spec']['selector']['matchLabels']['name'] = service_name
    deploy_data['spec']['template']['metadata']['labels']['name'] = service_name 

    # Update containers
    image = "reg.test.local/library/" + service_name + ":" + tag
    new_containers = [{'name': service_name, 'image': image}]
    deploy_data['spec']['template']['spec']['containers'] = new_containers

    # json To service yaml
    save_file = tag + '/' + service_name + '_deploy.yaml'
    with open(save_file, mode='w', encoding='utf-8') as yaml_obj:
      yaml.dump(deploy_data, yaml_obj)

    print(save_file + ": Success!")
  else:
    print("Deploy Mould File is Not Exist!")

services = {
  'info-gateway':        ['9999'],
  'info-admin':         ['7777'],
  'info-config':        ['8888'],
  'info-message-service':    ['8555', '9666'],
  'info-auth-service':     ['8666'],
  'info-scheduler-service':   ['8777'],
  'info-uc-service':      ['8800'],
  'info-ad-service':      ['8801'],
  'info-community-service':   ['8802'],
  'info-groupon-service':    ['8803'],
  'info-hotel-service':     ['8804'],
  'info-nearby-service':    ['8805'],
  'info-news-service':     ['8806'],
  'info-store-service':     ['8807'],
  'info-payment-service':    ['8808'],
  'info-agent-service':     ['8809'],
  'info-consumer-service':   ['8090'],
}

prompt = "\n请输入要生成的tag: "
answer = input(prompt)
print("")

if os.path.isdir(answer):
  raise SystemExit(answer + ': is Already exists!')
else:
  tag = answer
  os.makedirs(tag)
  for service_name, service_ports in services.items():
    create_service_yaml(service_name, service_ports)
    create_deploy_yaml(service_name, tag)

4、执行效果

➜ python3 Auto_Create_K8S_YAML.py

请输入要生成的tag: 0.0.1

0.0.1/info-gateway_svc.yaml: Success!
0.0.1/info-gateway_deploy.yaml: Success!
0.0.1/info-admin_svc.yaml: Success!
0.0.1/info-admin_deploy.yaml: Success!
0.0.1/info-config_svc.yaml: Success!
0.0.1/info-config_deploy.yaml: Success!
0.0.1/info-message-service_svc.yaml: Success!
0.0.1/info-message-service_deploy.yaml: Success!
0.0.1/info-auth-service_svc.yaml: Success!
0.0.1/info-auth-service_deploy.yaml: Success!
0.0.1/info-scheduler-service_svc.yaml: Success!
0.0.1/info-scheduler-service_deploy.yaml: Success!
0.0.1/info-uc-service_svc.yaml: Success!
0.0.1/info-uc-service_deploy.yaml: Success!
0.0.1/info-ad-service_svc.yaml: Success!
0.0.1/info-ad-service_deploy.yaml: Success!
0.0.1/info-community-service_svc.yaml: Success!
0.0.1/info-community-service_deploy.yaml: Success!
0.0.1/info-groupon-service_svc.yaml: Success!
0.0.1/info-groupon-service_deploy.yaml: Success!
0.0.1/info-hotel-service_svc.yaml: Success!
0.0.1/info-hotel-service_deploy.yaml: Success!
0.0.1/info-nearby-service_svc.yaml: Success!
0.0.1/info-nearby-service_deploy.yaml: Success!
0.0.1/info-news-service_svc.yaml: Success!
0.0.1/info-news-service_deploy.yaml: Success!
0.0.1/info-store-service_svc.yaml: Success!
0.0.1/info-store-service_deploy.yaml: Success!
0.0.1/info-payment-service_svc.yaml: Success!
0.0.1/info-payment-service_deploy.yaml: Success!
0.0.1/info-agent-service_svc.yaml: Success!
0.0.1/info-agent-service_deploy.yaml: Success!
0.0.1/info-consumer-service_svc.yaml: Success!
0.0.1/info-consumer-service_deploy.yaml: Success!

➜ ll
total 12
drwxr-xr-x. 2 root root 4096 Jun 29 18:24 0.0.1

# 生成的 service yaml
➜ cat info-message-service_svc.yaml
apiVersion: v1
kind: Service
metadata:
 name: info-message-service
 labels:
  name: info-message-service
  version: v1
spec:
 ports:
 - name: port8555
  port: 8555
  targetPort: 8555
 - name: port9666
  port: 9666
  targetPort: 9666
 selector:
  name: info-message-service

# 生成的 deployment yaml
➜ cat info-message-service_deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
 name: info-message-service
 labels:
  name: info-message-service
spec:
 selector:
  matchLabels:
   name: info-message-service
 replicas: 2
 template:
  metadata:
   labels:
    name: info-message-service
  spec:
   containers:
   - name: info-message-service
    image: reg.test.local/library/info-message-service:0.0.1
   imagePullSecrets:
   - name: registry-secret

到此这篇关于使用python脚本自动生成K8S-YAML的方法示例的文章就介绍到这了,更多相关python自动生成K8S-YAML内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python编程中的异常处理教程
Aug 21 Python
Django使用Mysql数据库已经存在的数据表方法
May 27 Python
解决python中使用plot画图,图不显示的问题
Jul 04 Python
Python生成一个迭代器的实操方法
Jun 18 Python
python安装gdal的两种方法
Oct 29 Python
Java Spring项目国际化(i18n)详细方法与实例
Mar 20 Python
使用Pycharm分段执行代码
Apr 15 Python
解决Jupyter无法导入已安装的 module问题
Apr 17 Python
python高级特性简介
Aug 13 Python
python和node.js生成当前时间戳的示例
Sep 29 Python
基于Python爬取股票数据过程详解
Oct 21 Python
Django数据库迁移常见使用方法
Nov 12 Python
python读取excel进行遍历/xlrd模块操作
Jul 12 #Python
django rest framework 自定义返回方式
Jul 12 #Python
Django+RestFramework API接口及接口文档并返回json数据操作
Jul 12 #Python
Python3交互式shell ipython3安装及使用详解
Jul 11 #Python
Python QTimer实现多线程及QSS应用过程解析
Jul 11 #Python
面向新手解析python Beautiful Soup基本用法
Jul 11 #Python
基于python实现判断字符串是否数字算法
Jul 10 #Python
You might like
php一些公用函数的集合
2008/03/27 PHP
PHP加密解密函数详解
2015/10/28 PHP
php中array_column函数简单实现方法
2016/07/11 PHP
PHP文件系统管理(实例讲解)
2017/09/19 PHP
客户端静态页面玩分页
2006/06/26 Javascript
jQuery 核心函数以及jQuery对象
2010/03/23 Javascript
5秒后跳转效果(setInterval/SetTimeOut)
2013/05/03 Javascript
JQuery写动态树示例代码
2013/07/31 Javascript
浅谈javascript中createElement事件
2014/12/05 Javascript
JS实现点击按钮控制Div变宽、增高及调整背景色的方法
2015/08/05 Javascript
jQuery实用技巧必备(上)
2015/11/02 Javascript
手机图片预览插件photoswipe.js使用总结
2016/08/25 Javascript
Node.js连接MongoDB数据库产生的问题
2017/02/08 Javascript
Angualrjs和bootstrap相结合实现数据表格table
2017/03/30 Javascript
webpack学习笔记之优化缓存、合并、懒加载
2017/08/24 Javascript
React中的render何时执行过程
2018/04/13 Javascript
vue脚手架搭建过程图解
2018/06/06 Javascript
vant(ZanUi)结合async-validator实现表单验证的方法
2018/12/06 Javascript
vue滑动吸顶及锚点定位的示例代码
2020/05/10 Javascript
[01:51]2018年度CS GO最具人气外援-完美盛典
2018/12/16 DOTA
跟老齐学Python之编写类之四再论继承
2014/10/11 Python
web.py 十分钟创建简易博客实现代码
2016/04/22 Python
django创建css文件夹的具体方法
2020/07/31 Python
python实现发送带附件的邮件代码分享
2020/09/22 Python
python如何构建mock接口服务
2021/01/28 Python
html5中嵌入视频自动播放的问题解决
2020/05/25 HTML / CSS
Kathmandu美国网站:新西兰户外运动品牌
2019/03/23 全球购物
暑期实习鉴定
2013/12/16 职场文书
《金子》教学反思
2014/04/13 职场文书
培训科主任岗位职责
2014/08/08 职场文书
国际贸易本科毕业生求职信
2014/09/26 职场文书
党员先进事迹材料
2014/12/19 职场文书
钱塘江大潮导游词
2015/02/03 职场文书
安全保证书格式
2015/02/28 职场文书
分析Netty直接内存原理及应用
2021/06/14 Java/Android
vue里使用create, mounted调用方法
2022/04/26 Vue.js