如何在GKE上通过堆栈驱动程序查看容器日志

时间:2020-05-25 17:20:20

标签: logging kubernetes google-kubernetes-engine stackdriver google-cloud-stackdriver

我已阅读到默认情况,GKE上的群集将所有日志写入堆栈驱动程序。在GKE UI上,我可以看到所有部署的容器日志,但是希望通过编程方式从API获取这些日志。

我尝试做类似gcloud logging read "resource.labels.pod_id="<pod-id>""的操作,但是什么也没返回。

是否需要做一些特殊的事情才能启用群集上的日志记录?如果没有,如何访问特定部署/吊舱/容器的日志?

此外,这些日志是否持久存在?就像这样,当部署终止时,我仍然可以访问这些日志吗?

1 个答案:

答案 0 :(得分:1)

您可以通过多种方法从Stackdriver中读取GKE吊舱日志。其中一些是:

阅读日志

要在“日志记录”中读取日志条目,可以执行以下任一操作:

  • 使用Google Cloud Console中的日志查看器。
  • 通过客户端库为您的编程语言调用Logging API。
  • 直接调用Logging API REST端点。请参阅Logging API参考文档。
  • 使用Cloud SDK。有关更多信息,请参见gcloud日志记录命令行界面。

    Cloud.google.com: Logging: Setup

至:

我需要做一些特殊的事情来启用集群登录吗?如果没有,如何访问特定部署/吊舱/容器的日志?

请参考:Cloud.google.com: Logging: Access control

在下面回答:

此外,这些日志是否持久存在?就像这样,当部署终止时,我仍然可以访问这些日志吗?

是的,即使删除了部署,您仍然可以访问此日志。即使删除群集,您仍然可以访问日志。存储在Stackdriver中的日志具有 retention 策略,该策略将在设置的时间段内存储日志。 请参考:


请看下面的示例,该示例显示了如何使用gcloud命令访问日志:

步骤:

  • 创建一个Deployment,它将日志发送到Stackdriver
  • 检查日志是否存储在Stackdriver中
  • 使用gcloud从Stackdriver获取日志

创建展开

请遵循Google Cloud Platform指南以生成Deployment,它将发送数据到Stackdriver:

检查日志是否在Stackdriver中。

以上部署导出的日志将存储在Stackdriver中。它的示例应如下所示:

{
 insertId: "REDACTED"  
 labels: {
  k8s-pod/pod-template-hash: "545464fb5"   
  k8s-pod/run: "custom-metric-sd"   
 }
 logName: "projects/REDACTED/logs/stderr"  
 receiveTimestamp: "2020-05-26T10:17:16.161949129Z"  
 resource: {
  labels: {
   cluster_name: "gke-logs"    
   container_name: "sd-dummy-exporter"    
   location: "ZONE"    
   namespace_name: "default"    
   pod_name: "custom-metric-sd-545464fb5-2rdvx"    
   project_id: "REDACTED"    
  }
  type: "k8s_container"   
 }
 severity: "ERROR"  
 textPayload: "2020/05/26 10:17:10 Finished writing time series with value: 0xc420015290
"  
 timestamp: "2020-05-26T10:17:10.356684667Z"  
}

上面的日志条目将有助于创建gcloud命令以仅从Stackdriver中获取指定的日志。

使用gcloud从Stackdriver获取日志

正如您所指出的:

我试图做类似gcloud的日志读取“ resource.labels.pod_id =“”“,但未返回任何内容。

什么都不返回的事实很可能与您使用的命令找不到请求的资源有关。

要从Stackdriver获取此日志,请调用以下命令:

$ gcloud logging read "resource.type=k8s_container AND resource.labels.container_name=sd-dummy-exporter" 

将以上命令划分为较小的部分:

  • resource.type=k8s_container-它会获取类型为k8s_container的日志
  • resource.labels.container_name=XYZ-它会获取具有指定container_name的日志。

这部分内容与前面提到的示例单数日志条目直接相关。

提示:

resources.labels.container_name可用于从多个容器中收集日志,因为可以用pod_name引用特定容器。