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