本文已参与「新人创作礼」活动,一起开启掘金创作之路。
# 依赖库
kubernetes==12.0.1
ruamel.yaml==0.17.20
获取指定namespace下指定ingress的内容,以yaml格式返回
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import yaml
from datetime import datetime
from kubernetes import client, config
# 1.递归对数据进行简化
# 2.把一些value为None的key去掉,把datetime的转为字符串
# 3.把api_version改为apiVersion
def simple_data(data):
if isinstance(data, dict):
tmp_dict = {}
for key, value in data.items():
if key == 'api_version':
key = 'apiVersion'
if value is None:
continue
tmp_dict[key] = simple_data(value)
return tmp_dict
elif isinstance(data, datetime):
return data.strftime("%Y-%m-%dT%H:%M:%SZ")
else:
return data
# 获取ingress内容
# 参数说明:
# config_path:k8s集群token文件路径
# namespace:k8s namespace
# name:ingress名称
def get_ingress_content(config_path, namespace, name):
# load k8s集群token信息
config.load_kube_config(config_path)
v1 = client.ExtensionsV1beta1Api() # 注意,ingress的api不一样
# 读取ingress
ret = v1.read_namespaced_ingress(namespace=namespace, name=name)
# 把一些value为None的key去掉
data = simple_data(ret.to_dict())
# 转为yaml格式
ingress_yaml = yaml.dump(data)
return ingress_yaml
获取指定namespace下的ingress列表
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from kubernetes import client, config
# 获取指定namespace下面的ingress列表
# 参数说明:
# config_path:k8s集群token文件路径
# namespace:k8s namespace
def list_ingress(config_path, namespace):
# load k8s集群token信息
config.load_kube_config(config_path)
v1 = client.ExtensionsV1beta1Api()
# 读取ingress列表
ingress_list = []
ret = v1.list_namespaced_ingress(namespace=namespace)
for item in ret.items:
# print(type(item.metadata))
ingress_list.append(item.metadata.name)
return ingress_list
更新ingress
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import yaml
from kubernetes import client, config
# 更新ingress
# 参数说明:
# config_path:k8s集群token文件路径
# namespace:k8s namespace
# name:ingress名称
# content:ingress内容
def replace_ingress(config_path, namespace, name, content):
# load k8s集群token信息
config.load_kube_config(config_path)
v1 = client.ExtensionsV1beta1Api()
# 读取ingress内容
# ingress_content = v1.read_namespaced_ingress(namespace=namespace, name=name)
# 将内容转换为参数要求的格式
body = yaml.safe_load(content) # dict
# 变更ingress
ret = v1.replace_namespaced_ingress(namespace=namespace, name=name, body=body)
return True
创建ingress
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import yaml
from kubernetes import client, config
# 创建ingress
# 参数说明:
# config_path:k8s集群token文件路径
# namespace:k8s namespace
# content:ingress内容
def create_ingress(config_path, namespace, content):
# load k8s集群token信息
config.load_kube_config(config_path)
v1 = client.ExtensionsV1beta1Api()
# 将内容转换为参数要求的格式
body = yaml.safe_load(content)
# 创建ingress
ret = v1.create_namespaced_ingress(namespace=namespace, body=body)
return True
创建/更新ingress
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# 参数说明:
# config_path:k8s集群token文件路径
# namespace:k8s namespace
# name:ingress名称
# content:ingress内容
def deploy_ingress(config_path, namespace, name, content):
# 获取现有的ingress列表
ingress_list = list_ingress(config_path, namespace)
if name in ingress_list: # 更新
return replace_ingress(config_path, namespace, name, content)
else: # 新建
return create_ingress(config_path, namespace, content)