使用LabelSelector列表窗格时如何进行分页

问题描述 投票:0回答:1

我有一个控制器可以使用 LabelSelector 列出 pod。但有时它会得到太多的豆荚。我想做分页来获取播客列表。

我需要在不使用缓存的情况下列出 pod,因为由于某种原因我无法观看和列出 pod。我尝试使用

Limit 
中的
Continue 
ListOptions
参数。当我没有添加
LabelSelector
时,我可以正常分页获取pod。添加
LabelSelector 
后,所有与
LabelSelector 
匹配的pod都会被返回,分页无效。不知道是我的使用方法不对还是客户端还不支持这个功能?

err = r.APIReader.List(ctx, podList, &client.ListOptions{
    LabelSelector: podSelector,
    FieldSelector: fields.OneTermEqualSelector("status.phase", "Running"),
    Limit:         1,
    Continue:      continueToken,
})
go kubernetes kubernetes-go-client
1个回答
0
投票

您的代码不是最小的重现,这使我们更难以回答。

您需要重复(!)调用

List
方法 直到返回的延续标记为
""
,在每次迭代中将调用的
Continue
字段设置为返回的
PodList
Continue
值:

go.mod

module github.com/.../79349562

go 1.23.4

require (
    k8s.io/apimachinery v0.32.0
    k8s.io/client-go v0.32.0
    sigs.k8s.io/controller-runtime v0.19.4
)
package main

import (
    "context"
    "fmt"
    "log/slog"

    corev1 "k8s.io/api/core/v1"

    "k8s.io/apimachinery/pkg/fields"
    "k8s.io/apimachinery/pkg/labels"

    "sigs.k8s.io/controller-runtime/pkg/client"
    "sigs.k8s.io/controller-runtime/pkg/client/config"
)

func main() {
    cfg, err := config.GetConfig()
    if err != nil {
        panic(err)
    }
    k8sClient, err := client.New(cfg, client.Options{})
    if err != nil {
        panic(err)
    }

    // For want of an alternative...
    labelSelector, err := labels.Parse("dog=freddie")
    if err != nil {
        panic(err)
    }

    ctx := context.Background()
    podList := &corev1.PodList{}
    opts := &client.ListOptions{
        LabelSelector: labelSelector,
        FieldSelector: fields.OneTermEqualSelector("status.phase", "Running"),
        Limit:         1,
    }

    for {
        if err = k8sClient.List(ctx, podList, opts); err != nil {
            panic(err)
        }

        for _, pod := range podList.Items {
            slog.Info("Pod", "name", pod.Name, "namespace", pod.Namespace)
        }

        opts.Continue = podList.Continue
        if opts.Continue == "" {
            break
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.