如何通过python客户端获取kubernetes中的pod的日志和描述

时间:2019-05-14 06:36:06

标签: python kubernetes

我想通过python客户端在kubernetes中获取日志并描述我的Pod。在kubernetes集群中,我们可以使用

kubectl logs <NAME_OF_POD>
kubectl describe pods <NAME_OF_pod>

但是我想在kubernetes的python客户端中使用这些命令。我该怎么办?

4 个答案:

答案 0 :(得分:2)

您可以使用以下代码读取容器的日志:

from kubernetes.client.rest import ApiException
from kubernetes import client, config

config.load_kube_config()
pod_name = "counter"
try:
    api_instance = client.CoreV1Api()
    api_response = api_instance.read_namespaced_pod_log(name=pod_name, namespace='default')
    print(api_response)
except ApiException as e:
    print('Found exception in reading the logs')

上面的代码非常适合获取pod的日志。

要获取kubectl describe pod的输出,提供的所有信息都在read_namespaced_pod函数中。它具有您需要的所有信息,您可以以任何需要的方式使用该信息。您可以编辑上面的代码,并使用read_namespaced_pod代替read_namespaced_pod_log来获取信息。

答案 1 :(得分:2)

由于Kubernetes使用REST API,因此您可以通过python调用日志和对象描述。

首先,您需要找出您的授权机制。您可以根据自己的集群找到它。

kubectl config view --raw

然后,您可以使用此auth方法创建api调用。在下面的示例中,我使用了基本身份验证来获取例如pod日志。

import json
import requests
from requests.auth import HTTPBasicAuth
user='admin'
password='password'
url='https://cluster-api-url/api/v1/namespaces/default/pods/nginx-ingress-controller-7bbcbdcf7f-dgr57/log'

requests.packages.urllib3.disable_warnings()
resp = requests.get(url, auth=HTTPBasicAuth(user, password), verify=False, json=False)
print(resp.text)

要轻松获取url,请输入带有“ --v = 8”参数的命令。例如获取用于描述广告连播的网址

kubectl describe pod nginx-ingress-controller-7bbcbdcf7f-dgr57 --v=8

并检查实际输出的上方部分

I0514 12:31:42.376972  216066 round_trippers.go:383] GET https://cluster-api-url/api/v1/namespaces/default/events?fieldSelector=involvedObject.namespace%3Ddefault%2CinvolvedObject.uid%3D1ad92455-7589-11e9-8dc1-02a3436401b6%2CinvolvedObject.name%3Dnginx-ingress-controller-7bbcbdcf7f-dgr57
I0514 12:31:42.377026  216066 round_trippers.go:390] Request Headers:
I0514 12:31:42.377057  216066 round_trippers.go:393]     Accept: application/json, */*
I0514 12:31:42.377074  216066 round_trippers.go:393]     Authorization: Basic YWRtaW46elRoYUJoZDBUYm1FbGpzbjRtYXZ2N1hqRWlvRkJlQmo=
I0514 12:31:42.377090  216066 round_trippers.go:393]     User-Agent: kubectl/v1.12.0 (linux/amd64) kubernetes/0ed3388

GET https://<URL>部分复制URL,并在python脚本中用url进行更改,然后就可以了。

希望有帮助

答案 2 :(得分:0)

您需要探索https://github.com/kubernetes-client/python K8s官方Python客户端。

但是我找不到符合您要求的任何特定文档。我认为,下面的链接是起点,

https://github.com/kubernetes-client/python/blob/master/kubernetes/README.md

尝试对对象执行dir并查看可用方法。例如下面的自述文件中的代码

from kubernetes import client, config

# Configs can be set in Configuration class directly or using helper utility
config.load_kube_config()

v1 = client.CoreV1Api()
print("Listing pods with their IPs:")
ret = v1.list_pod_for_all_namespaces(watch=False)
for i in ret.items:
    print("%s\t%s\t%s" % (i.status.pod_ip, i.metadata.namespace, i.metadata.name)) 

执行dir(v1)dir(ret)并查看方法/变量等。或者可以使用list*方法为您提供在kubectl describe pod <name>中看到的详细信息

答案 3 :(得分:0)

这些答案都不返回命名空间pod的事件,该事件在运行kubectl describe时默认给定。要获取给定pod的命名空间事件,请运行:

from kubernetes import client, config
config.load_kube_config()
v1 = client.CoreV1Api()
out = kube.core_api.list_namespaced_event(namespace, field_selector=f'involvedObject.name={pod_name}')

其中namespace是感兴趣的命名空间,pod_name是您感兴趣的pod。

在生成Pod并向用户提供有关Pod当前状态的合理状态报告以及调试Pod的状态(如果它无法进行到“待处理”之前)时,我需要这样做。