我正在寻找如何使用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)
Run Code Online (Sandbox Code Playgroud)
请分享当今如何获取pod的日志。任何建议,将不胜感激!
更新:Kubernetes go客户端api中提供的用于特定Pod日志的解决方案已过时。它有一些技巧,但是不是最新的库。
这是我们最终使用client-go库的结果:
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
}
Run Code Online (Sandbox Code Playgroud)
希望对您有所帮助。请分享您对如何从Kubernetes的吊舱中获取日志的想法或解决方案。
小智 7
如果你想读入流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
}
Run Code Online (Sandbox Code Playgroud)