使用Kubernetes Python API读取Pod日志时返回HTTP 400错误
问题排查与解决
错误原因分析
从异常返回的响应体可明确定位问题:
"message":"container {'name': 'nginx', ...} is not valid for pod nginx-deployment-cb99699bc-7jr98"
调用read_namespaced_pod_log接口时,container参数传入了完整的容器状态字典,但接口要求的是容器名称字符串。代码中for container in pod_details["status"]["containerStatuses"]循环里,container变量是包含name、state等字段的字典对象,直接传入接口导致Kubernetes API无法识别。
修复后的代码
修改循环内的参数传递,将container替换为container["name"],同时注意Pod日志为纯文本格式,无需用json.loads解析:
#!/usr/bin/python3 import requests import json from kubernetes import client, config from kubernetes.client import configuration from kubernetes.stream import stream config.load_kube_config() configuration.assert_hostname = False k8sapi = client.CoreV1Api() resp_obj = k8sapi.list_pod_for_all_namespaces( watch=False, _preload_content=False ) pods_all = json.loads(resp_obj.data) for pod in pods_all["items"]: pod_name = pod["metadata"]["name"] pod_ns = pod["metadata"]["namespace"] pod_details = json.loads((k8sapi.read_namespaced_pod(name=pod_name, namespace=pod_ns, _preload_content=False)).data) for container in pod_details["status"]["containerStatuses"]: if "waiting" in container["state"]: try: # 传入容器名称而非整个字典,日志为纯文本无需JSON解析 pod_log = k8sapi.read_namespaced_pod_log( name=pod_name, container=container["name"], namespace=pod_ns, _preload_content=False ).data print(f"Pod {pod_name} 容器 {container['name']} 日志:\n{pod_log}") except Exception as e: print(f"获取日志失败: {str(e)}") print("-------")
额外说明
read_namespaced_pod_log返回的日志内容是纯文本形式,即使容器处于启动失败状态,日志也是文本格式的错误信息,直接使用返回的data即可。- 容器处于
ImagePullBackOff状态时,日志会包含镜像拉取失败的详细信息,可辅助进一步排查问题。
内容的提问来源于stack exchange,提问作者3br10ee032
相关产品推荐
相关产品推荐

