在新安装的集群(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
。