設定多用戶群記錄


本頁說明如何為 Google Kubernetes Engine (GKE) 叢集設定多用戶群記錄功能。

多個團隊共用單一 GKE 叢集是很常見的情況。共用叢集有多項優點,包括簡化服務探索和安全防護,以及減少叢集管理員需要維護的叢集數量。不過,個別應用程式團隊通常會有自己的獨立專案。這種結構具有主要 GKE 叢集,但每個應用程式團隊都有各自的命名空間,稱為多租戶。應用程式團隊的專案稱為「租戶」

透過 Google Cloud,GKE 叢集管理員可以建立系統,讓叢集的記錄檔保留在主要 GKE 專案中,並將租戶記錄檔分配給租戶專案。如要透過這種方式設定記錄,請使用記錄路由器。您可以透過記錄檔路由器,控管記錄檔在 Google Cloud 專案中的流動方式,以及記錄檔轉送至支援目的地的路徑。

如要建立租戶專屬記錄,叢集管理員必須建立接收器,將記錄項目傳送至各租戶的專案。在每個租戶專案中,各個團隊可以控管記錄的儲存和使用方式,例如設定記錄指標和記錄快訊,監控記錄。

建議您在主要 GKE 專案中,為接收器加入排除篩選器_Default排除篩選器可防止系統在主要 GKE 專案和租戶專案中,擷取租戶記錄。

必要條件

設定多租戶記錄

您可以使用 Google Cloud CLI 或Google Cloud 控制台設定多租戶記錄。

gcloud

如要為 GKE 叢集設定多租戶記錄功能,請完成下列步驟:

  1. 設定下列環境變數:

    export TENANT_NAMESPACE="TENANT_NAMESPACE"
    export MAIN_PROJECT="MAIN_PROJECT_ID"
    export TENANT_PROJECT="TENANT_PROJECT_ID"
    

    更改下列內容:

    • TENANT_NAMESPACE:租戶專案命名空間的名稱
    • MAIN_PROJECT_ID:主要專案的專案 ID
    • TENANT_PROJECT_ID:租戶專案的專案 ID
  2. 在多租戶叢集中建立命名空間:

    kubectl create namespace $TENANT_NAMESPACE
    
  3. 主要 GKE 專案中建立記錄接收器:

    gcloud logging sinks create gke-$TENANT_NAMESPACE-sink \
    logging.googleapis.com/projects/$TENANT_PROJECT \
        --project=$MAIN_PROJECT \
        --log-filter=resource.labels.namespace_name="$TENANT_NAMESPACE" \
        --description="Log sink to $TENANT_PROJECT for $TENANT_NAMESPACE namespace"
    

    這項指令會建立記錄接收器,將與 $TENANT_NAMESPACE 命名空間相關的所有記錄傳送至租戶專案。

    您可能需要使用限制更嚴格的 --log-filter。舉例來說,如果叢集和租戶的命名空間相同,請新增叢集篩選器。

    如要進一步瞭解這些欄位,請參閱 gcloud logging sinks create API 說明文件

  4. 從主要專案的接收器取得寫入者身分,並指派給環境變數。

    export SERVICE_ACCOUNT=$(gcloud logging sinks describe gke-$TENANT_NAMESPACE-sink \
        --project=$MAIN_PROJECT \
        --format='value(writerIdentity)')
    
  5. 將「記錄檔寫入者」(logging.bucketWriter) 角色指派給接收器使用的服務帳戶。下列指令會授予主要專案權限,將記錄寫入租戶專案:

     gcloud projects add-iam-policy-binding $TENANT_PROJECT \
         --member=$SERVICE_ACCOUNT --role='roles/logging.logWriter' \
         --condition="expression=resource.name.endsWith(\"projects/$TENANT_PROJECT\"),title=Log writer for $TENANT_NAMESPACE,description=Grants Logs Writer role to service account $SERVICE_ACCOUNT used by gke-$TENANT_NAMESPACE-sink"
    

    如要進一步瞭解這些欄位,請參閱 gcloud projects add-iam-policy-binding API 說明文件

  6. (選用) 為接收器建立排除篩選器,將記錄檔轉送至主要專案的 _Default 值區。如果未在 _Default bucket 中建立排除篩選器,則路由傳送的記錄會同時顯示在主要專案的 _Default bucket 和租戶記錄 bucket 中。如要建立排除篩選器,請按照下列步驟操作:

    gcloud logging sinks update _Default --project=$MAIN_PROJECT \
        --add-exclusion="name=gke-$TENANT_NAMESPACE-default-exclusion,description=\"Exclusion filter on the _Default bucket for $TENANT_NAMESPACE\",filter=resource.labels.namespace_name=\"$TENANT_NAMESPACE\""
    

    如要進一步瞭解這些欄位,請參閱 gcloud logging sinks update API 說明文件

