问题陈述
我有一个 Kubernetes 集群,其中有许多在特定命名空间中运行的 pod。我想使用 Python 和 Paramiko SSH 客户端读取特定 pod 的日志。
我有豆荚在下面运行
kubectl get pods -n <myNameSpace>
上面命令的结果看起来像
service1-8457bd9899-4jdzz
service2-765b497fbf-2w82j
这是我的 Python 代码,我知道服务 1、服务 2 等部署名称
我想单独使用这些名称来阅读日志
kubectl logs service1* -n <myNameSpace> -f --tail 100
但是上面的命令不起作用,因为正则表达式不起作用。
我的解决方案
我正在运行两个命令,一个是获取完整的 pod 名称,另一个是使用该全名检查日志
ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command(f'kubectl get pods -n namespace1 |grep service1')
pod_name_service1 = ssh_stdout.read().decode("utf-8").split(' ')[0]
ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command(
f'kubectl logs {pod_name_service1} -n edge -f --tail 100')
service1_logs = ssh_stdout.read().decode("utf-8")
问题
如何仅使用服务部署名称(没有副本集名称+随机5位字母数字)来检索日志?还有其他方法吗?
如果只有一个replica,或者不关心得到哪个replica,可以直接在命令行使用Deployment名称
kubectl logs -n my-namespace deployment/service1 --tail 100 -f
请注意,这是实际上适用于特定 Pod 的几个命令之一,即使您可以使用
deployment/name
语法(其他对象类型也可以)。如果它附加到的特定 Pod 退出,那么 kubectl logs
命令也会停止,即使其他副本保持不间断运行。
(我还强烈建议修复代码中的 shell 注入漏洞。考虑使用 Kubernetes SDK 执行
kubectl
命令,如果需要,可以通过 ssh 连接端口转发 Kubernetes API 端点。)