有没有一种快速的方法可以从 Kubernetes 节点内部查询正在运行的 pod?

有没有一种快速的方法可以从 Kubernetes 节点内部查询正在运行的 pod?

可以使用它kubectl describe pods获取 Pod 列表,然后进行后处理以确定这些 Pod 正在运行的节点。但是,此命令需要 1 秒以上的时间才能运行。

如果我通过 ssh 进入特定的 Kubernetes 节点,是否有一种快速的方法(少于 100 毫秒)与本地 Kubernetes 代理通信并获取正在运行的 pod 列表localhost

例如,是否有命令行客户端可以与本地对话kubelet并获取此信息?

答案1

使用 kubectl:

kubectl get pods --all-namespaces --field-selector spec.nodeName=nodename

使用api:

curl --cacert ca.crt --cert apiserver.crt --key apiserver.key  https://<server>:<port>/api/v1/namespaces/<namespace>/pods?fieldSelector=spec.nodeName%3Dsomenodename

附言:如果 docker ps 对你不起作用,你只能与 api 对话

答案2

请注意,kubelet 只是一个节点代理,它不包含有关属于集群的其他节点的信息。即使您执行docker container ls,每个 pod 至少会有 2 个容器(容器 pod + pod 沙箱)。

使用 kubectl 时,许多因素都会影响执行简单kubectl get pods操作所需的时间。例如,主节点的大小、客户端 (kubectl) 和服务器 (主节点) 之间的网络延迟、响应量 (集群上运行的 pos 数量) 等。

请记住,主节点的大小与您的集群拥有的节点。您可以在主服务器运行的区域附近创建一个 GCE 实例,使用 kubeconfig 文件进行身份验证并对主服务器运行查询。

如果你无法使用 kubectl,你可以尝试直接向 master 发出 http 请求(与 kubectl 的作用相同)

答案3

该命令kubectl describe pods会汇总不同的来源来提供信息。这可能是它花费更多时间的原因之一。

如果您正在寻找每个节点的性能数据,那么有很多选项可供选择:

  • kube-prometheus帮助您设置容器和节点的监控。您可以过滤您感兴趣的数据。该系统基于“拉动”工作,时间分辨率可能对您来说不够细粒度。
  • 以类似的方式你可以设置带有 Kubernetes 模块的 Metricbeat记录指标。这是基于“推送”的工作,也许您可​​以在此处更好地控制时间分辨率。

如果这些带来的开销太大,这里有一些不同的想法:

  • kubectl get events
  • kubectl get pods --watch
  • docker ps并通过处理来自其他地方的元数据将容器映射到 Pod。您可以运行ls -l /var/log/containers以从符号链接的名称中获取容器的 Pod 名称和命名空间。
  • 也许你能在中找到其他有趣的东西/var/lib/kubelet/pods

相关内容