记录一下 python和k8s交互方式,涵盖配置/configmap/ingress/pod/deployment/serivce等;
- 封装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() |
| ) |
| |
| |
- 定义一个方法替换模板, 生成上述方法中的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 |
- 调用示例:
| 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) |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步