使用限制範本庫

本頁面說明如何使用 Google 提供的現有限制範本,定義 Policy Controller 限制。

本頁內容適用於 IT 管理員和營運人員,他們希望確保雲端平台中執行的所有資源都符合機構的法規遵循規定,因此提供並維護自動化功能來稽核或強制執行,以及使用宣告式設定的範本。如要進一步瞭解 Google Cloud 內容中提及的常見角色和範例工作,請參閱常見的 GKE Enterprise 使用者角色和工作

您可以定義一或多個限制物件,透過 Policy Controller 為 Kubernetes 叢集強制執行政策。安裝限制後,系統會根據限制檢查 API 伺服器的要求,如果不符合規定,就會拒絕要求。系統會在稽核時間回報先前不符規定的資源。

每個限制都以限制範本為基礎,定義限制的結構定義和邏輯。限制範本可來自 Google 和第三方,您也可以自行編寫。如要進一步瞭解如何建立新範本,請參閱「編寫限制範本」。

事前準備

檢查限制範本庫

定義限制時,您會指定限制範本的擴充範圍。系統預設會安裝 Google 開發的常見限制範本庫,許多機構不需要直接在 Rego 中建立自訂限制範本。Google 提供的限制範本會標示 configmanagement.gke.io/configmanagement

如要列出限制,請使用下列指令:

kubectl get constrainttemplates \
    -l="configmanagement.gke.io/configmanagement=config-management"

如要說明限制範本並檢查必要參數,請使用下列指令:

kubectl describe constrainttemplate CONSTRAINT_TEMPLATE_NAME

您也可以查看程式庫中的所有限制範本

定義限制

您可以使用 YAML 定義限制,不必瞭解或編寫 Rego。限制會叫用限制範本,並提供限制專屬的參數。

如果您使用 Config Sync 和階層式存放區,建議在 cluster/ 目錄中建立限制。

限制條件具有下列欄位:

  • 小寫的 kind 與限制範本的名稱相符。
  • metadata.name 是限制的名稱。
  • match 欄位會定義限制適用的物件。物件必須符合所有指定條件,才會納入限制的範圍。match 條件是由下列子欄位定義:
    • kinds 是限制條件適用的資源類型,由兩個欄位決定:apiGroups 是相符的 Kubernetes API 群組清單,kinds 則是相符的類型清單。「*」會比對所有內容。 如果至少有一個 apiGroup 和一個 kind 項目相符,即滿足 kinds 條件。
    • scope 接受 *、Cluster 或 Namespaced,決定是否選取叢集範圍或命名空間範圍的資源 (預設為 *)。
    • namespaces 是物件可隸屬的命名空間名稱清單。物件必須屬於至少一個命名空間。命名空間資源會視為屬於自身。
    • excludedNamespaces 是物件不得所屬的命名空間清單。
    • labelSelector 是物件必須符合的 Kubernetes 標籤選取器。
    • namespaceSelector 是物件所屬命名空間的標籤選取器。 如果命名空間不符合物件,就不會相符。命名空間資源會視為屬於自己。
  • parameters 欄位會根據限制範本的預期內容,定義限制的引數。

下列名為 ns-must-have-geo 的限制會叫用名為 K8sRequiredLabels 的限制範本,該範本包含在 Google 提供的限制範本庫中。限制會定義限制範本使用的參數,以評估命名空間是否已將 geo 標籤設為某個值。

# ns-must-have-geo.yaml

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sRequiredLabels
metadata:
  name: ns-must-have-geo
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Namespace"]
  parameters:
    labels:
      - key: "geo"

如要建立限制,請使用 kubectl apply -f

kubectl apply -f ns-must-have-geo.yaml

稽核限制

如果限制條件已正確設定及安裝,無論限制條件是設為強制執行或僅測試,其 status.byPod[].enforced 欄位都會設為 true

系統預設會強制執行限制,如果違反限制,就會禁止執行特定叢集作業。您可以將限制的 spec.enforcementAction 設為 dryrun,在 status.violations 欄位中回報違規事項,但不會阻止作業。

如要進一步瞭解稽核,請參閱「使用限制進行稽核」。

同步處理限制時的注意事項

如果您使用 Config Sync 或其他 GitOps 樣式的工具,將限制條件同步至集中式來源 (例如 Git 存放區),請在同步限制條件時注意下列事項。

最終一致性

您可以將限制條件提交至 Git 存放區等可靠來源,並使用 ClusterSelectorsNamespaceSelectors 限制其影響範圍。由於同步處理具有最終一致性,請注意以下幾點:

  • 如果叢集作業觸發的限制條件,其 NamespaceSelector 參照的命名空間尚未同步,系統就會強制執行限制條件,並禁止該作業。換句話說,缺少命名空間會「失敗關閉」。
  • 如果變更命名空間的標籤,快取可能會在短時間內包含過時資料。

盡量避免重新命名命名空間或變更其標籤,並測試影響重新命名或重新標記命名空間的限制,確保這些限制能正常運作。

設定 Policy Controller 的參照限制

您必須先建立設定,告知 Policy Controller 要監控哪些類型的物件 (例如命名空間),才能啟用參照限制

將下列 YAML 資訊清單儲存至檔案,然後使用 kubectl 套用。這個資訊清單會設定政策控制器,監控命名空間和 Ingress。在 spec.sync.syncOnly 下方建立含有 groupversionkind 的項目,並為要監看的每個物件類型設定值。

apiVersion: config.gatekeeper.sh/v1alpha1
kind: Config
metadata:
  name: config
  namespace: "gatekeeper-system"
