Google Kubernetes Engine-无法看到包含pod输出的日志

Google Kubernetes Engine-无法看到包含pod输出的日志

在新安装的集群(Kubernetes 版本:v1.22.8-gke.201)中,我有以下测试部署:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: busybox
  labels:
    app: busybox
spec:
  replicas: 1
  strategy: 
    type: RollingUpdate
  selector:
    matchLabels:
      app: busybox
  template:
    metadata:
      labels:
        app: busybox
    spec:
      containers:
        - name: busybox
          image: busybox:latest
          imagePullPolicy: IfNotPresent
          command: ['sh', '-c', 'while true; do printf "$(date +%Y-%m-%d\ %H:%M:%S\ %Z) => your lucky number is: $RANDOM\n"; sleep 5; done']

我可以使用以下命令查看 pod 产生的输出:

kubectl logs <pod_name>

但是在控制台中,转到 Kubernetes Engine -> Workloads 后,在概览选项卡的日志中,单击容器日志链接会重定向到操作日志,并且日志资源管理器返回的所有信息为:“未找到数据”。

在集群详细信息的功能部分中,云日志已启用,并且组件设置为“系统和工作负载”(这是默认值)。

还需要做什么才能在日志资源管理器中看到 pod 的输出?

答案1

我回答我自己:

启用 Cloud Logging API 解决了该问题:

$ gcloud services enable logging.googleapis.com

它应该在启用的 API 列表中可见:

$ gcloud services list
NAME                    TITLE
[...]
logging.googleapis.com  Cloud Logging API
[...]

答案2

我遇到了同样的问题,但是解决方案不同。

我配置了一个不使用默认服务帐户的 GKE 节点池,结果发现我使用的非标准服务帐户没有足够的权限将“kubectl logs $podname”发送到 GCP 的日志资源管理器。因此,如果您遇到类似情况,请检查与您的节点池关联的服务帐户,并考虑添加更多权限以匹配默认服务帐户。

https://cloud.google.com/kubernetes-engine/docs/how-to/hardening-your-cluster
我运行了以下命令,为自定义服务帐户添加必要的最小特权原则。

设置变量:
导出 PROJECT=我的项目
导出[电子邮件保护]

查看变更前的 IAM 权限:
gcloud 项目 get-iam-policy $PROJECT
--flatten="bindings[].members"
--format='table(bindings.role)'
--filter="bindings.members:$SA_NAME"

添加最小权限角色:
gcloud 项目 add-iam-policy-binding $PROJECT --member=serviceAccount:$SA_NAME --role=roles/monitoring.viewer
gcloud 项目 add-iam-policy-binding $PROJECT --member=serviceAccount:$SA_NAME --role=roles/monitoring.metricWriter
gcloud 项目 add-iam-policy-binding $PROJECT --member=serviceAccount:$SA_NAME --role=roles/logging.logWriter
gcloud 项目 add-iam-policy-binding $PROJECT --member=serviceAccount:$SA_NAME --role=roles/stackdriver.resourceMetadata.writer

查看变更后的 IAM 权限:
gcloud 项目 get-iam-policy $PROJECT
--flatten="bindings[].members"
--format='table(bindings.role)'
--filter="bindings.members:$SA_NAME"

答案3

我相信如果您可以看到将kubectl get logs mypod 所有日志发送到标准输出的日志已经设置好了,但您可能仍想在您的应用程序中检查一下。

但是,由于您正在运行 busybox,因此没有正在运行的“真实”应用程序会将日志记录到 stdout。因此这可能是您的问题。

检查主 PID(假设您运行的是 Apache 而不是 BusyBox)是否将其所有日志发送到 stdout。然后您应该可以在没有命令的情况下看到终端上的日志kubectl

相关内容