如何从集群内客户端访问api调用中从kubectl描述pod <namespace>中获取所有数据

I need to grab some pod information which will be used for some unit tests which will be run in-cluster. I need all the information which kubectl describe po gives but from an in cluster api call.

I have some working code which makes an api call to apis/metrics.k8s.io/v1beta1/pods, and have installed the metrics-server on minikube for testing which is all working and gives me output like this:

Namespace: kube-system
Pod name: heapster-rgnlj
SelfLink: /apis/metrics.k8s.io/v1beta1/namespaces/kube-system/pods/heapster-rgnlj
CreationTimestamp: 2019-09-10 12:27:13 +0000 UTC
Window: 30s
Timestamp: 2019-09-10 12:26:23 +0000 UTC
Name: heapster
Cpu usage: 82166n
Mem usage: 19420Ki 
...
func getMetrics(clientset *kubernetes.Clientset, pods *PodMetricsList) error {
    data, err := clientset.RESTClient().Get().AbsPath("apis/metrics.k8s.io/v1beta1/pods").DoRaw()
    if err != nil {
        return err
    }
    err = json.Unmarshal(data, &pods)
    return err
}

func main() {

    config, err := rest.InClusterConfig()
    if err != nil {
        fmt.Println(err)
    }
    // creates the clientset
    clientset, err := kubernetes.NewForConfig(config)
    if err != nil {
        fmt.Println(err)
    }
    var pods PodMetricsList
    err = getMetrics(clientset, &pods)
    if err != nil {
        fmt.Println(err)
    }

    for _, m := range pods.Items {

        fmt.Print("Namespace: ", m.Metadata.Namespace, "
", "Pod name: ", m.Metadata.Name, "
", )
        fmt.Print("SelfLink: ", m.Metadata.SelfLink, "
", "CreationTimestamp: ", m.Metadata.CreationTimestamp, "
", )
        fmt.Print("Window: ", m.Window, "
", "Timestamp: ", m.Timestamp, "
", )

        for _, c := range m.Containers {
            fmt.Println("Name:", c.Name)
            fmt.Println("Cpu usage:", c.Usage.CPU)
            fmt.Println("Mem usage:", c.Usage.Memory, "
")
...

As I say, what i really need is what you'd get with a 'describe pods' type call. Having looked through the kubernetes source this NodeDescriber looks like the right type of function, but I'm slightly at a loss as to how to integrate / implement it to get the desired results.

kubernetes/pkg/printers/internalversion/describe.go

Line 2451 in 4f2d7b9

func (d *NodeDescriber) Describe(namespace, name string, describerSettings...etc)

I'm new to Go and not particularly familiar with kubernetes. Any pointers as to how to go about it would be greatly appreciated.

2个回答

Looking at the describePod and Describe funcs from staging/src/k8s.io/kubectl/pkg/describe/versioned/describe.go should give you a better picture of how to do this. And since Describe and PodDescriber are public, you can reuse these for your use case.

You could couple this with a CoreV1Client which has a Pods func, that returns a PodInterface that has a List func which would return a list of Pod objects for the given namespace.

Those pod objects will provide the Name needed for the Describe func, the Namespace is already known, and the describe.DescriberSettings is just a struct type that you could inline to enable showing events in the Describe output.

Using the List func will only list the pods that one time. If you're interested in having this list be updated regularly, you might want to look at the Reflector and Informer patterns; both of which are largely implemented in the tools/cache package, and the docs briefly explain this concept in the Efficient detection of changes section.

Hope this helps.

dthy81285
dthy81285 感谢您的指导,我将深入研究并试一试。 有工作的时候我会报告。 干杯
大约一年之前 回复



我没有尝试过,但我建议从以下开始:</ p>

1。</ strong>使用带有--verbosity选项的kubectl查看完整的api请求</ p>

  kubectl描述pod xxx -v = 8 
</ code> </ pre >

,例如:</ p>

  GET https://xx.xx.xx.xx:6443 / api / v1 / namespaces / default / events?fieldSelector  = involvedObject.uid%3Ddd77c4aa-28e6-4bf0-8dfe-0d8610cbe9c9%2CinvolvedObject.name%3Dmy-app%2CinvolvedObject.namespace%3Ddefault 
</ code> </ pre>

它包含与以下内容相关的字段 您的POD: fieldSelector = involvedObject.uid,涉及的Object.name,涉及的Object.namespace </ strong> </ p>

2。</ strong>。我觉得这是一个好的开始 是来自github func describePod <的代码 / a>开始。</ p>

希望获得帮助。</ p>
</ div>

展开原文

原文

I didn't try, but I would suggest to start with:

1. using kubectl with --verbosity option to see the full api request

 kubectl describe pod xxx -v=8 

like:

  GET https://xx.xx.xx.xx:6443/api/v1/namespaces/default/events?fieldSelector=involvedObject.uid%3Ddd77c4aa-28e6-4bf0-8dfe-0d8610cbe9c9%2CinvolvedObject.name%3Dmy-app%2CinvolvedObject.namespace%3Ddefault

It contains fields related to your POD: fieldSelector=involvedObject.uid, involvedObject.name, involvedObject.namespace

2. I thing the good start it will be the code from github func describePod to start with.

Hope this help.

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