python操作k8s

记录一下 python和k8s交互方式,涵盖配置/configmap/ingress/pod/deployment/serivce等;

  1. 封装k8s处理类
from kubernetes import client, config  # type: ignore

from sites.config import ROOT_PATH

# 命令空间
NAMESPACE = "namespace_name"


class K8sHandler(object):
    def __init__(self) -> None:
        kubeconfig = ROOT_PATH / "kubeconfig"
        config.load_kube_config(str(kubeconfig))
        # 资源接口类实例化
        self.apps_api = client.AppsV1Api()
        self.core_api = client.CoreV1Api()
        self.networking_api = client.NetworkingV1Api()

    def get_configmaps(self, namespace=NAMESPACE) -> list:
        data = []
        for cm in self.core_api.list_namespaced_config_map(namespace=namespace).items:
            data.append(cm.metadata.name)
        return data

    def create_configmap(self, body, namespace=NAMESPACE) -> None:
        self.core_api.create_namespaced_config_map(namespace=namespace, body=body)

    def delete_configmap(self, name, namespace=NAMESPACE) -> None:
        self.core_api.delete_namespaced_config_map(
            name=name, namespace=namespace, body=client.V1DeleteOptions()
        )

    def get_pods(self, namespace=NAMESPACE) -> list:
        data = []
        for dp in self.core_api.list_namespaced_pod(namespace=namespace).items:
            data.append(dp.metadata.name)
        return data

    def delete_pod(self, name, namespace=NAMESPACE) -> None:
        self.core_api.delete_namespaced_pod(
            name=name, namespace=namespace, body=client.V1DeleteOptions()
        )

    def get_deployments(self, namespace=NAMESPACE) -> list:
        data = []
        for dp in self.apps_api.list_namespaced_deployment(namespace=namespace).items:
            data.append(dp.metadata.name)
        return data

    def create_deployment(self, body, namespace=NAMESPACE) -> None:
        self.apps_api.create_namespaced_deployment(namespace=namespace, body=body)

    def delete_deployment(self, name, namespace=NAMESPACE) -> None:
        self.apps_api.delete_namespaced_deployment(
            name=name, namespace=namespace, body=client.V1DeleteOptions()
        )

    def get_services(self, namespace=NAMESPACE) -> list:
        data = []
        for cm in self.core_api.list_namespaced_service(namespace=namespace).items:
            data.append(cm.metadata.name)
        return data

    def create_service(self, body, namespace=NAMESPACE) -> None:
        self.core_api.create_namespaced_service(namespace=namespace, body=body)

    def delete_service(self, name, namespace=NAMESPACE) -> None:
        self.core_api.delete_namespaced_service(
            name=name, namespace=namespace, body=client.V1DeleteOptions()
        )

    def get_ingress(self, namespace=NAMESPACE) -> list:
        data = []
        for cm in self.networking_api.list_namespaced_ingress(namespace=namespace).items:
            data.append(cm.metadata.name)
        return data

    def create_ingress(self, body, namespace=NAMESPACE) -> None:
        self.networking_api.create_namespaced_ingress(namespace=namespace, body=body)

    def delete_ingress(self, name, namespace=NAMESPACE) -> None:
        self.networking_api.delete_namespaced_ingress(
            name=name, namespace=namespace, body=client.V1DeleteOptions()
        )

  1. 定义一个方法替换模板, 生成上述方法中的body, info为配置数据,一个dict
    from string import Template
    import yaml
def _fill_yml(self, yml_path, info):
    with open(yml_path) as yml_f:
        tmp = Template(yml_f.read())
        new_yml = tmp.safe_substitute(info)
        body = yaml.load(new_yml, Loader=yaml.SafeLoader)
    return body
  1. 调用示例:
k8s_handler = K8sHandler()
# 部署configmap
cm_temp_dir = ROOT_PATH / "yml/configmap"
for yml in os.listdir(cm_temp_dir):
    body = self._fill_yml(cm_temp_dir / yml, info)
    exists_cm_list = k8s_handler.get_configmaps()
    if body["metadata"]["name"] in exists_cm_list:
        logging.error("configmap {} 已存在!".format(body["metadata"]["name"]))
    k8s_handler.create_configmap(body)

# 部署deployment
pod_temp_dir = ROOT_PATH / "yml/deployment"
for yml in os.listdir(pod_temp_dir):
    body = self._fill_yml(pod_temp_dir / yml, info)
    exists_pod_list = k8s_handler.get_deployments()
    if body["metadata"]["name"] in exists_pod_list:
        logging.error("deployment {} 已存在!".format(body["metadata"]["name"]))
    k8s_handler.create_deployment(body)

# 部署service
svc_temp_dir = ROOT_PATH / "yml/service"
for yml in os.listdir(svc_temp_dir):
    body = self._fill_yml(svc_temp_dir / yml, info)
    exists_service_list = k8s_handler.get_services()
    if body["metadata"]["name"] in exists_service_list:
        logging.error("deployment {} 已存在!".format(body["metadata"]["name"]))
    k8s_handler.create_service(body)

# 部署ingress
ingress_tmp_dir = ROOT_PATH / "yml/ingress"
for yml in os.listdir(ingress_tmp_dir):
    body = self._fill_yml(ingress_tmp_dir / yml, info)
    exists_ingress_list = k8s_handler.get_ingress()
    if body["metadata"]["name"] in exists_ingress_list:
        logging.error("ingress {} 已存在!".format(body["metadata"]["name"]))
    k8s_handler.create_ingress(body)
posted @ 2024-05-08 09:14  干炸小黄鱼  阅读(105)  评论(0编辑  收藏  举报