1 pod自动更新
k8s的list-watch机制使得k8s的资源可以实现动态更改。
import os, sys, djangoimport loggingpwd = os.path.dirname(os.path.dirname(os.path.dirname(os.path.realpath(__file__))))sys.path.append(pwd)os.environ.setdefault("DJANGO_SETTINGS_MODULE", "devops_backend.settings")django.setup()from kubernetes import client, watchfrom cmdb import models as cmdb_modelslogger = logging.getLogger(__name__)class ClientKubernetes(object):def __init__(self, apitoken, apiserverUrl):"""method one: copy ~/.kube/config to local~/.kube then do the followingconfig.load_kube_config()self.client = client.CoreV1Api()method two: as you can see in below"""ApiToken = "****"configuration = client.Configuration()setattr(configuration, 'verify_ssl', False)client.Configuration.set_default(configuration)configuration.host = apiserverUrl# configuration.verify_ssl = False# configuration.debug = Trueconfiguration.api_key = {"authorization": "Bearer " + apitoken}client.Configuration.set_default(configuration)self.clientInstance = client.CoreV1Api(client.ApiClient(configuration))self.clientIngress = client.ExtensionsV1beta1Api()self.apis_api = client.AppsV1Api()def get_pod_for_all_namesapces(self):"""一共有5个属性api_version,kind,metadata,spec,status先暂时取出status属性:return:"""result = self.clientInstance.list_pod_for_all_namespaces(watch=False)temp_result = []count = 0for item in result.items:count += 1item_dict = item.to_dict()print(item_dict)temp_result.append({'podname': item_dict['metadata']['name'], 'kind': item_dict['kind'],'annotations': item_dict['metadata']['annotations'],'cluster_name': item_dict['metadata']['cluster_name'],'labels': item_dict['metadata']['labels'],'namespace': item_dict['metadata']['namespace']})breakreturn {'pod': temp_result, 'podcount': count}def get_deployment_pods(self, namespace):"""获取deployment所有的pod"""if namespace:result = self.apis_api.list_namespaced_deployment(namespace=namespace).to_dict()else:result = self.apis_api.list_deployment_for_all_namespaces().to_dict()temp_result = []count = 0for item in result["items"]:# print(item)name = item['metadata']['name']namespace = item['metadata']['namespace']replicas = item['spec']['replicas']selector = item['spec']['selector']temp_result.append({'name': name, 'namespace': namespace, 'replicas': replicas, 'selector': selector})count += 1return {'podcount': count, 'pod': temp_result}def get_statefulset_pods(self, namespace):"""获取所有的statefulset 所有的pod"""if namespace:result = self.apis_api.list_namespaced_stateful_set(namespace=namespace).to_dict()else:result = self.apis_api.list_stateful_set_for_all_namespaces().to_dict()temp_result = []count = 0for item in result["items"]:name = item['metadata']['name']namespace = item['metadata']['namespace']replicas = item['spec']['replicas']selector = item['spec']['selector']temp_result.append({'name': name, 'namespace': namespace, 'replicas': replicas, 'selector': selector})count += 1return {'podcount': count, 'pod': temp_result}def get_daemonset_pods(self, namespace):"""获取所有的daemonset"""if namespace:result = self.apis_api.list_namespaced_daemon_set(namespace=namespace).to_dict()else:result = self.apis_api.list_daemon_set_for_all_namespaces().to_dict()temp_result = []count = 0for item in result["items"]:name = item['metadata']['name']namespace = item['metadata']['namespace']selector = item['spec']['selector']temp_result.append({'name': name, 'namespace': namespace, 'selector': selector})count += 1return {'podcount': count, 'pod': temp_result}def get_all_namespace(self):"""获取所有的namespace"""result = self.clientInstance.list_namespace().to_dict()temp_result = []for item in result['items']:name = item['metadata']['name']creation_timestamp = item['metadata']['creation_timestamp']labels = item['metadata']['labels']status = item['status']['phase']temp_result.append({'name': name, 'creation_timestamp': creation_timestamp, 'labels': labels, 'status': status})return temp_resultdef get_all_service(self, namespace):"""获取所有的service"""if namespace:result = self.clientInstance.list_namespaced_service(namespace=namespace)else:result = self.clientInstance.list_service_for_all_namespaces().to_dict()temp_result = []count = 0for item in result['items']:name = item['metadata']['name']labels = item['metadata']['labels']namespace = item['metadata']['namespace']cluster_ip = item['spec']['cluster_ip']ports = item['spec']['ports']temp_result.append({'name': name, 'labels': labels, 'namespace': namespace, 'cluster_ip': cluster_ip, 'ports': ports})count += 1return {'podcount': count, 'pod': temp_result}def get_all_ingress(self, namespace):"""获取所有的ingress"""if namespace:result = self.clientIngress.list_namespaced_ingress(namespace=namespace).to_dict()else:result = self.clientIngress.list_ingress_for_all_namespaces().to_dict()temp_result = []count = 0for item in result['items']:name = item['metadata']['name']namespace = item['metadata']['namespace']rules = item['spec']['rules']tls = item['spec']['tls']temp_result.append({'name': name, 'rules': rules, 'namespace': namespace, 'tls': tls})count += 1return {'podcount': count, 'pod': temp_result}def get_all_node(self):"""获取集群所有的节点"""result = self.clientInstance.list_node().to_dict()temp_result = []count = 0for item in result['items']:name = item['metadata']['name']labels = item['metadata']['labels']pod_cidr = item['spec']['pod_cidr']taints = item['spec']['taints']temp_result.append({'name': name, 'labels': labels, 'pod_cidr': pod_cidr, 'taints': taints})count += 1return {'nodecount': count, 'node': temp_result}def watch_kubernetes_resouce(self):w = watch.Watch()for event in w.stream(self.apis_api.list_namespaced_deployment, namespace='kube-system'):print(event)print(type(event))def get_all_pod_watch(self, clusterId):""""""w = watch.Watch()for event in w.stream(self.apis_api.list_namespaced_deployment, namespace='kube-system'):result_type = event.get('type')result_object = event.get('object').to_dict()result_api_version = result_object.get('api_version')result_kind = result_object.get('kind')metadata = result_object.get('metadata')podname = metadata.get('name')namespace = metadata.get('namespace')status = result_object.get('status')logger.info(f"result_type: {result_type}, result_api_version: {result_api_version}, result_kind: {result_kind}, podname: {podname}, namespace: {namespace}")cluster_obj = cmdb_models.Cluster.objects.get(id=clusterId)namespace_obj = cmdb_models.Namespace.objects.get(namespaceName=namespace, cluster=cluster_obj)filter_object = cmdb_models.KubernetesApplicationInstance.objects.filter(applicationName=podname,namespace=namespace_obj,cluster=cluster_obj)if filter_object:filter_object.update(kind=result_kind)else:cmdb_models.KubernetesApplicationInstance.objects.create(applicationName=podname, kind=result_kind,namespace=namespace_obj,cluster=cluster_obj)# w.stop()if __name__ == '__main__':apitoken = "***"apiserverUrl = "https://ip:6443"instance = ClientKubernetes(apitoken=apitoken, apiserverUrl=apiserverUrl)result = instance.get_all_pod_watch(clusterId=1)
这个程序可以单独独立出django执行
