如何更改 GKE 管理的日志记录代理的 fluentd 配置?

How to change fluentd config for GKE-managed logging agent?

我在 Google 容器引擎中有一个容器集群,启用了 Stackdriver 日志记录代理。它正确地从我的容器中提取标准输出日志。现在我想更改 fluentd 配置以指定日志解析器,以便 GCP 日志视图中显示的日志具有正确的严重性和组件。

在此 Stackdriver logging guide from kubernetes.io 之后,我已尝试:

  1. 获取 fluentd ConfigMap 作为 yml 文件
  2. 根据我的log4js日志格式添加了一个新的<filter>
  3. kube-system 命名空间
  4. 中创建了一个名为 fluentd-cm-2 的新 ConfigMap
  5. 编辑了 fluentd 的 DaemonSet 并将其 ConfigMap 设置为 fluentd-cm-2。我使用 kubectl edit ds 而不是 kubectl replace -f 执行此操作,因为后者失败并显示错误消息:"the object has been modified",即使在获得 DaemonSet yaml 的新副本后也是如此。

意外结果:DaemonSet重新启动了,但是它的配置恢复到原来的ConfigMap,所以我的更改没有生效。

我也试过直接编辑 ConfigMap (kubectl edit cm fluentd-gcp-config-v1.1 --namespace kube-system) 并保存它,但它也被还原了。

我注意到 fluentd 的 DaemonSetConfigMap 被标记为 addonmanager.kubernetes.io/mode: Reconcile。由于这种 "reconcile" 模式,我会得出结论,GKE 已经覆盖了我的设置。

所以,我的问题是:当 GKE 在集群配置中安装了日志代理时,我如何更改 Google Container Engine 集群中的 fluentd 配置?

请查看 documentation page you mentioned 上的先决条件部分。那里提到,在 GKE 上,您无法更改默认的 Stackdriver Logging 集成。原因是 GKE 维护此配置:更新代理、监视其运行状况等。不可能为所有可能的配置提供相同级别的支持。

但是,您始终可以禁用默认集成并部署您自己的 DaemonSet 补丁版本。您可以在 GKE documentation:

中找到如何禁用默认集成

gcloud beta container clusters update [CLUSTER-NAME] \ --logging-service=none

请注意,禁用默认集成后,您必须自己维护新部署:更新代理、设置资源、观察其运行状况。

这是一个使用您自己的 fluentd daemonset 的解决方案,它与 GKE 中包含的非常相似。

https://cloud.google.com/solutions/customizing-stackdriver-logs-fluentd