kubernetes python API read_namespaced_pod_log返回HTTP 400,并带有pod log异常

zc0qhyus  于 2023-06-07  发布在  Python
关注(0)|答案(1)|浏览(167)

我正在尝试使用Kubernetes python库获取pod日志。我在minikube上测试,我已经添加了配置。assert_hostname = False
使用的API为:read_namespaced_pod_log
下面是一个示例代码:

#!/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:
                                pod_log = json.loads(k8sapi.read_namespaced_pod_log(name=pod_name, container=container, namespace=pod_ns, _preload_content=False).data)
                                #print(pod_log)
                                #print(pod_log)
                        except Exception as e:
                                #print("error_log: "+ str(e))
                                print("this is error")
                        #print(pod_log)
        print("-------")
        #print(pod_log)

响应中返回异常错误:

Traceback (most recent call last):
  File "/Users/gv/chatgpt_k8s/scripts/./chatgptk8s_monitor.py", line 26, in <module>
    pod_log = json.loads(k8sapi.read_namespaced_pod_log(name=pod_name, container=container, namespace=pod_ns, _preload_content=False).data)
  File "/Users/gv/Library/Python/3.9/lib/python/site-packages/kubernetes/client/api/core_v1_api.py", line 23747, in read_namespaced_pod_log
    return self.read_namespaced_pod_log_with_http_info(name, namespace, **kwargs)  # noqa: E501
  File "/Users/gv/Library/Python/3.9/lib/python/site-packages/kubernetes/client/api/core_v1_api.py", line 23866, in read_namespaced_pod_log_with_http_info
    return self.api_client.call_api(
  File "/Users/gv/Library/Python/3.9/lib/python/site-packages/kubernetes/client/api_client.py", line 348, in call_api
    return self.__call_api(resource_path, method,
  File "/Users/gv/Library/Python/3.9/lib/python/site-packages/kubernetes/client/api_client.py", line 180, in __call_api
    response_data = self.request(
  File "/Users/gv/Library/Python/3.9/lib/python/site-packages/kubernetes/client/api_client.py", line 373, in request
    return self.rest_client.GET(url,
  File "/Users/gv/Library/Python/3.9/lib/python/site-packages/kubernetes/client/rest.py", line 241, in GET
    return self.request("GET", url,
  File "/Users/gv/Library/Python/3.9/lib/python/site-packages/kubernetes/client/rest.py", line 235, in request
    raise ApiException(http_resp=r)
kubernetes.client.exceptions.ApiException: (400)
Reason: Bad Request
HTTP response headers: HTTPHeaderDict({'Audit-Id': '9ea1de46-a89a-4c34-9ad3-c944f3ce9960', 'Cache-Control': 'no-cache, private', 'Content-Type': 'application/json', 'Date': 'Sun, 04 Jun 2023 19:06:36 GMT', 'Content-Length': '418'})
HTTP response body: b'{"kind":"Status","apiVersion":"v1","metadata":{},"status":"Failure","message":"container {\'name\': \'nginx\', \'state\': {\'waiting\': {\'reason\': \'ImagePullBackOff\', \'message\': \'Back-off pulling image \\"nginx:laterror\\"\'}}, \'lastState\': {}, \'ready\': False, \'restartCount\': 0, \'image\': \'nginx:laterror\', \'imageID\': \'\', \'started\': False} is not valid for pod nginx-deployment-cb99699bc-7jr98","reason":"BadRequest","code":400}\n'
qoefvg9y

qoefvg9y1#

在此呼叫中:

pod_log = json.loads(
    k8sapi.read_namespaced_pod_log(
        name=pod_name, container=container, namespace=pod_ns, _preload_content=False
    ).data
)

container参数的值应该是pod中需要日志的容器的名称,但在代码中,container是由该循环创建的结构化变量:

for container in pod_details["status"]["containerStatuses"]:

您可能需要:

pod_log = json.loads(
    k8sapi.read_namespaced_pod_log(
        name=pod_name, container=container['name'], namespace=pod_ns, _preload_content=False
    ).data
)

在我的代码中有一个错别字,因为你正在使用_preload_content=False,而我通常不这样做。
您的except Exception as e对您隐藏了错误消息;如果您要打印出异常消息,这将是显而易见的。
我已经更正了密码。您会发现有一个新的错误,因为read_namespaced_pod_log方法返回的.data属性不包含JSON数据;你可能会想要:

pod_log = k8sapi.read_namespaced_pod_log(
    name=pod_name, container=container["name"], namespace=pod_ns, _preload_content=False
).data

相关问题