Получить сервисные селекторы с клиентом Python K8s - PullRequest
0 голосов
/ 27 июня 2018

Я пытаюсь получить услугу 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 Ответ

0 голосов
/ 28 июня 2018

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

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

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)
...