簡體   English   中英

如何通過python客戶端獲取kubernetes中pod的日志和描述

[英]How to get log and describe of pods in kubernetes by python client

我想通過 python 客戶端在 kubernetes 中獲取日志和描述我的 pod。 在 kubernetes 集群中,我們可以使用

kubectl logs <NAME_OF_POD>
kubectl describe pods <NAME_OF_pod>

但是我想在 kubernetes 的 python 客戶端中使用這些命令。我該怎么辦?

您可以使用以下代碼讀取 Pod 的日志:

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來獲取信息。

由於 Kubernetes 使用 REST API,這為您提供了通過 python 調用日志和對象描述的各種可能性。

首先你需要找出你的授權機制。 您可以通過根據您的集群找到它。

kubectl config view --raw

然后您可以使用此身份驗證方法創建 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”參數的命令。 例如獲取描述 pod 的 url

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 ,然后就可以了。

希望能幫助到你

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

但我找不到任何符合您要求的特定文檔。 我認為,下面的鏈接是起點,

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

嘗試對對象執行dir並查看可用方法。 例如下面的 README 代碼

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>看到的詳細信息

這些答案都沒有返回命名空間 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 未能超越“Pending”,則調試 pod 的狀態。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM