python k8s sdk调用示例(三)ingress

415 阅读2分钟

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

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