登录
首页 >  Golang >  Go问答

使用 client-go 模拟“kubectl wait”等待 Pod 就绪

来源:stackoverflow

时间:2024-03-23 14:33:31 101浏览 收藏

使用 client-go 模拟“kubectl wait”等待 Pod 就绪时,可以使用 List(...) 根据字段选择器列出 Pod,然后使用 Watch(...) 监视 Pod 的状态。这种方法与 kubectl 的工作方式类似,它允许根据选择器查找 Pod,并阻塞直到 Pod 处于“就绪”状态。通过这种方式,可以避免使用睡眠进行轮询,并确保代码在 Pod 就绪后立即继续执行。

问题内容

在 bash 脚本中,我通常使用“kubectl wait”来阻塞,直到某个 pod 资源准备就绪,例如与此类似的东西:

kubectl wait --for=condition=Ready --timeout=2m -n mynamespace pod -l myselector

这很有效,因为很多时候我不知道需要等待的 pod 的确切名称,而“kubectl wait”允许我根据选择器找到 pod,然后阻塞直到它准备好。

现在我需要在 golang 代码中做类似的事情。我见过使用 client-go 库进行身份验证并按名称“获取”特定 pod 的示例。但我有一些关于如何最好地使这个示例适应我的需要的问题......

  1. 我不知道能够“get()”它的 pod 的确切/全名,这就是为什么“kubectl wait”非常完美,因为它允许我使用选择器找到 pod。我认为我应该使用 client-go 库来执行 corev1().pods().list() 调用而不是 get() 以便允许我使用选择器找到我想要的 pod?

  2. 此外,pod 可能不会立即存在,可能仅在 1 分钟左右后创建,这是“kubectl wait”为我处理的。在代码中,我是否需要循环/睡眠并继续执行 list() 直到 pod 存在?

  3. 与 #2 类似的问题...一旦 list() 返回 pod 名称,golang 中“等待”该 pod 处于“就绪”状态的最佳方法是什么?如果可以避免的话,我不想对睡眠进行任何丑陋的民意调查......那么有没有更好的选择使用 golang 'wait' 包或类似的?你有什么推荐?


解决方案


按照 kubectl 的方式做怎么样?基本上,使用 List(...) 基于字段选择器列出,然后使用 Watch(...)

片段:

...
        // List with a name field selector to get the current resourceVersion to watch from (not the object's resourceVersion)
        gottenObjList, err := o.DynamicClient.Resource(info.Mapping.Resource).Namespace(info.Namespace).List(context.TODO(), metav1.ListOptions{FieldSelector: nameSelector})
        if apierrors.IsNotFound(err) {
            return info.Object, true, nil
        }
        if err != nil {
            // TODO this could do something slightly fancier if we wish
            return info.Object, false, err
        }
        if len(gottenObjList.Items) != 1 {
            return info.Object, true, nil
        }
        gottenObj := &gottenObjList.Items[0]
        resourceLocation := ResourceLocation{
            GroupResource: info.Mapping.Resource.GroupResource(),
            Namespace:     gottenObj.GetNamespace(),
            Name:          gottenObj.GetName(),
        }
        if uid, ok := o.UIDMap[resourceLocation]; ok {
            if gottenObj.GetUID() != uid {
                return gottenObj, true, nil
            }
        }

        watchOptions := metav1.ListOptions{}
        watchOptions.FieldSelector = nameSelector
        watchOptions.ResourceVersion = gottenObjList.GetResourceVersion()
        objWatch, err := o.DynamicClient.Resource(info.Mapping.Resource).Namespace(info.Namespace).Watch(context.TODO(), watchOptions)
        if err != nil {
            return gottenObj, false, err
        }
...

✌️

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>