python k8s sdk调用示例(一)configmap

1,231 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

# 依赖库
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)