使用 Fluentd 自訂 Kubernetes Engine 的 Stackdriver 記錄

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

目標

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

費用

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

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

事前準備

  1. 登入您的 Google 帳戶。

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

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

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

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

    瞭解如何啟用計費功能

  4. {% dynamic if "no_credentials" in setvar.task_params %}{% dynamic setvar credential_type %}NO_AUTH{% dynamic endsetvar %}{% dynamic if not setvar.redirect_url %}{% dynamic setvar redirect_url %}https://console.cloud.google.com{% dynamic endsetvar %}{% dynamic endif %}{% dynamic endif %}{% dynamic if setvar.in_henhouse_no_auth_whitelist %}{% dynamic if not setvar.credential_type %}{% dynamic setvar credential_type %}NO_AUTH{% dynamic endsetvar %}{% dynamic endif %}{% dynamic elif setvar.in_henhouse_service_account_whitelist %}{% dynamic if not setvar.credential_type %}{% dynamic setvar credential_type %}SERVICE_ACCOUNT{% dynamic endsetvar %}{% dynamic endif %}{% dynamic endif %}{% dynamic if not setvar.service_account_roles and setvar.credential_type == "SERVICE_ACCOUNT" %}{% dynamic setvar service_account_roles %}{% dynamic endsetvar %}{% dynamic endif %}{% dynamic setvar console %}{% dynamic if "no_steps" not in setvar.task_params %}
  5. {% dynamic endif %}{% dynamic if setvar.api_list %}{% dynamic if setvar.in_henhouse_no_auth_whitelist or setvar.in_henhouse_service_account_whitelist %} 設定 GCP 主控台專案。

    設定專案

    按一下即可:

    • 建立或選取專案。
    • 啟用該專案的{% dynamic if setvar.api_names %}{% dynamic print setvar.api_names %}{% dynamic else %}必要{% dynamic endif %}{% dynamic if "," in setvar.api_list %} API{% dynamic elif "API" in setvar.api_names %}{% dynamic else %} API{% dynamic endif %}。
    • {% dynamic if setvar.credential_type == 'SERVICE_ACCOUNT' %}
    • 建立服務帳戶。
    • 將私密金鑰下載為 JSON。
    • {% dynamic endif %}

    您可以隨時在 GCP 主控台中查看及管理這些資源。

    {% dynamic else %}{% dynamic if "no_text" not in setvar.task_params %} 啟用{% dynamic if setvar.api_names %}{% dynamic print setvar.api_names %}{% dynamic else %}必要的{% dynamic endif %}{% dynamic if "," in setvar.api_list %} API{% dynamic elif "API" in setvar.api_names %}{% dynamic else %} API{% dynamic endif %}。 {% dynamic endif %}

    啟用{% dynamic if "," in setvar.api_list %} API{% dynamic else %} API{% dynamic endif %}

    {% dynamic endif %}{% dynamic endif %}{% dynamic if "no_steps" not in setvar.task_params %}
  6. {% dynamic endif %}{% dynamic endsetvar %}{% dynamic print setvar.console %}

初始化常用變數

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

  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 叢集。這個服務帳戶會是在下方部署的 Daemonset 中執行的 Fluentd 代理程式的應用程式預設憑證

  1. 建立服務帳戶:

    gcloud iam service-accounts create cluster-service-account \
        --display-name "cluster-service-account"
    

  2. logging.logWriter 角色新增至服務帳戶:

    gcloud projects add-iam-policy-binding ${project_id} \
        --member serviceAccount:cluster-service-account@${project_id}.iam.gserviceaccount.com \
        --role roles/logging.logWriter
    

  3. monitoring.metricWriter 角色新增至服務帳戶:

    gcloud projects add-iam-policy-binding ${project_id} \
       --member serviceAccount:cluster-service-account@${project_id}.iam.gserviceaccount.com \
       --role roles/monitoring.metricWriter
    

  4. container.admin 角色新增至服務帳戶:

    gcloud projects add-iam-policy-binding ${project_id} \
       --member serviceAccount:cluster-service-account@${project_id}.iam.gserviceaccount.com \
       --role roles/container.admin
    

建立 GKE 叢集

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

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

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

  2. 將工作目錄變更為複製的存放區:

    cd container-engine-customize-fluentd
    

  3. 在未開啟 Cloud Logging 的狀態下建立 GKE 叢集:

    gcloud beta container clusters create gke-with-custom-fluentd \
        --service-account=cluster-service-account@${project_id}.iam.gserviceaccount.com \
        --zone us-east1-b \
        --no-enable-cloud-logging \
        --tags=gke-cluster-with-customized-fluentd
    

部署測試記錄器應用程式

根據預設,您持續部署的範例應用程式會產生隨機記錄陳述式。您可在 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] (記錄),然後選取清單中的 [GKE cluster] (GKE 叢集)

    顯示未篩選資料的 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-filtered.yaml 檔案會掛接 fluentd-gcp-config-filtered ConfigMap,而不是 fluentd-gcp-config

- configMap:
    defaultMode: 420
    name: fluentd-gcp-config-filtered
  1. 將新版 ConfigMap 部署至叢集:

    kubectl apply -f kubernetes/fluentd-configmap.yaml
    

  2. 推出新版 Daemonset:

    kubectl apply -f kubernetes/fluentd-daemonset-filtered.yaml

  3. 推出更新,並等候該程序完成:

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

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

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

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

清除所用資源

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

刪除專案

要想避免付費,最簡單的方法就是刪除您針對教學課程建立的專案。

若要刪除專案,請進行以下操作:

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

    前往專案頁面

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

刪除 GKE 叢集

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

gcloud container clusters delete gke-with-custom-fluentd

刪除服務帳戶

若您只要刪除服務帳戶,請執行下列指令:

gcloud projects remove-iam-policy-binding ${project_id} \
    --member serviceAccount:cluster-service-account@${project_id}.iam.gserviceaccount.com \
    --role roles/logging.logWriter

gcloud projects remove-iam-policy-binding ${project_id} \
    --member serviceAccount:cluster-service-account@${project_id}.iam.gserviceaccount.com \
    --role roles/monitoring.metricWriter

gcloud projects remove-iam-policy-binding ${project_id} \
    --member serviceAccount:cluster-service-account@${project_id}.iam.gserviceaccount.com \
    --role roles/container.admin

gcloud iam service-accounts delete \
    "cluster-service-account@${project_id}.iam.gserviceaccount.com"

後續步驟

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

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

這個網頁
解決方案