繁体   English   中英

使用 golang 在 Kube.netes 中持续观察 Pod SDK

[英]Continuously Watch Pods in Kubernetes using golang SDK

我想使用 client-go Kube.netes SDK 持续观察 Pod 的变化。我使用下面的代码来观察变化:

func (c *Client) watchPods(namespace string, restartLimit int) {
    fmt.Println("Watch Kubernetes Pods")
    watcher, err := c.Clientset.CoreV1().Pods(namespace).Watch(context.Background(),
        metav1.ListOptions{
            FieldSelector: "",
        })
    if err != nil {
        fmt.Printf("error create pod watcher: %v\n", err)
        return
    }

    for event := range watcher.ResultChan() {
        pod, ok := event.Object.(*corev1.Pod)
        if !ok || !checkValidPod(pod) {
            continue
        }
        owner := getOwnerReference(pod)
        for _, c := range pod.Status.ContainerStatuses {
            if reflect.ValueOf(c.RestartCount).Int() >= int64(restartLimit) {
                if c.State.Waiting != nil && c.State.Waiting.Reason == "CrashLoopBackOff" {
                    doSomething()
                }
                if c.State.Terminated != nil {
                    doSomethingElse()
                }
            }
        }
    }
}

该代码正在监视 Pod 的更改,但它会在一段时间后退出。 我想连续运行。 我还想知道它对 API 服务器施加了多少负载,以及运行控制循环以查找更改的最佳方法是什么。

在Watch中,与API服务器建立了长轮询连接。 建立连接后,API 服务器发送初始批事件和任何后续更改。 发生超时后连接将断开。

我建议使用 Informer 而不是设置手表,因为它更优化并且更容易设置。 在创建 informer 时,您可以注册特定的函数,这些函数将在创建、更新和删除 pod 时调用。 即使在 informers 中,您也可以使用 labelSelector 定位特定的 pod,类似于 watch。 您还可以创建共享 informers,它们在集群中的多个控制器之间共享。 这会减少 API 服务器上的负载。

以下是一些帮助您入门的链接:

  1. https://aly.arriqaaq.com/kube.netes-informers/
  2. https://www.cncf.io/blog/2019/10/15/extend-kube.netes-via-a-shared-informer/
  3. https://pkg.go.dev/k8s.io/client-go/informers

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM