Получить сервисные селекторы с клиентом 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)