client-go에서 복잡한 LabelSelector로 k8s 작업을 나열하는 방법은 무엇입니까?

Jan 28 2021

다음 명령과 같이 client-go로 레이블 선택기로 k8s 작업을 나열하고 싶습니다 .

$ kubectl get jobs -l 'hello-world in (London, China, NewYork)'

client-go의 소스 코드를 살펴본 다음 다음과 같은 코드를 작성했습니다.

func listJobs(cli *kubernetes.Clientset) (*batchv1.JobList, error) {
    label := metav1.LabelSelector{
        MatchExpressions: []metav1.LabelSelectorRequirement{
            {
                Key:      "hello-world",
                Operator: metav1.LabelSelectorOpIn,
                Values: []string{
                    "London",
                    "China",
                    "NewYork",
                },
            },
        },
    }

    fmt.Println(label.String())

    return cli.BatchV1().Jobs("default").List(context.TODO(), metav1.ListOptions{
        LabelSelector: label.String(),
    })
}

그런 다음 오류가 발생했습니다.

&LabelSelector{MatchLabels:map[string]string{},MatchExpressions:[]LabelSelectorRequirement{LabelSelectorRequirement{Key:hello-world,Operator:In,Values:[London China NewYork],},},}
2021/01/28 17:58:07 unable to parse requirement: invalid label key "&LabelSelector{MatchLabels:map[string]string{}": name part must consist of alphanumeric characters, '-', '_' or '.', and must start and end with an alphanumeric character (e.g. 'MyName',  or 'my.name',  or '123-abc', regex used for validation is '([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9]')

내가 어디로 잘못 되었습니까? 복잡한 표현식 인 레이블 선택기로 내 작업을 나열하려면 어떻게해야합니까?

답변

3 Ullaakut Jan 28 2021 at 17:36

Kubernetes client-go라이브러리를 사용하면 .NET 과 동일한 방식으로 라벨 선택기를 작성할 수 있습니다 kubectl.

글쓰기 hello-world in (London, China, NewYork)는 잘 작동합니다.

func listJobs(cli *kubernetes.Clientset) (*batchv1.JobList, error) {
    return cli.BatchV1().Jobs("default").List(context.TODO(), metav1.ListOptions{
        LabelSelector: "hello-world in (London, China, NewYork)",
    })
}

그러나 원하는 것이 hello-world in (London, China, NewYork)프로그래밍 방식 개체에서 동적으로 생성 하는 것이라면 이것은 이미 StackOverflow 에서 답변 된 또 다른 질문 입니다.