【问题标题】:Watch kubernetes pod status to be completed in client-go在client-go中观察kubernetes pod状态是否完成
【发布时间】:2019-03-05 03:50:11
【问题描述】:

我正在 k8 client go 中创建一个 pod,并制作一个手表以在 pod 完成时收到通知,以便我可以读取 pod 的日志。手表界面似乎没有提供频道上的任何事件。这是代码,我将如何收到 Pod 状态现已完成并准备好读取日志的通知

func readLogs(clientset *kubernetes.Clientset) {
// namespace := "default"
// label := "cithu"
var (
    pod *v1.Pod
    // watchface watch.Interface
    err error
)
// returns a pod after creation

pod, err = createPod(clientset)
fmt.Println(pod.Name, pod.Status, err)

if watchface, err = clientset.CoreV1().Pods(namespace).Watch(metav1.ListOptions{
    LabelSelector: pod.Name,
}); err != nil {
    log.Fatalf(err.Error())
}

// How do I get notified when the pod.Status == completed
}

【问题讨论】:

    标签: kubernetes kubernetes-pod kubernetes-go-client


    【解决方案1】:

    可以使用以下 sn-p 列出事件。然后,您可以根据需要处理 pod 事件。

    label := ""
    for k := range pod.GetLabels() {
        label = k
        break
    }
    watch, err := clientset.CoreV1().Pods(namespace).Watch(metav1.ListOptions{
        LabelSelector: label,
    })
    if err != nil {
        log.Fatal(err.Error())
    }
    go func() {
        for event := range watch.ResultChan() {
            fmt.Printf("Type: %v\n", event.Type)
            p, ok := event.Object.(*v1.Pod)
            if !ok {
                log.Fatal("unexpected type")
            }
            fmt.Println(p.Status.ContainerStatuses)
            fmt.Println(p.Status.Phase)
        }
    }()
    time.Sleep(5 * time.Second)
    

    【讨论】:

    • fmt.Println(p.Status.Phase) 不会显示 COMPLETED 状态,当所有容器都像 kubectl get pods -w 一样停止在一个 pod 中时。
    【解决方案2】:

    你可以一直循环检查 pod 状态,只要状态变为成功,你就完成了

    for {
        pod, _ := clientset.CoreV1().Pods(Namespace).Get(podName, metav1.GetOptions{})
        if pod.Status.Phase != corev1.PodPending {
            break
        }
    }
    pod, _ := clientset.CoreV1().Pods(corev1.NamespaceDefault).Get(podName, metav1.GetOptions{})
    if pod.Status.Phase != corev1.PodSucceeded {
        return false, fmt.Errorf("Pod did not succeed/complete")
    }
    return true, nil
    

    【讨论】:

      猜你喜欢
      • 2020-11-22
      • 2019-05-20
      • 2020-09-30
      • 2019-08-06
      • 1970-01-01
      • 2019-12-09
      • 1970-01-01
      • 1970-01-01
      • 2016-01-04
      相关资源
      最近更新 更多