python实现获取k8s的pod信息方式
作者:九制橘皮茶
文章介绍了通过脚本查看Kubernetes其他命名空间Pod的方法,需修改namespace参数,执行后可生成指定命名空间(如monitor)的Pod信息JSON文件,适用于监控和调试场景
1. 依赖
#requirements.txt kubernetes>=28.1.0
2. 代码
#!/usr/bin/env python3
"""
Kubernetes Pod信息查看脚本
查看monitor命名空间下的所有Pod信息
"""
import os
from kubernetes import client, config
from kubernetes.client.rest import ApiException
import json
from datetime import datetime
def load_k8s_config():
"""加载Kubernetes配置"""
try:
# 尝试从kubeconfig文件加载配置
config.load_kube_config()
print("✓ 已从kubeconfig文件加载配置")
except Exception:
try:
# 尝试从集群内部加载配置
config.load_incluster_config()
print("✓ 已从集群内部加载配置")
except Exception as e:
print(f"✗ 无法加载Kubernetes配置: {e}")
return False
return True
def get_pods_in_namespace(namespace="monitor"):
"""获取指定命名空间下的所有Pod信息"""
try:
# 创建API客户端
v1 = client.CoreV1Api()
print(f"\n正在获取 {namespace} 命名空间下的Pod信息...")
# 获取Pod列表
pods = v1.list_namespaced_pod(namespace=namespace)
if not pods.items:
print(f"在 {namespace} 命名空间下没有找到Pod")
return []
print(f"✓ 找到 {len(pods.items)} 个Pod")
pod_info_list = []
for pod in pods.items:
pod_info = {
"name": pod.metadata.name,
"namespace": pod.metadata.namespace,
"status": pod.status.phase,
"ready": "Ready" if pod.status.conditions else "Not Ready",
"restarts": pod.status.container_statuses[0].restart_count if pod.status.container_statuses else 0,
"age": pod.metadata.creation_timestamp,
"ip": pod.status.pod_ip,
"node": pod.spec.node_name,
"containers": []
}
# 获取容器信息
if pod.status.container_statuses:
for container in pod.status.container_statuses:
container_info = {
"name": container.name,
"image": container.image,
"ready": container.ready,
"restart_count": container.restart_count,
"state": str(container.state)
}
pod_info["containers"].append(container_info)
pod_info_list.append(pod_info)
return pod_info_list
except ApiException as e:
print(f"✗ API错误: {e}")
return []
except Exception as e:
print(f"✗ 获取Pod信息时发生错误: {e}")
return []
def display_pod_info(pod_info_list):
"""显示Pod信息"""
if not pod_info_list:
return
print(f"\n{'='*80}")
print(f"MONITOR命名空间Pod信息 - {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
print(f"{'='*80}")
for i, pod in enumerate(pod_info_list, 1):
print(f"\n{i}. Pod名称: {pod['name']}")
print(f" 命名空间: {pod['namespace']}")
print(f" 状态: {pod['status']}")
print(f" 就绪状态: {pod['ready']}")
print(f" 重启次数: {pod['restarts']}")
print(f" 创建时间: {pod['age']}")
print(f" Pod IP: {pod['ip']}")
print(f" 节点: {pod['node']}")
if pod['containers']:
print(f" 容器信息:")
for j, container in enumerate(pod['containers'], 1):
print(f" {j}. {container['name']}")
print(f" 镜像: {container['image']}")
print(f" 就绪: {container['ready']}")
print(f" 重启次数: {container['restart_count']}")
print(f" 状态: {container['state']}")
def save_to_json(pod_info_list, filename="monitor_pods.json"):
"""将Pod信息保存到JSON文件"""
if not pod_info_list:
return
try:
# 转换datetime对象为字符串
for pod in pod_info_list:
if pod['age']:
pod['age'] = pod['age'].isoformat()
with open(filename, 'w', encoding='utf-8') as f:
json.dump(pod_info_list, f, ensure_ascii=False, indent=2)
print(f"\n✓ Pod信息已保存到 {filename}")
except Exception as e:
print(f"✗ 保存文件时发生错误: {e}")
def main():
"""主函数"""
print("Kubernetes Pod信息查看工具")
print("=" * 50)
# 加载Kubernetes配置
if not load_k8s_config():
return
# 获取Pod信息
pod_info_list = get_pods_in_namespace("monitor")
# 显示Pod信息
display_pod_info(pod_info_list)
# 保存到JSON文件
save_to_json(pod_info_list)
print(f"\n{'='*80}")
print("脚本执行完成")
if __name__ == "__main__":
main()
3. 执行代码
pip install -r requirements.txt python get-pod.py #python3执行以下代码 python3 get-pod.py
查看其他命名空间的Pod,可以修改脚本中的namespace参数:
pod_info_list = get_pods_in_namespace("your-namespace")4. 效果
查看monitor名字空间下的pod信息
[root@master1 get-pod]# python3 get-pod.py
Kubernetes Pod信息查看工具
==================================================
✓ 已从kubeconfig文件加载配置
正在获取 monitor 命名空间下的Pod信息...
✓ 找到 16 个Pod
================================================================================
MONITOR命名空间Pod信息 - 2025-08-06 23:37:37
================================================================================
1. Pod名称: grafana-server-6bf79cb7fc-lnqkd
命名空间: monitor
状态: Running
就绪状态: Ready
重启次数: 0
创建时间: 2025-08-06 15:27:04+00:00
Pod IP: 10.244.137.126
节点: master1
容器信息:
1. grafana
镜像: 192.168.48.100/prometheus/grafana:latest
就绪: True
重启次数: 0
状态: {'running': {'started_at': datetime.datetime(2025, 8, 6, 15, 27, 4, tzinfo=tzutc())},
'terminated': None,
'waiting': None}
2. Pod名称: kube-state-metrics-5565bbc5ff-d4rrp
命名空间: monitor
状态: Running
就绪状态: Ready
重启次数: 0
创建时间: 2025-08-06 15:27:04+00:00
Pod IP: 10.244.180.27
节点: master2
容器信息:
1. kube-state-metrics
镜像: quay.io/coreos/kube-state-metrics:latest
就绪: True
重启次数: 0
状态: {'running': {'started_at': datetime.datetime(2025, 8, 6, 15, 27, 4, tzinfo=tzutc())},
'terminated': None,
'waiting': None}
3. Pod名称: loki-0
命名空间: monitor
状态: Running
就绪状态: Ready
重启次数: 0
创建时间: 2025-08-06 15:32:40+00:00
Pod IP: 10.244.196.131
节点: node01
容器信息:
1. loki
镜像: 192.168.48.100/prometheus/grafana/loki:2.6.1
就绪: True
重启次数: 0
状态: {'running': {'started_at': datetime.datetime(2025, 8, 6, 15, 32, 41, tzinfo=tzutc())},
'terminated': None,
'waiting': None}
4. Pod名称: loki-promtail-7mlwc
命名空间: monitor
状态: Running
就绪状态: Ready
重启次数: 1
创建时间: 2025-08-05 18:32:36+00:00
Pod IP: 10.244.186.239
节点: node03
容器信息:
1. promtail
镜像: 192.168.48.100/prometheus/grafana/promtail:2.9.3
就绪: True
重启次数: 1
状态: {'running': {'started_at': datetime.datetime(2025, 8, 6, 15, 31, 40, tzinfo=tzutc())},
'terminated': None,
'waiting': None}
5. Pod名称: loki-promtail-gdjtz
命名空间: monitor
状态: Running
就绪状态: Ready
重启次数: 1
创建时间: 2025-08-05 18:32:36+00:00
Pod IP: 10.244.137.86
节点: master1
容器信息:
1. promtail
镜像: 192.168.48.100/prometheus/grafana/promtail:2.9.3
就绪: True
重启次数: 1
状态: {'running': {'started_at': datetime.datetime(2025, 8, 6, 15, 20, 40, tzinfo=tzutc())},
'terminated': None,
'waiting': None}
6. Pod名称: loki-promtail-kjtkk
命名空间: monitor
状态: Running
就绪状态: Ready
重启次数: 1
创建时间: 2025-08-05 18:32:36+00:00
Pod IP: 10.244.180.37
节点: master2
容器信息:
1. promtail
镜像: 192.168.48.100/prometheus/grafana/promtail:2.9.3
就绪: True
重启次数: 1
状态: {'running': {'started_at': datetime.datetime(2025, 8, 6, 15, 20, 42, tzinfo=tzutc())},
'terminated': None,
'waiting': None}
7. Pod名称: loki-promtail-n6psz
命名空间: monitor
状态: Running
就绪状态: Ready
重启次数: 1
创建时间: 2025-08-05 18:32:36+00:00
Pod IP: 10.244.140.72
节点: node02
容器信息:
1. promtail
镜像: 192.168.48.100/prometheus/grafana/promtail:2.9.3
就绪: True
重启次数: 1
状态: {'running': {'started_at': datetime.datetime(2025, 8, 6, 15, 32, 26, tzinfo=tzutc())},
'terminated': None,
'waiting': None}
8. Pod名称: loki-promtail-qdn9v
命名空间: monitor
状态: Running
就绪状态: Ready
重启次数: 1
创建时间: 2025-08-05 18:32:36+00:00
Pod IP: 10.244.196.130
节点: node01
容器信息:
1. promtail
镜像: 192.168.48.100/prometheus/grafana/promtail:2.9.3
就绪: True
重启次数: 1
状态: {'running': {'started_at': datetime.datetime(2025, 8, 6, 15, 31, 32, tzinfo=tzutc())},
'terminated': None,
'waiting': None}
9. Pod名称: loki-promtail-zcbmp
命名空间: monitor
状态: Running
就绪状态: Ready
重启次数: 0
创建时间: 2025-08-06 15:20:58+00:00
Pod IP: 10.244.136.57
节点: master3
容器信息:
1. promtail
镜像: 192.168.48.100/prometheus/grafana/promtail:2.9.3
就绪: True
重启次数: 0
状态: {'running': {'started_at': datetime.datetime(2025, 8, 6, 15, 20, 59, tzinfo=tzutc())},
'terminated': None,
'waiting': None}
10. Pod名称: node-exporter-7wshk
命名空间: monitor
状态: Running
就绪状态: Ready
重启次数: 1
创建时间: 2025-08-05 17:52:28+00:00
Pod IP: 192.168.48.105
节点: node02
容器信息:
1. node-exporter
镜像: prom/node-exporter:latest
就绪: True
重启次数: 1
状态: {'running': {'started_at': datetime.datetime(2025, 8, 6, 15, 31, 30, tzinfo=tzutc())},
'terminated': None,
'waiting': None}
11. Pod名称: node-exporter-99rz7
命名空间: monitor
状态: Running
就绪状态: Ready
重启次数: 1
创建时间: 2025-08-05 17:52:28+00:00
Pod IP: 192.168.48.104
节点: node01
容器信息:
1. node-exporter
镜像: prom/node-exporter:latest
就绪: True
重启次数: 1
状态: {'running': {'started_at': datetime.datetime(2025, 8, 6, 15, 31, 31, tzinfo=tzutc())},
'terminated': None,
'waiting': None}
12. Pod名称: node-exporter-cvrms
命名空间: monitor
状态: Running
就绪状态: Ready
重启次数: 1
创建时间: 2025-08-05 17:52:28+00:00
Pod IP: 192.168.48.101
节点: master1
容器信息:
1. node-exporter
镜像: prom/node-exporter:latest
就绪: True
重启次数: 1
状态: {'running': {'started_at': datetime.datetime(2025, 8, 6, 15, 20, 41, tzinfo=tzutc())},
'terminated': None,
'waiting': None}
13. Pod名称: node-exporter-qd5hz
命名空间: monitor
状态: Running
就绪状态: Ready
重启次数: 1
创建时间: 2025-08-05 17:52:28+00:00
Pod IP: 192.168.48.106
节点: node03
容器信息:
1. node-exporter
镜像: prom/node-exporter:latest
就绪: True
重启次数: 1
状态: {'running': {'started_at': datetime.datetime(2025, 8, 6, 15, 31, 41, tzinfo=tzutc())},
'terminated': None,
'waiting': None}
14. Pod名称: node-exporter-stjwr
命名空间: monitor
状态: Running
就绪状态: Ready
重启次数: 1
创建时间: 2025-08-05 17:52:28+00:00
Pod IP: 192.168.48.103
节点: master3
容器信息:
1. node-exporter
镜像: prom/node-exporter:latest
就绪: True
重启次数: 1
状态: {'running': {'started_at': datetime.datetime(2025, 8, 6, 15, 20, 39, tzinfo=tzutc())},
'terminated': None,
'waiting': None}
15. Pod名称: node-exporter-sxdf2
命名空间: monitor
状态: Running
就绪状态: Ready
重启次数: 1
创建时间: 2025-08-05 17:52:28+00:00
Pod IP: 192.168.48.102
节点: master2
容器信息:
1. node-exporter
镜像: prom/node-exporter:latest
就绪: True
重启次数: 1
状态: {'running': {'started_at': datetime.datetime(2025, 8, 6, 15, 20, 41, tzinfo=tzutc())},
'terminated': None,
'waiting': None}
16. Pod名称: prometheus-alertmanager-5758b69574-prhdb
命名空间: monitor
状态: Pending
就绪状态: Ready
重启次数: 0
创建时间: 2025-08-06 15:26:54+00:00
Pod IP: 10.244.136.4
节点: master3
容器信息:
1. alertmanager
镜像: prom/alertmanager:v0.23.0
就绪: False
重启次数: 0
状态: {'running': None,
'terminated': None,
'waiting': {'message': None, 'reason': 'PodInitializing'}}
2. prometheus
镜像: 192.168.48.100/prometheus/prometheus:latest
就绪: False
重启次数: 0
状态: {'running': None,
'terminated': None,
'waiting': {'message': None, 'reason': 'PodInitializing'}}
✓ Pod信息已保存到 monitor_pods.json
================================================================================
脚本执行完成同时生成了pod信息的json文件
[root@master1 get-pod]# ls get-pod.py monitor_pods.json README.md requirements.txt
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
