使用 Fluentd 为 Google Kubernetes Engine 自定义 Cloud Logging 日志

Last reviewed 2022-10-03 UTC

本教程介绍了如何为 Google Kubernetes Engine 集群自定义 Fluentd 日志记录。您将学习如何托管您自己的可配置 Fluentd 守护进程集以将日志发送到 Cloud Logging,而不是在创建 Google Kubernetes Engine (GKE) 集群时选择云日志记录选项,因为此选项不允许配置 Fluentd 守护进程。

目标

  • 在 Google Kubernetes Engine 集群上部署您自己的 Fluentd 守护进程集,并将其配置为将数据记录到 Cloud Logging。本教程假设您已熟悉 Kubernetes
  • 自定义 GKE 日志记录以从 Cloud Logging 日志中移除敏感数据。
  • 自定义 GKE 日志记录将节点级事件添加到 Cloud Logging 日志中。

费用

本教程使用 Google Cloud 的以下收费组件:

价格计算器估算,该环境的费用约为 $1.14/8 小时。

准备工作

  1. 登录您的 Google Cloud 账号。如果您是 Google Cloud 新手,请创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  3. 确保您的 Google Cloud 项目已启用结算功能

  4. 启用 Google Kubernetes Engine, Compute Engine API。

    启用 API

  5. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  6. 确保您的 Google Cloud 项目已启用结算功能

  7. 启用 Google Kubernetes Engine, Compute Engine API。

    启用 API

初始化通用变量

您必须定义多个变量来控制基础架构元素的部署位置。

  1. 使用文本编辑器修改以下脚本,并将项目 ID 替换为 [YOUR_PROJECT_ID]。该脚本将区域设置为 us-east-1。如果对脚本进行了任何更改,请确保地区值引用您指定的区域。

    export region=us-east1
    export zone=${region}-b
    export project_id=[YOUR_PROJECT_ID]
    
  2. 转至 Cloud Shell。

    打开 Cloud Shell

  3. 将脚本复制到 Cloud Shell 窗口并运行。

  4. 运行以下命令以设置默认地区和项目 ID,这样您就不必在每个后续命令中指定这些值:

    gcloud config set compute/zone ${zone}
    gcloud config set project ${project_id}
    

创建 GKE 集群

  1. 在 Cloud Shell 中,克隆示例代码库:

    git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-customize-fluentd
    

    示例代码库包括 Fluentd 守护进程集的 Kubernetes 清单以及您将在本教程后面部署的测试日志记录程序。

  2. 将您的工作目录更改为克隆的代码库:

    cd kubernetes-engine-customize-fluentd
    
  3. 仅创建具有系统日志记录和监控功能的 GKE 集群:

    gcloud container clusters create gke-with-custom-fluentd \
       --zone us-east1-b \
       --logging=SYSTEM \
       --tags=gke-cluster-with-customized-fluentd \
       --scopes=logging-write,storage-rw
    

部署测试记录器应用

默认情况下,您部署的示例应用会连续发出随机日志记录语句。Docker 容器是根据 test-logger 子目录的源代码构建的。

  1. 在 Cloud Shell 中,构建 test-logger 容器映像:

    docker build -t test-logger test-logger
    
  2. 在推送到注册表之前标记容器:

    docker tag test-logger gcr.io/${project_id}/test-logger
    
  3. 推送容器映像:

    docker push gcr.io/${project_id}/test-logger
    
  4. 更新部署文件:

    envsubst < kubernetes/test-logger.yaml > kubernetes/test-logger-deploy.yaml
    
  5. test-logger 应用部署到 GKE 集群:

    kubectl apply -f kubernetes/test-logger-deploy.yaml
    
  6. 查看 test-logger pod 的状态:

    kubectl get pods
    
  7. 重复此命令,直到输出如下所示,且同时运行所有三个 test-logger pod:

    命令输出显示三个 pod 正在运行

将 Fluentd 守护进程集部署到您的集群

接下来,您将配置和部署 Fluentd 守护进程集。

  1. 在 Cloud Shell 中,部署 Fluentd 配置:

    kubectl apply -f kubernetes/fluentd-configmap.yaml
    
  2. 部署 Fluentd 后台支撑服务集:

    kubectl apply -f kubernetes/fluentd-daemonset.yaml
    
  3. 检查 Fluentd pod 是否已启动:

    kubectl get pods --namespace=kube-system
    

    如果它们正在运行,您会看到如下输出:

    命令输出显示三个 pod 正在运行

  4. 验证您是否在 Logging 中看到日志。在控制台的左侧,选择 Logging > 日志浏览器,然后在资源列表中选择 Kubernetes 容器作为资源类型。

  5. 点击运行查询

  6. 日志字段浏览器中,为 CONTAINER_NAME 选择 test-logger

    Logging 列表,显示未过滤的数据

