问题描述
我正在尝试使用 Kubernetes client-go 访问集群中的 pod 详细信息。
我想用它来获取在一个特定命名空间中运行的 Pod 的详细信息,类似于 kubectl get pods -n <my namespace>
。
我想要的详细信息是 pod 的名称、状态、就绪、重启和年龄。
我如何获得这些数据?
解决方法
因此,我编写了一个函数,该函数接收 Kubernetes 客户端(有关创建客户端的详细信息,请参阅 client-go)和一个命名空间并返回所有可用的 pod-
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
}
获取所有 Pod 后,我使用循环遍历每个 Pod 内的所有 Pod 和容器,并手动获取我需要的所有数据-
// 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,containerReady)
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>
时获得的完全相同的数据。