[英]Can't get the application logs from pods Kubernetes
我在三个不同的容器中运行三个服务。 这些服务的日志被发送到系统,所以如果我在 Linux 服务器上运行这些服务,我可以使用 journalctl 查看日志。
此外,如果我在 Docker 容器中运行服务,我可以使用 docker logs <container_name> 或 /var/lib/docker/containers 目录收集日志。 但是当我移动到 Kubernetes (Microk8s) 时,我无法使用 kubectl logs 命令检索它们,并且 /var/log/containers 或 /var/log/pods 中也没有日志。
如果我登录到 pod,我可以看到进程正在运行,但是如果没有日志,我就不能说它们是否正确运行。 另外,我尝试将 microk8s kubelet 的运行时从 containerd 更改为 docker,但仍然无法获取任何日志。
# kubectl get po -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
amf-deployment-7785db9758-h24kz 1/1 Running 0 72s 10.1.243.237 ubuntu <none>
# kubectl describe po amf-deployment-7785db9758-h24kz
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 87s default-scheduler Successfully assigned default/amf-deployment-7785db9758-h24kz to ubuntu
Normal AddedInterface 86s multus Add eth0 [10.1.243.237/32]
Normal Pulled 86s kubelet Container image "amf:latest" already present on machine
Normal Created 86s kubelet Created container amf
Normal Started 86s kubelet Started container amf
# kubectl logs amf-deployment-7785db9758-h24kz
# kubectl logs -f amf-deployment-7785db9758-h24kz
^C
您可以在以下屏幕截图中看到使用 Docker 运行同一容器和使用 Kubernetes 运行它的区别。 这种行为看起来很奇怪,因为如果应用程序作为独立的 Docker 容器运行,则可以收集日志,但当它与 Kubernetes 一起运行时则不能。 在此处输入图像描述
在传统的服务器环境中,应用程序日志被写入一个文件,例如/var/log/app.log
。 但是,在使用 Kubernetes 时,您需要跨集群中的多个节点收集多个临时 pod(应用程序)的日志,这使得这种日志收集方法不是最佳的。 相反,默认的 Kubernetes 日志框架建议从每个节点上的日志文件中捕获标准 output ( stdout
) 和标准错误 output ( stderr
)。 如果您在使用kubectl logs
命令时看不到您的应用程序日志,则很可能意味着您的应用程序没有在正确的位置写入日志。 官方Logging Architecture文档更详细地解释了这个主题。 Kubernetes 中还有一个基本日志记录的示例:
此示例使用带有容器的 Pod 规范将文本写入标准 output stream 每秒一次。
apiVersion: v1 kind: Pod metadata: name: counter spec: containers: - name: count image: busybox args: [/bin/sh, -c, 'i=0; while true; do echo "$i: $(date)"; i=$((i+1)); sleep 1; done']
要运行此 pod,请使用以下命令:
kubectl apply -f https://k8s.io/examples/debug/counter-pod.yaml
output 是:
pod/counter created
要获取日志,请使用 kubectl logs 命令,如下所示:
kubectl logs counter
output 是:
0: Mon Jan 1 00:00:00 UTC 2001 1: Mon Jan 1 00:00:01 UTC 2001 2: Mon Jan 1 00:00:02 UTC 2001...
您可以使用
kubectl logs --previous
从容器的先前实例中检索日志。 如果您的 pod 有多个容器,请通过将容器名称附加到命令来指定要访问哪个容器的日志。 有关更多详细信息,请参阅kubectl 日志文档。
您可以将其与您的Pod
/app 配置进行比较,看看是否有任何错误。
考虑到这些知识,您现在有几个选项来调试正在运行的 Pod ,例如:
通过执行kubectl describe pods ${POD_NAME}
调试Pod 并检查其失败的原因。
检查 pod 日志:使用kubectl logs ${POD_NAME} ${CONTAINER_NAME}
或kubectl logs --previous ${POD_NAME} ${CONTAINER_NAME}
使用容器 exec 进行调试:通过使用kubectl exec
在特定容器内运行命令
使用临时调试容器进行调试:当kubectl exec
不足时,临时容器对于交互式故障排除很有用,因为容器已崩溃或容器映像不包含调试实用程序,例如使用distroless 映像。
通过节点上的 shell 进行调试:如果这些方法都不起作用,您可以找到运行 pod 的主机和 SSH 到该主机
总结一下:
确保您的日志记录到位
使用上面列出的选项进行调试
对于 kubernetes 日志,您可以尝试使用此命令查看日志:
kubectl logs -f <pod-name>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.