设想一下这个场景,如果你想要快速实现监控k8s集群中pod状态,如果有非running的pod,直接发送钉钉、或者企微告警完成。如何最小成本实现?肯定不是搭建一套专业的监控系统。那么下面就用python脚本分分钟完成这个功能。
def check_pods_status():
"""
使用kubectl命令检查所有Pods的状态,如果不是在正常状态列表,则发送告警,并且记录状态
"""
cmd = "kubectl get pods --all-namespaces -o json"
result = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = result.communicate()
if stderr:
print("执行kubectl命令时出错: {error}".format(error=stderr.strip()))
return
这段代码核心逻辑就是:
kubectl get pods --all-namespaces -o json
这一行,就像你平时敲命令查Pod状态一样,但是输出格式是json,方便代码处理。subprocess.Popen
这个玩意,就是在代码里敲命令行,然后拿结果。send_alert_to_wechat
这个函数,按照企业微信要的格式,组装一条消息出来。def check_pods_status():
"""
检查所有Pods的状态,如果不是Running,则发送告警
"""
try:
pods = v1.list_pod_for_all_namespaces(watch=False)
for pod in pods.items:
if pod.status.phase != "Running":
# 发送告警
send_alert_to_wechat(pod.metadata.labels.get('app'), pod.metadata.namespace, pod.metadata.name, pod.status.phase)
except ApiException as e:
print(f"Exception when calling CoreV1Api->list_pod_for_all_namespaces: {e}")
这段代码的主要作用就是定期检查你Kubernetes集群里面的Pod是不是都活蹦乱跳的,即状态是不是“Running”。如果不是,就往企业微信群里扔个告警,让人知道有Pod状态不对头。
核心逻辑就这么几步:
config.load_kube_config()
这行代码,就跟你平时在本地用kubectl搞事情一样,假设你的电脑已经有权限连Kubernetes集群了。v1.list_pod_for_all_namespaces(watch=False)
这行代码就是在说,嘿Kubernetes API,把所有namespace命名空间(就是Kubernetes里面隔离资源的区)的Pod信息给我看看。pod.status.phase
去看它的状态是不是“Running”。send_alert_to_wechat
函数就会被调用。requests.post
发送给企业微信的webhook URL,这样就能在企业微信那边收到消息了。用脚本搞Kubernetes自动化,区别应该有这些:
1. 直接用Python搞定一切:
玩这招,就是在你的代码里直接跟Kubernetes耍,用Python写个脚本啥的,不用搞那个 kubectl
。
kubectl
搞定。kubectl
的结果要快。2. 继续用 kubectl
命令行:
这招就是继续用传统的 kubectl
,写个shell脚本或者在Python里调用它,然后处理它吐出来的信息。
kubectl
的老鸟来说,这种方式简单明了。kubectl
工具就行。kubectl
一般会跟着集群升级,不用操心兼容问题。kubectl
)慢点儿。kubectl
的结果里摘信息,容易让脚本变复杂,也难改。kubectl
更新了,你的脚本可能就得重写。所以呢:
kubectl
搞定算了。选哪个,看你的需求:得考虑安全、自动化的复杂程度、维护容易不,还有你们团队用啥顺手。