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 @   干炸小黄鱼  阅读(237)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示