控制台

如要為 GKE 實作多用戶群記錄功能,請完成下列步驟:

  1. 在主要專案中建立記錄接收器:

    1. 使用 Google Cloud 控制台專案選取器,選取主要的 GKE 專案。
    2. 前往 Google Cloud 控制台的「記錄檔路由器」頁面:

      前往「記錄檔路由器」

      如果您是使用搜尋列尋找這個頁面,請選取子標題為「Logging」的結果

    3. 在「Log Router」(記錄檔路由器) 頁面中,按一下「Create sink」(建立接收器)
    4. 輸入接收器的「名稱」和「說明」,然後按一下「下一步」
    5. 在「Select sink service」(選取接收器服務) 選單中,選取「Other project」(其他專案)
    6. 在「接收器目的地」欄位中,新增下列目的地:

      logging.googleapis.com/projects/TENANT_PROJECT_ID
      

      TENANT_PROJECT_ID 替換為租戶專案的專案 ID。

    7. 點選「下一步」

    8. 在「建立『包含』篩選器」中,新增下列篩選器:

      resource.labels.namespace_name="TENANT_NAMESPACE"
      

      TENANT_NAMESPACE 替換為租戶專案命名空間的名稱。

      您可能需要限制性較高的「包含」篩選器。舉例來說,如果叢集和租戶的命名空間相同,請考慮新增子句,只納入特定叢集的記錄項目。

    9. 按一下「建立接收器」。新的接收器會顯示在「記錄檔路由器接收器」清單中。

  2. 將接收器的寫入者身分複製到剪貼簿:

    1. 在「記錄檔路由器」頁面中,找出記錄檔接收器。
    2. 針對該接收器,按一下「更多」圖示 ,然後選取「查看接收器詳細資料」
    3. 在「接收器詳細資料」窗格中,找到「寫入者身分」欄位,然後將值複製到剪貼簿。從複製的值中省略 serviceAccount:
  3. 在租戶專案中,將記錄寫入者 (roles/logging.logWriter) 角色授予主要專案接收器使用的服務帳戶。主要專案需要這項權限,才能將記錄寫入租戶專案。

    1. 前往 Google Cloud 控制台的「IAM」IAM頁面:

      前往 IAM

      如果您是使用搜尋列尋找這個頁面,請選取子標題為「IAM & Admin」的結果

    2. 按一下「授予存取權」
    3. 在「新增主體」欄位中,新增接收器的服務帳戶。
    4. 從「Select a role」(選取角色) 下拉式選單中,選取「Logging」(記錄),然後選擇「Logs Writer」(記錄寫入者)
    5. 按一下 [儲存]
  4. 視需要,在主要專案的 _Default bucket 中建立排除篩選器,防止轉送至租戶專案的記錄檔寫入主要專案的 _Default 記錄 bucket:

    1. 前往 Google Cloud 控制台的「記錄檔路由器」頁面:

      前往「記錄檔路由器」

      如果您是使用搜尋列尋找這個頁面,請選取子標題為「Logging」的結果

    2. 按一下 _Default 值區旁的「更多」 ,然後選取「編輯接收器」
    3. 在「選擇要從接收器排除的記錄檔」部分中,按一下「新增排除條件」
    4. 新增篩選器名稱。
    5. 在「建立排除篩選器」方塊中,新增下列項目:

      resource.labels.namespace_name="TENANT_NAMESPACE"
      
    6. 按一下「更新接收器」

驗證租戶記錄

開始使用採用 TENANT_NAMESPACE 的工作負載後,您可以確認租戶專案是否收到租戶專屬記錄:

  1. 使用 Google Cloud 控制台專案挑選器選取租戶專案。
  2. 前往 Google Cloud 控制台的「Logs Explorer」頁面:

    前往「Logs Explorer」(記錄檔探索工具)

    如果您是使用搜尋列尋找這個頁面,請選取子標題為「Logging」的結果

  3. 在查詢編輯器欄位中執行下列查詢:

    resource.labels.namespace_name="TENANT_NAMESPACE"
    

    在「查詢結果」窗格中,您應該會看到從主要專案路由傳送的租戶專屬記錄。

