使用 Fluentd 自訂 Google Kubernetes Engine 的 Stackdriver 記錄

本教學課程說明如何為 Google Kubernetes Engine 叢集自訂 Fluentd 記錄。您將瞭解如何託管自己的可設定 Fluentd Daemonset,以將記錄傳送至 Stackdriver,而非在建立 Google Kubernetes Engine (GKE) 叢集時選取雲端記錄選項。後者不允許您設定 Fluentd Daemon。

目標

  • 在設定為將資料記錄至 Stackdriver 的 Google Kubernetes Engine 叢集上,部署您自己的 Fluentd Daemonset。我們假設您已熟悉如何使用 Kubernetes
  • 自訂 GKE 記錄以移除 Stackdriver 記錄中的機密資料。
  • 自訂 GKE 記錄以將節點層級事件新增至 Stackdriver 記錄

費用

本教學課程使用的 Cloud Platform 可計費元件包括:

Pricing Calculator 預估這個環境的費用約為 8 小時 $1.14 美元。

事前準備

  1. 登入您的 Google 帳戶。

    如果您沒有帳戶,請申請新帳戶

  2. 選取或建立 Google Cloud Platform 專案。

    前往「Manage resources」(管理資源) 頁面

  3. 請確認您已啟用 Google Cloud Platform 專案的計費功能。

    瞭解如何啟用計費功能

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

    啟用 API

初始化常用變數

您必須定義多個變數,以控制基礎架構的元素的部署位置。

  1. 使用文字編輯器編輯下列指令碼。請將 [YOUR_PROJECT_ID] 改成您的專案 ID。指令碼會將地區設為 us-east-1。如果您對指令碼進行了任何變更,請確認區域值會參照您指定的地區。

    region=us-east1
    zone=${region}-b
    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 叢集

除非另有說明,請在電腦的指令列或 Cloud Shell 中輸入本教學課程的所有指令。

  1. 複製範例存放區。範例存放區包含 Fluentd Daemonset 的 Kubernetes 資訊清單,以及您將部署的測試記錄程式:

    git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-customize-fluentd
    
  2. 將工作目錄變更為複製的存放區:

    cd kubernetes-engine-customize-fluentd
    
  3. 在未開啟 Cloud Logging 的狀態下建立 GKE 叢集:

    gcloud beta container clusters create gke-with-custom-fluentd \
       --zone us-east1-b \
       --no-enable-cloud-logging \
       --tags=gke-cluster-with-customized-fluentd \
       --scopes=logging-write
    

部署測試記錄器應用程式

根據預設,您持續部署的範例應用程式會產生隨機記錄陳述式。您可在 gcr.io/cloud-solutions-images/test-logger 取得它使用的 Docker 容器,而其原始碼則位於 test-logger 子目錄中。

  1. test-logger 應用程式部署至 GKE 叢集:

    kubectl apply -f kubernetes/test-logger.yaml
    
  2. 查看 test-logger pod 的狀態:

    kubectl get pods
    
  3. 重複執行這個指令,直到輸出如下所示,三個 test-logger pod 都在執行中的狀態:

    顯示正在執行的三個 pod 的指令輸出

將 Fluentd Daemonset 部署至您的叢集

接下來,您將設定及部署 Fluentd Daemonset。

  1. 部署 Fluentd 設定:

    kubectl apply -f kubernetes/fluentd-configmap.yaml
    
  2. 部署 Fluentd Daemonset:

    kubectl apply -f kubernetes/fluentd-daemonset.yaml
    
  3. 檢查 Fluentd pod 是否已啟動:

    kubectl get pods --namespace=kube-system
    

    如果 pod 正在執行,您會看到如下輸出:

    顯示正在執行的三個 pod 的指令輸出

  4. 確認您是在 Stackdriver 中查看記錄。在主控台的左側選單中,按一下 [Stackdriver] > [Logging] (記錄) > [Logs] (記錄),然後選取清單中的 [Kubernetes Container] (Kubernetes 容器)

    顯示未篩選資料的 Stackdriver 清單

從記錄檔中篩選資訊

下一步是指定 Fluentd 篩選出某些資料,讓系統不要記錄這些資料。針對本教學課程,您將篩選出身分證字號、信用卡號碼和電子郵件地址。如要進行這項更新,請將 Daemonset 變更為使用包含這些篩選條件的 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 Daemonset 更新為使用新設定

現在,您可以將 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. 推出新版 Daemonset:

    kubectl apply -f kubernetes/fluentd-daemonset.yaml
  5. 推出更新,並等候該程序完成:

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

    顯示 3 個 pod 的「等待中」以及成功訊息的指令輸出

  6. 推出完成後,請重新整理 Stackdriver 記錄,確認系統已篩選出身分證字號、信用卡號碼和電子郵件地址資料。

    顯示相同資料但已經過篩選的 Stackdriver 清單

記錄節點層級事件

如果您想讓 GKE 節點中發生的事件也顯示在 Stackdriver 中,請將以下指令列新增至 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>

清除所用資源

完成本教學課程後,您可以清除在 GCP 上建立的資源,這樣日後就不需再為這些資源付費。

刪除專案

如要避免付費,最簡單的方法就是刪除您為了本教學課程所建立的專案。

如要刪除專案,請執行以下操作:

  1. 前往 GCP 主控台的「Projects」(專案) 頁面。

    前往專案頁面

  2. 在專案清單中選取要刪除的專案,然後按一下 [Delete] (刪除)
  3. 在對話方塊中輸入專案 ID,按一下 [Shut down] (關閉) 即可刪除專案。

刪除 GKE 叢集

如果您不想刪除整個專案,請執行下列指令以刪除 GKE 叢集:

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

後續步驟

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
解決方案