Kubernetes将客户端api用于特定pod的日志

时间:2015-10-07 03:19:18

标签: kubernetes

我正在使用kube go客户端和kube api来访问kube数据。我目前没有找到任何api调用特定pod的日志。

kubectl logs pod-name

返回特定pod的日志。如何使用go客户端执行此操作? 我正在使用kubernetes的v1.0.6。

我可以使用

获取pod
client.Pods("namespace").Get("pod-name")

2 个答案:

答案 0 :(得分:20)

在了解如何使用客户端库时,查看kubectl如何实现其命令会很有帮助。在这种情况下,kubectl's implementation of the logs command看起来像这样:

req := client.RESTClient.Get().
    Namespace(namespace).
    Name(podID).
    Resource("pods").
    SubResource("log").
    Param("follow", strconv.FormatBool(logOptions.Follow)).
    Param("container", logOptions.Container).
    Param("previous", strconv.FormatBool(logOptions.Previous)).
    Param("timestamps", strconv.FormatBool(logOptions.Timestamps))

if logOptions.SinceSeconds != nil {
    req.Param("sinceSeconds", strconv.FormatInt(*logOptions.SinceSeconds, 10))
}
if logOptions.SinceTime != nil {
    req.Param("sinceTime", logOptions.SinceTime.Format(time.RFC3339))
}
if logOptions.LimitBytes != nil {
    req.Param("limitBytes", strconv.FormatInt(*logOptions.LimitBytes, 10))
}
if logOptions.TailLines != nil {
    req.Param("tailLines", strconv.FormatInt(*logOptions.TailLines, 10))
}
readCloser, err := req.Stream()
if err != nil {
    return err
}

defer readCloser.Close()
_, err = io.Copy(out, readCloser)
return err

答案 1 :(得分:0)

type Pipe struct {
    InReader  *io.PipeReader
    InWriter  *io.PipeWriter
    OutReader *io.PipeReader
    OutWriter *io.PipeWriter
}


req := client.RESTClient().Get().Resource("pods").
    Name(option.Name).Namespace(option.Namespace).SubResource("log")

opt := &coreV1.PodLogOptions{
    Follow:       option.Follow,
    Previous:     option.Previous,
    SinceSeconds: option.SinceSeconds,
    Timestamps:   option.Timestamps,
    TailLines:    option.TailLines,
    LimitBytes:   option.LimitBytes,
}
if option.Container != "" {
    opt.Container = option.Container
}

req.VersionedParams(
    opt,
    scheme.ParameterCodec,
)

exec, err := remotecommand.NewSPDYExecutor(k.cli.kubeConfig, http.MethodGet, req.URL())
if err != nil {
    return err
}

err = exec.Stream(remotecommand.StreamOptions{
    Stdin:  pipe.InReader,
    Stdout: pipe.OutWriter,
    Stderr: pipe.OutWriter,
    Tty:    true,
})
if err != nil {
    return err
}
return nil