本頁面說明如何為 Google Kubernetes Engine (GKE) 叢集設定多租戶記錄功能。
多個團隊共用單一 GKE 叢集是很常見的做法。共用叢集有多項優點,包括更容易探索服務、簡化安全性,以及叢集管理員需要維護的叢集較少。不過,個別應用程式團隊通常會有自己的獨立專案。這種結構具有主要 GKE 叢集,但每個應用程式團隊都有各自的命名空間,稱為多租戶。應用程式團隊的專案稱為「租戶」。
透過 Google Cloud,GKE 叢集管理員可以建立系統,讓叢集的記錄檔保留在主要 GKE 專案中,並將租戶記錄檔分配至租戶專案。如要透過這種方式設定記錄,請使用記錄路由器。記錄檔路由器可讓您控管記錄檔在 Google Cloud 專案中的流動方式,以及記錄檔轉送至支援目的地的路徑。
如要建立租戶專屬記錄,叢集管理員會建立接收器,將記錄項目轉送至各租戶的專案。在每個租戶專案中,個別團隊可以控管記錄的儲存和使用方式,例如設定記錄指標和記錄警告來監控記錄。
建議主要 GKE 專案中的 _Default 接收器包含排除篩選器。排除篩選器會防止租戶記錄檔擷取至主要 GKE 專案和租戶專案。
必要條件
- 請詳閱下列多用戶群和路由相關文件:
- 確認您已有租戶專案和主要專案。
設定多租戶記錄功能
您可以使用 Google Cloud CLI 或Google Cloud 控制台設定多租戶記錄。
gcloud
如要為 GKE 叢集設定多租戶記錄功能,請完成下列步驟:
請設定下列環境變數:
export TENANT_NAMESPACE="TENANT_NAMESPACE" export MAIN_PROJECT="MAIN_PROJECT_ID" export TENANT_PROJECT="TENANT_PROJECT_ID"更改下列內容:
TENANT_NAMESPACE:租戶專案命名空間的名稱MAIN_PROJECT_ID:主要專案的專案 IDTENANT_PROJECT_ID:租戶專案的專案 ID
在多租戶叢集中建立命名空間:
kubectl create namespace $TENANT_NAMESPACE在主要 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 createAPI 說明文件。從主要專案中的接收器取得寫入者身分,並指派給環境變數。
export SERVICE_ACCOUNT=$(gcloud logging sinks describe gke-$TENANT_NAMESPACE-sink \ --project=$MAIN_PROJECT \ --format='value(writerIdentity)')將「記錄檔寫入者」(
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-bindingAPI 說明文件。(選用) 為接收器建立排除篩選器,將記錄檔轉送至主要專案的
_Defaultbucket。如未在_Defaultbucket 建立排除篩選器,轉送的記錄會同時顯示在主要專案的_Defaultbucket 和租戶記錄檔 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 updateAPI 說明文件。
控制台
如要為 GKE 實作多租戶記錄功能,請完成下列步驟:
在主要專案中建立記錄檔接收器:
- 使用 Google Cloud 控制台專案挑選器,選取主要的 GKE 專案。
-
前往 Google Cloud 控制台的「Log Router」(記錄檔路由器) 頁面:
如果您是使用搜尋列尋找這個頁面,請選取子標題為「Logging」的結果。
- 在「記錄檔路由器」頁面中,按一下「建立接收器」。
- 輸入接收器的「名稱」和「說明」,然後按一下「下一步」。
- 在「選取接收器服務」選單中,選取「其他專案」。
在「接收器目的地」欄位中,新增下列目的地:
logging.googleapis.com/projects/TENANT_PROJECT_ID將
TENANT_PROJECT_ID替換為租戶專案的專案 ID。點選「下一步」。
在「Build inclusion filter」(建立「包含」篩選器) 中,新增下列篩選器:
resource.labels.namespace_name="TENANT_NAMESPACE"將 TENANT_NAMESPACE 替換為租戶專案的命名空間名稱。
您可能需要更嚴格的「包含」篩選器。舉例來說,如果叢集和租戶具有相同的命名空間,請考慮新增子句,只納入特定叢集的記錄項目。
按一下「建立接收器」。新的接收器會顯示在「Log Router Sinks」(記錄檔路由器接收器) 清單中。
將接收器的寫入者身分複製到剪貼簿:
- 在「記錄檔路由器」頁面中,找出記錄檔接收器。
- 按一下該接收器的 「More」(更多),然後選取「View sink details」(查看接收器詳細資料)。
- 在「接收器詳細資料」窗格中,找到「寫入者身分」欄位,然後將值複製到剪貼簿。從複製的值中省略
serviceAccount:。
在租戶專案中,將記錄檔寫入者 (
roles/logging.logWriter) 角色授予主要專案接收器使用的服務帳戶。主要專案需要這項權限,才能將記錄寫入租戶專案。-
前往 Google Cloud 控制台的「IAM」頁面:
如果您是使用搜尋列尋找這個頁面,請選取子標題為「IAM & Admin」(IAM 與管理) 的結果。
- 按一下「授予存取權」。
- 在「新增主體」欄位中,新增接收器的服務帳戶。
- 在「Select a role」(選取角色) 下拉式選單中,依序選取「Logging」(記錄) 和「Logs Writer」(記錄寫入者)。
- 按一下 [儲存]。
-
(選用) 在主要專案的
_Defaultbucket 中建立排除篩選器,防止轉送至租戶專案的記錄檔寫入主要專案的_Default記錄檔 bucket:-
前往 Google Cloud 控制台的「Log Router」(記錄檔路由器) 頁面:
如果您是使用搜尋列尋找這個頁面,請選取子標題為「Logging」的結果。
- 按一下
_Defaultbucket 旁的 「More」(更多),然後選取「Edit sink」(編輯接收器)。 - 在「Choose logs to filter out of sink」(選擇要從接收器排除的記錄檔) 區段中,按一下「Add exclusion」(新增排除項目)。
- 新增篩選器名稱。
在「建立排除篩選器」方塊中,新增下列項目:
resource.labels.namespace_name="TENANT_NAMESPACE"按一下「Update sink」(更新接收器)。
-
驗證租戶記錄
開始使用採用 TENANT_NAMESPACE 的工作負載後,您可以驗證租戶專案是否收到租戶專屬記錄:
- 使用 Google Cloud 控制台專案挑選器選取租戶專案。
-
前往 Google Cloud 控制台的 「Logs Explorer」頁面:
如果您是使用搜尋列尋找這個頁面,請選取子標題為「Logging」的結果。
在查詢編輯器欄位中,執行下列查詢:
resource.labels.namespace_name="TENANT_NAMESPACE"在「查詢結果」窗格中,您應該會看到從主要專案路由傳送的租戶專屬記錄。
使用租戶記錄
在租戶專案中,每個團隊都能控管記錄的傳送、儲存和分析方式。記錄檔轉送至租戶專案後,個別應用程式團隊可以選擇將記錄檔轉送至支援的目的地 (例如 Logging bucket),或使用 Pub/Sub 轉送至第三方目的地。如要瞭解如何轉送記錄項目,請參閱「轉送記錄檔至支援的目的地」。
個別應用程式團隊也可以根據記錄檔內容或從記錄檔衍生的指標設定快訊。詳情請參閱「監控記錄」。
清除所用資源
您可以使用gcloud或 Google Cloud 控制台,移除為多租戶記錄建立的物件。
gcloud
如要移除為多租戶記錄建立的物件,請完成下列步驟:
設定變數,簡化下列指令:
export TENANT_NAMESPACE="TENANT_NAMESPACE" export MAIN_PROJECT="MAIN_PROJECT_ID" export TENANT_PROJECT="TENANT_PROJECT_ID"更改下列內容:
TENANT_NAMESPACE:租戶專案命名空間的名稱MAIN-PROJECT-ID:主要專案的專案 IDTENANT-PROJECT-ID:租戶專案的專案 ID
從租戶專案的服務帳戶中移除「記錄檔寫入者」(
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刪除記錄檔接收器:
gcloud logging sinks delete gke-$TENANT_NAMESPACE-sink \ --project=$MAIN_PROJECT刪除命名空間:
kubectl delete namespace $TENANT_NAMESPACE
控制台
在租戶專案中,從服務帳戶移除「記錄檔寫入者」(
roles/logging.logWriter) 角色:-
前往 Google Cloud 控制台的「IAM」頁面:
如果您是使用搜尋列尋找這個頁面,請選取子標題為「IAM & Admin」(IAM 與管理) 的結果。
- 找到要刪除的服務帳戶,然後按一下 edit「編輯主體」。
- 在「編輯權限」面板中,按一下「記錄寫入者」角色旁的 「刪除角色」,然後按一下「儲存」。
-
在主要專案中,刪除記錄檔接收器:
- 使用 Google Cloud 控制台專案挑選器,選取租戶 GKE 專案。
-
前往 Google Cloud 控制台的「Log Router」(記錄檔路由器) 頁面:
如果您是使用搜尋列尋找這個頁面,請選取子標題為「Logging」的結果。
- 找出要刪除的接收器,然後按一下「更多」圖示 more_vert。
- 選取「刪除接收器」。
- 在確認面板中,按一下「刪除」。
限制
多租戶記錄功能有下列限制:
- 每項專案的記錄檔接收器數量配額為 200 個。如需超過 200 個房客,請建立支援案件,要求提高配額。
每個記錄檔 bucket 最多只能有 50 個排除篩選器。如果您打算擁有超過 50 個租戶,則必須修改
_Defaultbucket 的排除篩選器方法。或者,您也可以採取下列做法:使用下列指令建立單一排除篩選器,排除所有非系統或非預設的命名空間:
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\""不建立排除篩選器,在租戶專案和主要專案之間複製記錄。