3

我需要获取一些 pod 信息,这些信息将用于在集群中运行的一些单元测试。我需要 kubectl describe po 提供的所有信息,但来自集群 api 调用。

我有一些工作代码可以对 apis/metrics.k8s.io/v1beta1/pods 进行 api 调用,并在 minikube 上安装了 metrics-server 以进行测试,这些都可以正常工作并给我这样的输出:

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, "\n", "Pod name: ", m.Metadata.Name, "\n", )
        fmt.Print("SelfLink: ", m.Metadata.SelfLink, "\n", "CreationTimestamp: ", m.Metadata.CreationTimestamp, "\n", )
        fmt.Print("Window: ", m.Window, "\n", "Timestamp: ", m.Timestamp, "\n", )

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

正如我所说,我真正需要的是通过“描述 pods”类型调用获得的信息。浏览了 kubernetes 源代码后,这个 NodeDescriber 看起来像是正确的函数类型,但是对于如何集成/实现它以获得所需的结果,我有点茫然。

kubernetes/pkg/printers/internalversion/describe.go

4f2d7b9 中的第 2451 行

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

我是 Go 新手,对 Kubernetes 不是特别熟悉。任何关于如何去做的指示将不胜感激。

4

2 回答 2

3

查看staging/src/k8s.io/kubectl/pkg/describe/versioned/describe.go中的describePodDescribe函数应该可以让您更好地了解如何执行此操作。由于DescribePodDescriber是公开的,因此您可以将它们重用于您的用例。

您可以将其与具有Pods函数的CoreV1Client结合使用,它返回一个具有List函数的PodInterface ,该函数将返回给定命名空间的Pod对象列表。

这些 pod 对象将提供Describe函数所需的名称,命名空间是已知的,并且describe.DescriberSettings只是一种结构类型,您可以将其内联以在Describe输出中显示事件。

使用List函数只会列出该一次的 pod。如果您有兴趣定期更新此列表,您可能需要查看 Reflector 和 Informer 模式;两者都主要在tools/cache包中实现,文档在Efficient detection of changes部分简要解释了这个概念。

希望这可以帮助。

于 2019-09-11T11:18:47.937 回答
0

我没有尝试,但我建议从以下开始:

1.使用带有 --verbosity 选项的 kubectl 查看完整的 api 请求

 kubectl describe pod xxx -v=8 

喜欢:

  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

它包含与您的 POD 相关的字段:fieldSelector=involvedObject.uid、relatedObject.name、relatedObject.namespace

2.好的开始是来自 github func describePod的代码。

希望这有帮助。

于 2019-09-11T10:25:08.863 回答