Kubernetes go-client 列出类似于 `kubectl get pods` 的 pod 详细信息

Kubernetes go-client to list out pod details similar to `kubectl get pods`

我正在尝试使用 Kubernetes client-go 访问集群中的 pod 详细信息。

我想用它来获取特定命名空间中 pods 运行 的详细信息,类似于 kubectl get pods -n <my namespace>.

我要的是pod的namestatusreadyrestartsage

如何获取这些数据?

所以,我编写了一个函数,它接受一个 Kubernetes 客户端(请参阅客户端-go 以了解有关制作客户端的详细信息)和一个命名空间以及 returns 所有 pods 可用-

func GetPods(client *meshkitkube.Client, namespace string) (*v1core.PodList, error) {
    // Create a pod interface for the given namespace
    podInterface := client.KubeClient.CoreV1().Pods(namespace)

    // List the pods in the given namespace
    podList, err := podInterface.List(context.TODO(), v1.ListOptions{})

    if err != nil {
        return nil, err
    }
    return podList, nil
}

获取所有 pods 后,我使用循环 运行 遍历每个 pod 中的所有 pods 和容器,并手动获取我需要的所有数据-

// List all the pods similar to kubectl get pods -n <my namespace>
            for _, pod := range podList.Items {
                // Calculate the age of the pod
                podCreationTime := pod.GetCreationTimestamp()
                age := time.Since(podCreationTime.Time).Round(time.Second)

                // Get the status of each of the pods
                podStatus := pod.Status

                var containerRestarts int32
                var containerReady int
                var totalContainers int

                // If a pod has multiple containers, get the status from all
                for container := range pod.Spec.Containers {
                    containerRestarts += podStatus.ContainerStatuses[container].RestartCount
                    if podStatus.ContainerStatuses[container].Ready {
                        containerReady++
                    }
                    totalContainers++
                }

                // Get the values from the pod status
                name := pod.GetName()
                ready := fmt.Sprintf("%v/%v", containerReady, totalContainers)
                status := fmt.Sprintf("%v", podStatus.Phase)
                restarts := fmt.Sprintf("%v", containerRestarts)
                ageS := age.String()

                // Append this to data to be printed in a table
                data = append(data, []string{name, ready, status, restarts, ageS})
            }

这将产生与 运行宁 kubectl get pods -n <my namespace>.

时得到的完全相同的数据