过滤日志文件中的信息

下一步是指示 Fluentd 在日志中过滤掉某些数据。在本教程中,您将过滤掉社会保障号、信用卡号和电子邮件地址。要进行此更新,请更改后台支撑服务集以使用包含这些过滤器的另一个 ConfigMap。此时,您将使用 Kubernetes 滚动更新功能并保留旧版本的 ConfigMap。

  1. 通过编辑器打开 kubernetes/fluentd-configmap.yaml 文件。

  2. 取消对行 ### sample log scrubbing filters 和行 ### end sample log scrubbing filters 之间所有行(但不包括这两行本身)的注释:

    ############################################################################################################
    #  ### sample log scrubbing filters
    #  #replace social security numbers
    # <filter reform.**>
    #   @type record_transformer
    #   enable_ruby true
    #   <record>
    #     log ${record["log"].gsub(/[0-9]{3}-*[0-9]{2}-*[0-9]{4}/,"xxx-xx-xxxx")}
    #   </record>
    # </filter>
    # # replace credit card numbers that appear in the logs
    # <filter reform.**>
    #   @type record_transformer
    #   enable_ruby true
    #   <record>
    #      log ${record["log"].gsub(/[0-9]{4} *[0-9]{4} *[0-9]{4} *[0-9]{4}/,"xxxx xxxx xxxx xxxx")}
    #   </record>
    # </filter>
    # # replace email addresses that appear in the logs
    # <filter reform.**>
    #   @type record_transformer
    #   enable_ruby true
    #   <record>
    #     log ${record["log"].gsub(/[\w+\-]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+/i,"user@email.tld")}
    #   </record>
    # </filter>
    # ### end sample log scrubbing filters
    #############################################################################################################
  3. 通过修改 metadata.name 字段,将 ConfigMap 的名称从 fluentd-gcp-config 更改为 fluentd-gcp-config-filtered

    name: fluentd-gcp-config
    namespace: kube-system
    labels:
      k8s-app: fluentd-gcp-custom
  4. 保存并关闭文件。

更新 Fluentd 守护进程集以使用新配置

现在,您需要更改 kubernetes/fluentd-daemonset.yaml 以装载 ConfigMap fluentd-gcp-config-filtered 而不是 fluentd-gcp-config

  1. 通过编辑器打开 kubernetes/fluentd-daemonset.yaml 文件。

  2. 通过修改 configMap.name 字段,将 ConfigMap 的名称从 fluentd-gcp-config 更改为 fluentd-gcp-config-filtered

    - configMap:
        defaultMode: 420
        name: fluentd-gcp-config
      name: config-volume
  3. 将新版本的 ConfigMap 部署到您的集群:

    kubectl apply -f kubernetes/fluentd-configmap.yaml
    
  4. 推出新版本的后台支撑服务集:

    kubectl apply -f kubernetes/fluentd-daemonset.yaml
  5. 推出更新并等待它完成更新:

    kubectl rollout status ds/fluentd-gcp --namespace=kube-system
    

    命令输出,显示 3 个 pod“正在等待”消息,然后显示成功

  6. 更新发布完成后,刷新 Logging 日志并确保已过滤掉社会保障号、信用卡号和电子邮件地址数据。

    Logging 列表,显示相同但已过滤的数据

记录节点级事件

如果您希望 GKE 节点上发生的事件也显示在 Logging 中,请将以下行添加到 ConfigMap 中,并按照上一节中的说明操作:

<source>
  @type systemd
  filters [{ "SYSLOG_IDENTIFIER": "sshd" }]
  pos_file /var/log/journal/gcp-journald-ssh.pos
  read_from_head true
  tag sshd
</source>

<source>
  @type systemd
  filters [{ "SYSLOG_IDENTIFIER": "sudo" }]
  pos_file /var/log/journal/gcp-journald-sudo.pos
  read_from_head true
  tag sudo
</source>

清除数据

完成本教程后,您可以清理您在 Google Cloud 上创建的资源,以免这些资源将来产生费用。

删除项目

为了避免产生费用,最简单的方法是删除您为本教程创建的项目。

如需删除项目,请执行以下操作:

  1. 在 Google Cloud 控制台中,进入管理资源页面。

    转到“管理资源”

  2. 在项目列表中,选择要删除的项目,然后点击删除
  3. 在对话框中输入项目 ID,然后点击关闭以删除项目。

删除 GKE 集群

如果您不想删除整个项目,请运行以下命令删除 GKE 集群:

gcloud container clusters delete gke-with-custom-fluentd --zone us-east1-b

后续步骤