Search code examples
gokuberneteskubectl

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


I'm trying to use the Kubernetes client-go to access pod details in a cluster.

I want to use it to get the details of pods running in one particular namespace, similar to kubectl get pods -n <my namespace>.

The details I want are the name, status, ready, restarts and age of the pod.

How can I get those data?


Solution

  • So, I wrote a function that takes in a Kubernetes client (refer the client-go for details on making one) and a namespace and returns all the pods available-

    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
    }
    

    After getting all the pods, I used a loop to run through all the pods and containers within each pod and manually got all the data I required-

    // 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})
                }
    

    This will result in the exact same data as you would get when running kubectl get pods -n <my namespace>.