在GKE中实现默认的stackdriver行为

时间:2019-01-02 16:44:21

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

我正在为具有结构化json日志记录的应用程序设置GKE群集,该日志记录与Kibana很好地兼容。但是,我想改用stackdriver。

我看到具有默认群集配置的stackdriver中可以使用该应用程序的日志。日志显示为jsonpayload,但是我需要更多的灵活性和配置,而当我在此guide之后执行该操作时,同一应用程序的所有日志仅显示为textpayload。最终,当我使用流利的代理配置来利用label_map时,我希望我的日志继续显示在jsonpayload中。

我遵循guide,删除了默认的日志记录服务,并为具有以下GKE版本的现有集群部署了流利的代理。

Gcloud版本信息:

Google Cloud SDK 228.0.0
bq 2.0.39
core 2018.12.07
gsutil 4.34

kubectl版本信息:

Client Version: version.Info{Major:"1", Minor:"10", GitVersion:"v1.10.3", GitCommit:"2bba0127d85d5a46ab4b778548be28623b32d0b0", GitTreeState:"clean", BuildDate:"2018-05-21T09:17:39Z", GoVersion:"go1.9.3", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"10+", GitVersion:"v1.10.9-gke.5", GitCommit:"d776b4deeb3655fa4b8f4e8e7e4651d00c5f4a98", GitTreeState:"clean", BuildDate:"2018-11-08T20:33:00Z", GoVersion:"go1.9.3b4", Compiler:"gc", Platform:"linux/amd64"}

gcloud容器集群描述代码段:

addonsConfig:
  httpLoadBalancing: {}
  kubernetesDashboard:
    disabled: true
  networkPolicyConfig:
    disabled: true
createTime: '2018-12-24T19:31:21+00:00'
currentMasterVersion: 1.10.9-gke.5
currentNodeCount: 3
currentNodeVersion: 1.10.9-gke.5
initialClusterVersion: 1.10.9-gke.5
ipAllocationPolicy: {}
legacyAbac: {}
location: us-central1-a
locations:
- us-central1-a
loggingService: none
masterAuth:
  username: admin
masterAuthorizedNetworksConfig: {}
monitoringService: monitoring.googleapis.com
name: test-cluster-1
network: default
networkConfig:
  network: projects/test/global/networks/default
  subnetwork: projects/test/regions/us-central1/subnetworks/default
networkPolicy: {}
nodeConfig:
  diskSizeGb: 100
  diskType: pd-standard
  imageType: COS
  machineType: n1-standard-1
  serviceAccount: default
nodeIpv4CidrSize: 24
nodePools:
- autoscaling: {}
  config:
    diskSizeGb: 100
    diskType: pd-standard
    imageType: COS
    machineType: n1-standard-1
    serviceAccount: default
  initialNodeCount: 3
  management:
    autoRepair: true
    autoUpgrade: true
  name: default-pool
  status: RUNNING
  version: 1.10.9-gke.5
status: RUNNING
subnetwork: default
zone: us-central1-a

以下是我的fluentd守护程序配置文件中包含的内容:

<source>
  type tail
  format none
  time_key time
  path /var/log/containers/*.log
  pos_file /var/log/gcp-containers.log.pos
  time_format %Y-%m-%dT%H:%M:%S.%N%Z
  tag reform.*
  read_from_head true
</source>
<filter reform.**>
  type parser
  format json
  reserve_data true
  suppress_parse_error_log true
  key_name log
</filter>

这是我的应用程序中的示例json日志: {"log":"org.test.interceptor","lvl":"INFO","thread":"main","msg":"Inbound Message\n----------------------------\nID: 44\nResponse-Code: 401\nEncoding: UTF-8\nContent-Type: application/json;charset=UTF-8\nHeaders: {Date=[Mon, 31 Dec 2018 14:43:47 GMT], }\nPayload: {\"errorType\":\"AnException\",\"details\":[\"invalid credentials\"],\"message\":\"credentials are invalid\"}\n--------------------------------------","@timestamp":"2018-12-31T14:43:47.805+00:00","app":"the-app"}

具有以上配置的结果如下:

{
insertId:  "3vycfdg1drp34o"  
labels: {
 compute.googleapis.com/resource_name:  "fluentd-gcp-v2.0-nds8d"   
 container.googleapis.com/namespace_name:  "default"   
 container.googleapis.com/pod_name:  "the-app-68fb6c5c8-mq5b5"   
 container.googleapis.com/stream:  "stdout"   
}
logName:  "projects/test/logs/the-app"  
receiveTimestamp:  "2018-12-28T20:14:04.297451043Z"  
resource: {
 labels: {
  cluster_name:  "test-cluster-1"    
  container_name:  "the-app"    
  instance_id:  "234768123"    
  namespace_id:  "default"    
  pod_id:  "the-app-68fb6c5c8-mq5b5"    
  project_id:  "test"    
  zone:  "us-central1-a"    
 }
 type:  "container"   
}
severity:  "INFO"  
textPayload:  "org.test.interceptor"  
timestamp:  "2018-12-28T20:14:03Z"  
}

我什至尝试将json映射包装到一个字段中,因为它似乎只解析了“ log”字段。我考虑过显式地编写一个解析器,但是考虑到日志条目已经是json格式,并且考虑到字段在调用之间的变化,并且必须预料要解析的字段并不理想,因此这似乎是不可行的。

我希望日志中的所有字段都将出现在stackdriver日志条目的jsonPayload中。我最终想模仿在群集上默认日志记录堆栈驱动程序服务发生的情况,在该群集上,我们的日志至少显示为jsonPayload。

1 个答案:

答案 0 :(得分:1)

我怀疑键入tail-对fluentd守护程序集设置格式无效,这对您没有帮助。您可以尝试将格式设置为json或多行,然后更新吗?

类型尾巴

不格式化