How to get logs from kubernetes using Go?

Issue

I’m looking for the solution of how to get logs from a pod in Kubernetes cluster using Go. I’ve looked at "https://github.com/kubernetes/client-go" and "https://godoc.org/sigs.k8s.io/controller-runtime/pkg/client", but couldn’t understand how to use them for this purpose. I have no issues getting information of a pod or any other object in K8S except for logs.

For example, I’m using Get() from "https://godoc.org/sigs.k8s.io/controller-runtime/pkg/client#example-Client–Get" to get K8S job info:

found := &batchv1.Job{}
err = r.client.Get(context.TODO(), types.NamespacedName{Name: job.Name, Namespace: job.Namespace}, found)

Please share of how you get pod’s logs nowadays.
Any suggestions would be appreciated!

Update:
The solution provided in Kubernetes go client api for log of a particular pod is out of date. It have some tips, but it is not up to date with current libraries.

Solution

Here is what we came up with eventually using client-go library:

func getPodLogs(pod corev1.Pod) string {
    podLogOpts := corev1.PodLogOptions{}
    config, err := rest.InClusterConfig()
    if err != nil {
        return "error in getting config"
    }
    // creates the clientset
    clientset, err := kubernetes.NewForConfig(config)
    if err != nil {
        return "error in getting access to K8S"
    }
    req := clientset.CoreV1().Pods(pod.Namespace).GetLogs(pod.Name, &podLogOpts)
    podLogs, err := req.Stream()
    if err != nil {
        return "error in opening stream"
    }
    defer podLogs.Close()

    buf := new(bytes.Buffer)
    _, err = io.Copy(buf, podLogs)
    if err != nil {
        return "error in copy information from podLogs to buf"
    }
    str := buf.String()

    return str
}

I hope it will help someone. Please share your thoughts or solutions of how you get logs from pods in Kubernetes.

Answered By – Stepan Maksimchuk

Answer Checked By – Robin (GoLangFix Admin)

Leave a Reply

Your email address will not be published.