当前位置: 首页 > 后端技术 > Python

pythonkubernetesgetpodcpuoccupancy

时间:2023-03-26 18:33:31 Python

本教程使用kubernetespythonclientsdk获取podcpuoccupancy而不是kubectl命令!kubernetespython客户端sdk动机我想做什么?最近有个pod是rabbitmq的consumer,但是会经常卡,所以需要判断pod是否卡死,然后重启。通过一般的健康检查无法找出这种判断的依据:如果CPU使用配额低于20m,则认为卡住了,删除pod(删除pod后,k8s会创建一个新的)。技术方案一:使用shell+kubectl。但是我不喜欢shell,也不喜欢解析非结构化输出,所以这个方案排除了方案二:使用python+kubernetessdk。我喜欢python,这个可以输出结构化的数据结构,比如json,方便我解析,不错,所以我用的是第二种方案!获取一个“命名空间”下的所有pod首先,我们需要列出一个命名空间下的所有pod,类似于kubectlgetpod-nvddbvddb是命名空间的名称fromkubernetes.client.models.v1_podimportV1Podfromkubernetes.client.models.v1_pod_listimportV1PodListfromkubernetes.client.models.v1_object_metaimportV1ObjectMetafromkubernetes导入客户端,configfromkubernetes.clientimportApiClientfromkubernetes.client.restimportRESTResponsefromloguruimportloggerconfig.load_kube_config()v1=client.CoreV1Api()namespaced_name='vddb'pod_list:V1PodList=v1.list_namespaced_pod(namespaced_name)forpodinpod_list.items:pod:V1Podmetadata:V1ObjectMeta=pod.metadatapod_name=metadata.name获取pod的metrics列出pod名称后,我们获取pod对应的metrics,例如使用的CPU和内存配额eta导入V1ObjectMetafromkubernetes导入客户端,configfromkubernetes.clientimportApiClientfromkubernetes.client.restimportRESTResponsefromloguruimportloggerconfig.load_kube_config()v1=client.CoreV1Api()api_client=ApiClient()namespaced_name='vddb'pod_list:V1PodList=v1.list_namespaced_pod(namespaced_name)forpodinpod_list.items:pod:V1Podmetadata:V1ObjectMeta=pod.metadatapod_name=metadata.namerest_response:RESTResponse=api_client.request(url=api_client.configuration.host+f'/apis/metrics.k8s.io/v1beta1/namespaces/{namespaced_name}/pods/{pod_name}',method='GET')_data:str=rest_response.datadata:dict=json.loads(_data)_cpu:str=data['containers'][0]['usage']['cpu']cpu=int(int(_cpu.removesuffix('n'))/1000/1000)响应体的格式如下所示:{"kind":"PodMetrics","apiVersion":"metrics.k8s.io/v1beta1","metadata":{"name&quOT;:“svddb-servixxxxxxxxxxxxxxx4b4-bzs84”,“命名空间”:“vddb”,“selfLink”:“/apis/metrics.k8s.io/v1beta1/namespaces/vddb/pods/svddbxxxxxxxxxxxxxxxx-bzs84”,“creationTimestamp”:“2022-12-16T14:40:46Z”},“时间戳”:“2022-12-16T14:40:09Z”,“窗口”:“30s”,“容器”:[{“名称”:“svdxxxxxxxxrators”,"usage":{"cpu":"2575748239n","memory":"1257180Ki"}}]}注意,这里的容器是一个列表删除podimportjsonfromkubernetes.client.models.v1_podimportV1Podfromkubernetes.client.models.v1_pod_listimportV1PodListfromkubernetes.client.models.v1_object_metaimportV1ObjectMetafromkubernetesimportclient,configfromkubernetes.clientimportApiClientfromkubernetes.client.restimportRESTResponsefromloguruimportloggerconfig.load_kube_config()v1=client.CoreV1Api()api_client=ApiClient()namespaced_name='vddb'pod_list:V1PodList=v1.list_namespaced_pod(namespaced_name)forpodinpod_list.items:pod:V1Podmetadata:V1ObjectMeta=pod.metadatapod_name=metadata.namerest_response:RESTResponse=api_client.request(url=api_client.configuration.host+f'/apis/metrics.k8s.io/v1beta1/namespaces/{namespaced_name}/pods/{pod_name}',method='GET')_data:str=rest_response.data数据:dict=json.loads(_data)_cpu:str=data['containers'][0]['usage']['cpu']cpu=int(int(_cpu.removesuffix('n'))/1000/1000)if'svddb-service-generators-server-prod'inpod_nameandcpu<20:v1.delete_namespaced_pod(pod_name,namespaced_name)参考教程:通过集群配置获取cpu和内存使用情况库支持“kubectltoppod”api?https://kubernetes.io/docs/tasks/debug/debug-cluster/resource-metrics-pipeline/