spec:
  sync:
    syncOnly:
      - group: ""
        version: "v1"
        kind: "Namespace"
      - group: "extensions"
        version: "v1beta1"
        kind: "Ingress"

啟用參照完整性限制

參照限制會在定義中參照另一個物件。舉例來說,您可以建立限制,要求叢集中的 Ingress 物件必須有不重複的主機名稱。如果限制範本的 Rego 包含 data.inventory 字串,該限制就是參照限制。

如果您使用 Google Cloud 控制台安裝 Policy Controller,系統預設會啟用參照限制。如果您使用 Google Cloud CLI 安裝 Policy Controller,可以選擇是否在安裝 Policy Controller 時啟用參照限制。參照完整性限制只保證最終一致性,這會造成風險:

  • 在過度負載的 API 伺服器上,Policy Controller 的快取內容可能會過時,導致參照限制「失敗時維持開放狀態」,也就是說,強制執行動作看似正常運作,但實際上並非如此。舉例來說,您建立 Ingress 時,如果主機名稱重複,且速度太快,許可控制器就無法偵測到重複項目。

  • 限制條件的安裝順序和快取的更新順序都是隨機。

您可以更新現有叢集,允許參照限制。

控制台

如要停用參照限制,請完成下列步驟:

  1. 在 Google Cloud 控制台中,前往「Posture Management」(狀態管理) 專區下方的 GKE Enterprise「Policy」(政策) 頁面。

    前往「政策」

  2. 在「設定」分頁的叢集表格中,選取「編輯設定」欄中的「編輯」
  3. 展開「編輯 Policy Controller 設定」選單。
  4. 選取「啟用參照物件並非當前評估項目的限制範本」核取方塊。
  5. 選取「儲存變更」

gcloud

如要啟用參照限制支援功能,請執行下列指令:

gcloud container fleet policycontroller update \
    --memberships=MEMBERSHIP_NAME \
    --referential-rules

MEMBERSHIP_NAME 替換為要啟用參照規則的已註冊叢集成員資格名稱。你可以指定多個會員方案,並以半形逗號分隔。

停用參照限制

停用參照限制時,系統也會從叢集中移除使用參照限制的任何範本,以及使用這些範本的任何限制。

控制台

使用 Google Cloud 控制台安裝 Policy Controller 時,系統預設會啟用參照限制。如要停用參照限制,請完成下列步驟:

  1. 在 Google Cloud 控制台中,前往「Posture Management」(狀態管理) 專區下方的 GKE Enterprise「Policy」(政策) 頁面。

    前往「政策」

  2. 在「設定」分頁的叢集表格中,選取「編輯設定」欄中的「編輯」
  3. 展開「編輯 Policy Controller 設定」選單。
  4. 清除「Enable Constraint Templates that reference to objects other than the object currently being evaluated」(啟用參照物件並非當前評估項目的限制範本) 核取方塊。
  5. 選取「儲存變更」

gcloud

如要停用參照限制支援功能,請執行下列指令:

gcloud container fleet policycontroller update \
    --memberships=MEMBERSHIP_NAME \
    --no-referential-rules

MEMBERSHIP_NAME 替換為要啟用參照規則的已註冊叢集成員資格名稱。你可以指定多個會員方案,並以半形逗號分隔。

列出所有限制

如要列出叢集上安裝的所有限制,請使用下列指令:

kubectl get constraint

您也可以在 Google Cloud 控制台中查看已套用限制的總覽。 詳情請參閱「Policy Controller 指標」。

移除限制

如要找出使用限制範本的所有限制,請使用下列指令列出與限制範本 metadata.name 具有相同 kind 的所有物件:

kubectl get CONSTRAINT_TEMPLATE_NAME

如要移除限制,請指定其 kindname

kubectl delete CONSTRAINT_TEMPLATE_NAME CONSTRAINT_NAME

移除限制後,API 伺服器會立即將限制標示為已刪除,並停止強制執行。

移除所有限制範本

控制台

如要停用限制範本程式庫,請完成下列步驟:

  1. 在 Google Cloud 控制台中,前往「Posture Management」(狀態管理) 專區下方的 GKE Enterprise「Policy」(政策) 頁面。

    前往「政策」

  2. 在「設定」分頁的叢集表格中,選取「編輯設定」欄中的「編輯」
  3. 在「新增/編輯政策套裝組合」選單中,將範本庫和所有政策套裝組合切換為關閉
  4. 選取「儲存變更」

gcloud

如要停用限制範本程式庫,請執行下列指令:

gcloud container fleet policycontroller content templates disable \
    --memberships=MEMBERSHIP_NAME

MEMBERSHIP_NAME 替換為已註冊叢集的成員資格名稱,以停用限制範本庫。您可以指定多個會員方案,並以半形逗號分隔。

還原限制範本庫

控制台

如要啟用限制範本程式庫,請完成下列步驟:

  1. 在 Google Cloud 控制台中,前往「Posture Management」(狀態管理) 專區下方的 GKE Enterprise「Policy」(政策) 頁面。

    前往「政策」

  2. 在「設定」分頁的叢集表格中,選取「編輯設定」欄中的「編輯」
  3. 在「新增/編輯政策套裝組合」選單中,開啟範本庫 。您也可以啟用任何或所有政策套裝組合。
  4. 選取「儲存變更」

gcloud

如要還原限制範本程式庫,請執行下列指令:

gcloud container fleet policycontroller content templates enable \
    --memberships=MEMBERSHIP_NAME

MEMBERSHIP_NAME 替換為已註冊叢集的成員資格名稱,以啟用限制範本程式庫。您可以指定多個會員方案,並以半形逗號分隔。

後續步驟