如何使用官方Python客户端从Pod中找到同一节点上的所有Kubernetes Pod?

时间:2018-10-12 18:53:13

标签: python kubernetes

如何使用官方的Python Kubernetes客户端获取与我自己的(特权)Pod在同一Kubernetes节点上运行的Pod的列表?也就是说,吊舱如何才能识别其正在运行的具体Kubernetes节点,然后仅在此节点上查询吊舱的完整列表?

1 个答案:

答案 0 :(得分:2)

我在这里假设您已将Pod部署到集群,现在您正在尝试查询运行它的节点。

这实际上是两个不同的问题:

  

也就是说,广告连播如何识别其运行的具体Kubernetes节点

您可以通过两种方式进行操作,but they both involved the downward API。您可以按下Pod名称或按下节点名称(或两者都按下)。您首先需要执行此操作以启用所需的查找。因此,需要像这样部署运行kubernetes python客户端的pod:

apiVersion: v1
kind: Pod
metadata:
  name: example-app
spec:
  containers:
    - name: python-kubernetes-client
      image: my-image
      command: [ "start_my_app" ]
      env:
        - name: MY_NODE_NAME
          valueFrom:
            fieldRef:
              fieldPath: spec.nodeName
        - name: MY_POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
  restartPolicy: Never

好的,现在您可以对运行中的Pod使用Pod信息和节点信息。

  

,然后仅在此节点上查询Pod的完整列表

现在,您知道运行Pod的节点名称,使用python API查询运行在其上的Pod相对简单:

#!/usr/bin/env python
from kubernetes import client, config
import os

def main():

    # it works only if this script is run by K8s as a POD
    config.load_incluster_config()
    # use this outside pods
    # config.load_kube_config()

    # grab the node name from the pod environment vars
    node_name = os.environ.get('MY_NODE_NAME', None)

    v1 = client.CoreV1Api()
    print("Listing pods with their IPs on node: ", node_name)
    # field selectors are a string, you need to parse the fields from the pods here
    field_selector = 'spec.nodeName='+node_name
    ret = v1.list_pod_for_all_namespaces(watch=False, field_selector=field_selector)
    for i in ret.items:
        print("%s\t%s\t%s" %
              (i.status.pod_ip, i.metadata.namespace, i.metadata.name))


if __name__ == '__main__':
    main()