使用租戶記錄

在租戶專案中,每個團隊都能控管記錄檔的傳送、儲存及分析方式。記錄檔路由至租戶專案後,個別應用程式團隊可以選擇將記錄檔路由至支援的目的地 (例如記錄檔儲存空間),或使用 Pub/Sub 路由至第三方目的地。如要瞭解如何轉送記錄項目,請參閱「將記錄轉送至支援的目的地」。

個別應用程式團隊也可以根據記錄檔內容或從記錄檔衍生的指標設定快訊。詳情請參閱「監控記錄」。

清除所用資源

您可以使用 gcloud 或 Google Cloud 控制台,移除為多租戶記錄功能建立的物件。

gcloud

如要移除為多租戶記錄建立的物件,請完成下列步驟:

  1. 設定變數,簡化下列指令:

    export TENANT_NAMESPACE="TENANT_NAMESPACE"
    export MAIN_PROJECT="MAIN_PROJECT_ID"
    export TENANT_PROJECT="TENANT_PROJECT_ID"
    

    更改下列內容:

    • TENANT_NAMESPACE:租戶專案命名空間的名稱
    • MAIN-PROJECT-ID:主要專案的專案 ID
    • TENANT-PROJECT-ID:租戶專案的專案 ID
  2. 從租戶專案的服務帳戶中,移除「記錄檔寫入者」(roles/logging.logWriter) 角色:

    export SERVICE_ACCOUNT=$(gcloud logging sinks describe gke-$TENANT_NAMESPACE-sink \
        --project=$MAIN_PROJECT | \
        --format='value(writerIdentity)'
    
    gcloud projects remove-iam-policy-binding $TENANT_PROJECT \
        --member=$SERVICE_ACCOUNT \
        --role='roles/logging.logWriter' \
        --all
    
  3. 刪除記錄接收器:

    gcloud logging sinks delete gke-$TENANT_NAMESPACE-sink \
        --project=$MAIN_PROJECT
    
  4. 刪除命名空間:

    kubectl delete namespace $TENANT_NAMESPACE
    

控制台

  1. 在租戶專案中,從服務帳戶移除「記錄檔寫入者」(roles/logging.logWriter) 角色:

    1. 前往 Google Cloud 控制台的「IAM」IAM頁面:

      前往 IAM

      如果您是使用搜尋列尋找這個頁面,請選取子標題為「IAM & Admin」的結果

    2. 找到要刪除的服務帳戶,然後按一下 「Edit principal」(編輯主體)
    3. 在「編輯存取權」面板中,按一下「記錄檔寫入者」角色旁的 「刪除角色」,然後按一下「儲存」
  2. 在主要專案中,刪除記錄接收器:

    1. 使用 Google Cloud 控制台專案選擇工具,選取租戶 GKE 專案。
    2. 前往 Google Cloud 控制台的「記錄檔路由器」頁面:

      前往「記錄檔路由器」

      如果您是使用搜尋列尋找這個頁面,請選取子標題為「Logging」的結果

    3. 找出要刪除的接收器,然後按一下「更多」圖示
    4. 選取「刪除接收器」
    5. 在確認面板中,按一下「刪除」

限制

多租戶記錄功能有下列限制:

  • 每個專案的記錄接收器數量配額為 200 個。如果需要超過 200 個房客,請提交客服案件,要求增加配額。
  • 每個記錄檔儲存空間最多只能有 50 個排除篩選器。如果您打算使用超過 50 個租戶,則需要修訂 _Default 值區的排除篩選器方法。您也可以採取下列做法:

    • 使用下列指令建立單一排除篩選器,排除所有非系統或非預設的命名空間:

      gcloud logging sinks update _Default \
      --project=$MAIN_PROJECT \
      --add-exclusion="name=gke-all-tenant-default-exclusion,description=\"Exclusion filter on the _Default bucket for all tenants\",filter=resource.labels.namespace_name !~ \"kube\" AND resource.labels.namespace_name !~ \"system\ AND resource.labels.namespace_name != \"Default\""
      
    • 如果未建立排除篩選器,系統會在租戶專案和主要專案之間複製記錄。

後續步驟