本文已参与「新人创作礼」活动,一起开启掘金创作之路。
# 依赖库
kubernetes==12.0.1
ruamel.yaml==0.17.20
获取指定namespace下指定configmap的内容,以yaml格式返回
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import json
from io import StringIO
# import yaml
import ruamel.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
# 获取configmap内容
# 参数说明:
# config_path:k8s集群token文件路径
# namespace:k8s namespace
# name:configmap名称
def get_configmap_content(config_path, namespace, name):
# load k8s集群token信息
config.load_kube_config(config_path)
v1 = client.CoreV1Api()
# 读取configmap
ret = v1.read_namespaced_config_map(namespace=namespace, name=name)
# 把一些value为None的key去掉
data = simple_data(ret.to_dict())
# 转为yaml格式,直接用这个库转为yaml格式返回,会有很多换行符没有打印出来
# configmap_yaml = yaml.dump(data)
# return configmap_yaml
# 格式化一些多行的情况
# 先转为json
data_str = json.dumps(data)
# 格式化
ruamel_yaml = ruamel.yaml.YAML()
ruamel_yaml.explicit_start = True
new_data = json.loads(data_str, object_pairs_hook=ruamel.yaml.comments.CommentedMap)
ruamel.yaml.scalarstring.walk_tree(new_data)
# 不直接打印到标准输出
# ruamel_yaml.dump(new_data, sys.stdout)
# return True
string_stream = StringIO()
ruamel_yaml.dump(new_data, string_stream) # 先写到IO流
configmap_yaml_str = string_stream.getvalue() # 再读取IO流的内容
string_stream.close()
# 把第一行的---\n去掉
configmap_yaml_str = configmap_yaml_str.lstrip('-')
configmap_yaml_str = configmap_yaml_str.lstrip('\n')
# 返回按yaml格式化之后的configmap内容
return configmap_yaml_str
获取指定namespace下的configmap列表
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from kubernetes import client, config
# 获取指定namespace下面的configmap列表
# 参数说明:
# config_path:k8s集群token文件路径
# namespace:k8s namespace
def list_configmap(config_path, namespace):
# load k8s集群token信息
config.load_kube_config(config_path)
v1 = client.CoreV1Api()
# 读取configmap列表
configmap_list = []
ret = v1.list_namespaced_config_map(namespace=namespace) # V1ConfigMapList
for item in ret.items:
# print(type(item.metadata))
configmap_list.append(item.metadata.name)
return configmap_list
更新configmap
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import yaml
from kubernetes import client, config
# 更新configmap
# 参数说明:
# config_path:k8s集群token文件路径
# namespace:k8s namespace
# name:configmap名称
# content:configmap内容
def replace_configmap(config_path, namespace, name, content):
# load k8s集群token信息
config.load_kube_config(config_path)
v1 = client.CoreV1Api()
# 将内容转换为参数要求的格式
body = yaml.safe_load(content)
# 变更configmap
ret = v1.replace_namespaced_config_map(namespace=namespace, name=name, body=body)
return True
创建configmap
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import yaml
from kubernetes import client, config
# 创建configmap
# 参数说明:
# config_path:k8s集群token文件路径
# namespace:k8s namespace
# content:configmap内容
def create_configmap(config_path, namespace, content):
# load k8s集群token信息
config.load_kube_config(config_path)
v1 = client.CoreV1Api()
# 将内容转换为参数要求的格式
body = yaml.safe_load(content)
# 变更configmap
ret = v1.create_namespaced_config_map(namespace=namespace, body=body)
return True
创建/更新configmap
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# 参数说明:
# config_path:k8s集群token文件路径
# namespace:k8s namespace
# name:configmap名称
# content:configmap内容
def deploy_configmap(config_path, namespace, name, content):
# 获取现有的configmap列表
configmap_list = list_configmap(config_path, namespace)
if name in configmap_list: # 更新
return replace_configmap(config_path, namespace, name, content)
else: # 新建
return create_configmap(config_path, namespace, content)