我有一个控制器可以使用 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,
})
您的代码不是最小的重现,这使我们更难以回答。
您需要重复(!)调用
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
}
}
}