Как найти список селекторов полей, поддерживаемых kubectl для данного типа ресурса? - PullRequest
3 голосов
/ 19 апреля 2019

Я недавно узнал о флаге kubectl --field-selector, но столкнулся с ошибками при попытке использовать его с различными объектами.

Например:

$ kubectl delete jobs.batch --field-selector status.succeeded==1
Error from server (BadRequest): Unable to find "batch/v1, Resource=jobs" that match label selector "", field selector "status.succeeded==1": field label "status.succeeded" not supported for batchv1.Job

Согласно документация , Supported field selectors vary by Kubernetes resource type., поэтому я предполагаю, что такое поведение следовало ожидать.

Раздражает то, что мне приходилось пробовать каждое поле в отдельности, чтобы знать, могу ли я их использовать или нет.

Есть ли способ получить все поля, поддерживаемые для данного типа ресурса / версии ресурса / версии kubectl?

Ответы [ 2 ]

2 голосов
/ 23 апреля 2019

Проблема в вашем случае заключается в том, что вы по ошибке используете status.succeeded вместо status.successful, поэтому правильная команда -

kubectl delete jobs.batch --field-selector status.successful==1
No resources found

Относительно вашего вопроса по всем полям: я предлагаю углубиться в код и искать подходящие типы ресурсов в Conversion.go для каждого API.

Пример: Пакетное задание преобразование .go

    return scheme.AddFieldLabelConversionFunc(SchemeGroupVersion.WithKind("Job"),
        func(label, value string) (string, string, error) {
            switch label {
            case "metadata.name", "metadata.namespace", "status.successful":
                return label, value, nil
            default:
                return "", "", fmt.Errorf("field label %q not supported for batchv1.Job", label)
            }
        },
    )
}

Другие примеры: https://github.com/kubernetes/kubernetes/blob/master/pkg/apis/core/v1/conversion.go#L462-L510

0 голосов
/ 19 апреля 2019

Для записи, хотя это не отвечает на вопрос, можно обойти это ограничение с помощью jsonPath.

Например, приведенный выше пример можно сделать так:

kubectl delete job $(kubectl get job -o=jsonpath='{.items[?(@.status.succeeded==1)].metadata.name}')

(решение, вдохновленное https://stackoverflow.com/a/53540996/5771067)

...