本頁面說明如何使用 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 存放區等可靠來源,並使用 ClusterSelectors 或 NamespaceSelectors 限制其影響範圍。由於同步處理具有最終一致性,請注意以下幾點:
- 如果叢集作業觸發的限制條件,其 NamespaceSelector 參照的命名空間尚未同步,系統就會強制執行限制條件,並禁止該作業。換句話說,缺少命名空間會「失敗關閉」。
- 如果變更命名空間的標籤,快取可能會在短時間內包含過時資料。
盡量避免重新命名命名空間或變更其標籤,並測試影響重新命名或重新標記命名空間的限制,確保這些限制能正常運作。
設定 Policy Controller 的參照限制
您必須先建立設定,告知 Policy Controller 要監控哪些類型的物件 (例如命名空間),才能啟用參照限制。
將下列 YAML 資訊清單儲存至檔案,然後使用 kubectl
套用。這個資訊清單會設定政策控制器,監控命名空間和 Ingress。在 spec.sync.syncOnly
下方建立含有 group
、version
和 kind
的項目,並為要監看的每個物件類型設定值。
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 時,如果主機名稱重複,且速度太快,許可控制器就無法偵測到重複項目。
限制條件的安裝順序和快取的更新順序都是隨機。
您可以更新現有叢集,允許參照限制。
控制台
如要停用參照限制,請完成下列步驟:
- 在 Google Cloud 控制台中,前往「Posture Management」(狀態管理) 專區下方的 GKE Enterprise「Policy」(政策) 頁面。
- 在「設定」分頁的叢集表格中,選取「編輯設定」欄中的「編輯」edit。
- 展開「編輯 Policy Controller 設定」選單。
- 選取「啟用參照物件並非當前評估項目的限制範本」核取方塊。
- 選取「儲存變更」。
gcloud
如要啟用參照限制支援功能,請執行下列指令:
gcloud container fleet policycontroller update \
--memberships=MEMBERSHIP_NAME \
--referential-rules
將 MEMBERSHIP_NAME
替換為要啟用參照規則的已註冊叢集成員資格名稱。你可以指定多個會員方案,並以半形逗號分隔。
停用參照限制
停用參照限制時,系統也會從叢集中移除使用參照限制的任何範本,以及使用這些範本的任何限制。
控制台
使用 Google Cloud 控制台安裝 Policy Controller 時,系統預設會啟用參照限制。如要停用參照限制,請完成下列步驟:
- 在 Google Cloud 控制台中,前往「Posture Management」(狀態管理) 專區下方的 GKE Enterprise「Policy」(政策) 頁面。
- 在「設定」分頁的叢集表格中,選取「編輯設定」欄中的「編輯」edit。
- 展開「編輯 Policy Controller 設定」選單。
- 清除「Enable Constraint Templates that reference to objects other than the object currently being evaluated」(啟用參照物件並非當前評估項目的限制範本) 核取方塊。
- 選取「儲存變更」。
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
如要移除限制,請指定其 kind
和 name
:
kubectl delete CONSTRAINT_TEMPLATE_NAME CONSTRAINT_NAME
移除限制後,API 伺服器會立即將限制標示為已刪除,並停止強制執行。
移除所有限制範本
控制台
如要停用限制範本程式庫,請完成下列步驟:
- 在 Google Cloud 控制台中,前往「Posture Management」(狀態管理) 專區下方的 GKE Enterprise「Policy」(政策) 頁面。
- 在「設定」分頁的叢集表格中,選取「編輯設定」欄中的「編輯」edit。
- 在「新增/編輯政策套裝組合」選單中,將範本庫和所有政策套裝組合切換為關閉 do_not_disturb_on。
- 選取「儲存變更」。
gcloud
如要停用限制範本程式庫,請執行下列指令:
gcloud container fleet policycontroller content templates disable \
--memberships=MEMBERSHIP_NAME
將 MEMBERSHIP_NAME
替換為已註冊叢集的成員資格名稱,以停用限制範本庫。您可以指定多個會員方案,並以半形逗號分隔。
還原限制範本庫
控制台
如要啟用限制範本程式庫,請完成下列步驟:
- 在 Google Cloud 控制台中,前往「Posture Management」(狀態管理) 專區下方的 GKE Enterprise「Policy」(政策) 頁面。
- 在「設定」分頁的叢集表格中,選取「編輯設定」欄中的「編輯」edit。
- 在「新增/編輯政策套裝組合」選單中,開啟範本庫 check_circle。您也可以啟用任何或所有政策套裝組合。
- 選取「儲存變更」。
gcloud
如要還原限制範本程式庫,請執行下列指令:
gcloud container fleet policycontroller content templates enable \
--memberships=MEMBERSHIP_NAME
將 MEMBERSHIP_NAME
替換為已註冊叢集的成員資格名稱,以啟用限制範本程式庫。您可以指定多個會員方案,並以半形逗號分隔。
後續步驟
- 瞭解 Policy Controller 套裝組合。
- 查看限制範本庫參考說明文件。
- 瞭解如何建立自訂限制。
- 排解 Policy Controller 問題。