Получить сервисные селекторы с клиентом Python K8s

Я пытаюсь получить услугу label selectors через Kubernetes Python Client. Я использую метод list_service_for_all_namespaces, чтобы получить службы и отфильтровать их field_selector параметр как:

...
field_selector="spec.selector={u'app': 'redis'}
...
services = v1.list_service_for_all_namespaces(field_selector=field_selector, watch=False)
for service in services.items:
    print(service)
...

Я получаю эту ошибку:

HTTP response body: {"kind":"Status","apiVersion":"v1","metadata":{},"status":"Failure","message":"\"spec.selector\" is not a known field selector: only \"metadata.name\", \"metadata.namespace\"","reason":"BadRequest","code":400}

Итак, кажется, что только name а также namespace Действительными являются параметры, которые не документированы:

field_selector = 'field_selector_example' # str | Селектор для ограничения списка возвращаемых объектов по их полям. По умолчанию все. (необязательный)

На данный момент мой обходной путь состоит в том, чтобы установить те же метки, что и селекторы меток в сервисе, а затем получить его через label_selector параметр, но я хотел бы иметь возможность получить его через label selectors,

Дело в том, что с самого начала мне нужно получить конечные точки за службой (модули бэкэнда), но вызов API даже не возвращает эту информацию, поэтому я хотел бы получить селекторы, сопоставить их с метками на модулях и там мы идем, но теперь я понимаю, что селекторы тоже не возможно получить.

Это слишком много ограничений. Я думаю, может быть, мой подход неверен. Кто-нибудь знает способ получения label selectors из службы?

1 ответ

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

Например (я надеюсь, у меня нет опечаток, а мой питон ржавый):

services = v1.list_service_for_all_namespaces(watch=False)
for svc in services.items:
    if svc.spec.selector:
        # convert the selector dictionary into a string selector
        # for example: {"app":"redis"} => "app=redis"
        selector = ''
        for k,v in svc.spec.selector.items():
            selector += k + '=' + v + ','
        selector = selector[:-1]

        # Get the pods that match the selector
        pods = v1.list_pod_for_all_namespaces(label_selector=selector)
        for pod in pods.items:
            print(pod.metadata.name)
Другие вопросы по тегам