如何使用Golang从Kubernetes获取日志?

时间:2018-12-19 13:42:57

标签: go kubernetes

我正在寻找如何使用golang从Kubernetes集群的pod中获取日志的解决方案。我看过“ https://github.com/kubernetes/client-go”和“ https://godoc.org/sigs.k8s.io/controller-runtime/pkg/client”,但不明白如何为此目的使用它们。除了日志,我在获取K8S中的Pod或任何其他对象的信息方面都没有问题。

例如,我正在使用“ https://godoc.org/sigs.k8s.io/controller-runtime/pkg/client#example-Client--Get”中的Get()来获取K8S职位信息:

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

请分享当今如何获取Pod的日志。 任何建议将不胜感激!

更新: Kubernetes go client api for log of a particular pod中提供的解决方案已过时。它有一些技巧,但不是最新的库。

5 个答案:

答案 0 :(得分:3)

这是我们最终使用客户端库的想法:

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
}

我希望它能对某人有所帮助。请分享您对如何从Kubernetes的吊舱中获取日志的想法或解决方案。

答案 1 :(得分:0)

控制器运行时客户端库尚不支持/ status以外的子资源,因此您必须使用client-go,如另一个问题所示。

答案 2 :(得分:0)

我的环境具有RBAC,我必须添加以下角色来启用您的代码。谢谢,效果很好!

  • apiGroups:
    • “” 资源:
    • 荚/日志 动词:
    • '*'

答案 3 :(得分:0)

如果您想在client-go v11.0.0+中读取流,则代码是这样的,随时可以自己创建客户端集:

func GetPodLogs(namespace string, podName string, containerName string, follow bool) error {
    count := int64(100)
    podLogOptions := v1.PodLogOptions{
        Container: containerName,
        Follow:    follow,
        TailLines: &count,
    }

    podLogRequest := clientSet.CoreV1().
        Pods(namespace).
        GetLogs(podName, &podLogOptions)
    stream, err := podLogRequest.Stream(context.TODO())
    if err != nil {
        return err
    }
    defer stream.Close()

    for {
        buf := make([]byte, 2000)
        numBytes, err := stream.Read(buf)
        if numBytes == 0 {
            continue
        }
        if err == io.EOF {
            break
        }
        if err != nil {
            return err
        }
        message := string(buf[:numBytes])
        fmt.Print(message)
    }
    return nil
}

答案 4 :(得分:-2)

@ Emixam23

我相信您会发现此片段很有用。

如何获取广告连播的动态名称?

import  metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

    labelSelector := metav1.LabelSelector{MatchLabels: map[string]string{<LABEL_KEY>: <LABEL_VALUE>}}
    listOptions := metav1.ListOptions{
        LabelSelector: labels.Set(labelSelector.MatchLabels).String(),
    }
    pod, err := k8sClient.CoreV1().Pods(<NAMESPACE>).List(listOptions)
    podName := pod.Items[0].ObjectMeta.Name