使用K8s Python客户端获取服务选择器

时间:2018-06-27 08:48:36

标签: kubernetes kubernetes-python-client

我正在尝试通过Kubernetes Python Client获得服务label selectors。我正在使用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}

因此,似乎只有namenamespace是有效参数,没有记录:

  

field_selector ='field_selector_example'#str |一个选择器,用于按其字段限制返回对象的列表。默认为所有。 (可选)

现在,我的解决方法是为服务设置与标签选择器相同的 labels ,然后通过label_selector参数进行检索,但是我想希望能够通过label selectors获得它。

问题是,从一开始我就需要获取服务背后的端点(后端Pod),但是API调用甚至没有返回此信息,因此尽管我会得到选择器,并将其与标签进行匹配在豆荚上,然后走了,但现在我意识到选择器都无法获得。

这是太多限制。我在想可能是我的方法是错误的。有人知道从服务中获取label selectors的方法吗?

1 个答案:

答案 0 :(得分:2)

您应该能够从服务对象中获取选择器,然后使用它来查找与选择器匹配的所有吊舱。

例如(我希望我没有错别字,而我的python生锈了):

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)