我想通过python客户端在kubernetes中获取日志并描述我的Pod。在kubernetes集群中,我们可以使用
kubectl logs <NAME_OF_POD>
kubectl describe pods <NAME_OF_pod>
但是我想在kubernetes的python客户端中使用这些命令。我该怎么办?
答案 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的状态(如果它无法进行到“待处理”之前)时,我需要这样做。