本页面介绍了如何安装政策控制器。政策控制器会根据与安全、法规或业务规则相关的政策检查、审核和实施集群的合规性。
本页面适用于想要提供并维护自动化以进行审核或强制执行,从而确保云平台中运行的所有资源满足组织合规性要求的 IT 管理员和运维人员。如需详细了解我们在 Google Cloud 内容中提及的常见角色和示例任务,请参阅常见的 GKE Enterprise 用户角色和任务。
如果您使用 Google Kubernetes Engine (GKE) Enterprise 版,则可以使用 Policy Controller。如需了解详情,请参阅 Google Kubernetes Engine (GKE) Enterprise 版价格。
须知事项
在开始之前,请确保您已执行以下任务:
- 安装并初始化 Google Cloud CLI,它提供了以下说明中使用的
gcloud
、kubectl
和nomos
命令。如果您之前安装了 gcloud CLI,请运行gcloud components update
以获取最新版本。如果您使用 Cloud Shell,则系统会预安装 Google Cloud CLI。 - 确保您的集群上未安装开源 Open Policy Agent Gatekeeper。如果已安装,请卸载 Gatekeeper,然后再安装 Policy Controller。
启用 Policy Controller API。
创建运行 Kubernetes 1.14.x 或更高版本的集群,或确保您有权访问此集群。Policy Controller 似乎可以在版本低于 1.14.x 的 Kubernetes 上运行,但无法正常工作。
如果您计划使用 Google Cloud CLI 配置 Policy Controller,请立即将集群注册到舰队。如果您计划使用 Google Cloud 控制台,请在安装 Policy Controller 时注册集群。
如果您使用的是 GKE 关联集群,请确保 AKS 集群没有 Azure 政策插件,并避免使用
control-plane
键为命名空间添加标签。如果您使用的是 Google Distributed Cloud on VMware 或 Google Distributed Cloud on Bare Metal,请确保在用户集群上安装 Policy Controller。Policy Controller 无法安装在管理员集群上。
安装 Policy Controller
从 1.16.0 版开始,如果您使用的是 Google Cloud CLI,则可以直接安装和管理 Policy Controller(推荐)。不再建议通过 ConfigManagement
对象配置 Policy Controller。
控制台
如需在 Google Cloud 控制台中安装 Policy Controller,请完成以下步骤:
- 在 Google Cloud 控制台中,前往安全状况管理部分下的 GKE Enterprise 政策页面。
选择 add 安装 Policy Controller。
在 Policy Controller 安装窗格中,选择以下安装选项之一:
如需在舰队中的所有集群上安装 Policy Controller,请执行以下操作:
让在舰队上安装保持选中状态。
如果您的项目中没有舰队,则可以在下一步中创建舰队。
如果您还没有舰队,请为舰队选择一个名称。
选择激活 Policy Controller。
如需在个别集群上安装 Policy Controller,请执行以下操作:
选择在个别集群上安装。
在可用集群表中,选择要安装 Policy Controller 的集群。
选择激活 Policy Controller。
系统会将您重定向至 Policy Controller 设置标签页。在集群上安装并配置 Policy Controller 后,状态列将显示已安装 check_circle。此过程可能耗时几分钟。
gcloud Policy Controller
通过运行以下命令启用 Policy Controller:
gcloud container fleet policycontroller enable \
--memberships=MEMBERSHIP_NAME
您可以设置其他字段来配置 Policy Controller。例如,您可能希望指示 Policy Controller 豁免某些命名空间的强制执行。
如需查看您可以配置的字段的完整列表,请参阅 Policy Controller Google Cloud CLI 文档或运行 gcloud container fleet policycontroller enable --help
。
gcloud ConfigManagement
通过创建新的
apply-spec.yaml
清单或使用现有清单来准备配置。通过使用现有清单,您可以使用另一个集群所用的相同设置来配置集群。创建新的清单
如需使用新设置为集群配置 Policy Controller,请创建一个名为
apply-spec.yaml
的文件,并将以下 YAML 文件复制到其中:# apply-spec.yaml applySpecVersion: 1 spec: policyController: # Set to true to install and enable Policy Controller enabled: true # Uncomment to prevent the template library from being installed # templateLibraryInstalled: false # Uncomment to enable support for referential constraints # referentialRulesEnabled: true # Uncomment to disable audit, adjust value to set audit interval # auditIntervalSeconds: 0 # Uncomment to log all denies and dryrun failures # logDeniesEnabled: true # Uncomment to enable mutation # mutationEnabled: true # Uncomment to exempt namespaces # exemptableNamespaces: ["namespace-name"] # Uncomment to change the monitoring backends # monitoring: # backends: # - cloudmonitoring # - prometheus # ...other fields...
您必须添加
spec.policyController
字段并将enabled
的值设置为true
。您可以选择启用其他 Policy Controller 功能。但是,对参照限制条件的支持将默认停用。启用它之前,请确保您熟悉关于最终一致性的注意事项。使用现有清单
要使用与另一个集群相同的设置配置集群,请从已注册的集群中提取设置:
gcloud alpha container fleet config-management fetch-for-apply \ --membership=MEMBERSHIP_NAME \ --project=PROJECT_ID \ > CONFIG_YAML_PATH
替换以下内容:
MEMBERSHIP_NAME
:具有您要使用的 Policy Controller 设置的已注册集群的成员资格名称PROJECT_ID
:您的项目 IDCONFIG_YAML_PATH
:apply-spec.yaml
文件的路径
应用
apply-spec.yaml
文件:gcloud beta container fleet config-management apply \ --membership=MEMBERSHIP_NAME \ --config=CONFIG_YAML \ --project=PROJECT_ID
替换以下内容:
MEMBERSHIP_NAME
:具有您要使用的政策控制器设置的已注册集群的成员资格名称。CONFIG_YAML
:添加apply-spec.yaml
文件的路径。PROJECT_ID
:添加您的项目 ID。
Pod 创建完成,政策控制器开始检查并强制执行限制条件。
验证政策控制器安装
安装政策控制器后,您可以验证它是否成功完成。
控制台
请完成以下步骤:
- 在 Google Cloud 控制台中,前往安全状况管理部分下的 GKE Enterprise 政策页面。
- 在设置标签页下的集群表中,检查 Policy Controller 状态列。成功安装的状态为已安装 check_circle。
gcloud Policy Controller
运行以下命令:
gcloud container fleet policycontroller describe --memberships=MEMBERSHIP_NAME
安装成功后会显示 membershipStates: MEMBERSHIP_NAME: policycontroller: state: ACTIVE
。
gcloud ConfigManagement
运行以下命令:
gcloud beta container fleet config-management status \
--project=PROJECT_ID
将 PROJECT_ID
替换为您的项目 ID。
您应该会看到类似于以下示例的输出:
Name Status Last_Synced_Token Sync_Branch Last_Synced_Time Policy_Controller
CLUSTER_NAME SYNCED a687c2c 1.0.0 2021-02-17T00:15:55Z INSTALLED
在“Policy Controller”列中,成功安装的状态为 INSTALLED
。
验证限制条件模板库安装
安装 Policy Controller 时,系统会默认安装限制条件模板库。此安装过程可能需要几分钟才能完成。您可以验证模板库已成功安装。
控制台
请完成以下步骤:
- 在 Google Cloud 控制台中,前往安全状况管理部分下的 GKE Enterprise 政策页面。
- 在设置标签页下的集群表中,选择已安装的软件包列中列出的数字。在政策内容状态窗格中,成功的模板库安装的状态为已安装 check_circle。
gcloud
运行以下命令:
kubectl get constrainttemplates
您应该会看到类似于以下示例的输出:
NAME AGE k8sallowedrepos 84s k8scontainerlimits 84s k8spspallowprivilegeescalationcontainer 84s ...[OUTPUT TRUNCATED]...
正确安装单个限制条件模板后,其 status.created
字段为 true
。
配置舰队级默认设置
如果您已启用 Google Kubernetes Engine (GKE) Enterprise 版,则可以启用 Policy Controller 并将其配置为集群的舰队级默认设置。这意味着在集群创建期间注册的每个新的 GKE on Google Cloud 集群都将使用您指定的设置在集群上启用 Policy Controller。您可以在管理舰队级功能中详细了解舰队默认配置。
如需为 Policy Controller 配置舰队级默认设置,请完成以下步骤:
控制台
在 Google Cloud 控制台中,前往 Feature Manager 页面。
在政策窗格中,点击配置。
查看舰队级设置。您注册到舰队的所有新集群都会继承这些设置。
可选:如需更改默认设置,请点击自定义舰队设置。在显示的对话框中,执行以下操作:
- 在添加/修改政策包部分,点击相关切换开关以包含或排除政策包。
- 在修改 Policy Controller 配置部分,执行以下操作:
- 如需启用变更 webhook,请勾选启用变更 webhook 复选框。此功能与 Autopilot 集群不兼容。
- 在审核时间间隔框中,输入两次连续审核之间的间隔时长(以秒为单位)。
- 在可豁免的命名空间框中,输入命名空间列表。Policy Controller 会忽略这些命名空间中的对象。
- 如需启用参照限制条件,请勾选启用引用了并非当前正在评估的对象的限制条件模板复选框。
- 在版本列表中,选择要使用的 Policy Controller 版本。
- 点击保存更改。
点击配置。
在确认对话框中,点击确认。 如果您之前未启用 Policy Controller,点击确认将会启用
anthospolicycontroller.googleapis.com
API。可选:将现有集群同步到默认设置:
- 在舰队中的集群列表中,选择您要同步的集群。
- 点击同步到舰队设置,然后在出现的确认对话框中点击确认。此操作可能需要几分钟才能完成。
gcloud
创建一个名为
fleet-default.yaml
的文件,其中包含 Policy Controller 的默认配置。如需启用舰队级默认设置,则必须提供installSpec
字段。下面的示例显示了您可以配置的选项:# cat fleet-default.yaml policyControllerHubConfig: installSpec: INSTALL_SPEC_ENABLED # Uncomment to set default deployment-level configurations. # deploymentConfigs: # admission: # containerResources: # limits: # cpu: 1000m # memory: 8Gi # requests: # cpu: 500m # memory: 4Gi # Uncomment to set policy bundles that you want to install by default. # policyContent: # bundles: # cis-k8s-v1.5.1: # exemptedNamespaces: # - "namespace-name" # Uncomment to exempt namespaces from admission. # exemptableNamespaces: # - "namespace-name" # Uncomment to enable support for referential constraints # referentialRulesEnabled: true # Uncomment to disable audit, adjust value to set audit interval # auditIntervalSeconds: 0 # Uncomment to log all denies and dryrun failures # logDeniesEnabled: true # Uncomment to enable mutation # mutationEnabled: true # Uncomment to adjust the value to set the constraint violation limit # constraintViolationLimit: 20 # ... other fields ...
将默认配置应用于舰队:
gcloud container fleet policycontroller enable \ --fleet-default-member-config=fleet-default.yaml
如需验证配置是否已应用,请运行以下命令:
gcloud container fleet policycontroller describe
如需移除舰队级默认配置,请运行以下命令:
gcloud container fleet policycontroller enable \ --no-fleet-default-member-config
Policy Controller 与 Config Sync 的交互
如果您将 Policy Controller 与 Config Sync 搭配使用,则应注意由 Config Sync 同步的可靠来源(例如 Git 代码库)中存储的资源的以下交互行为:
除非停用限制条件模板库,否则您将无法同步也是模板库一部分的限制条件模板。
如果您要同步存储在
gatekeeper-system
命名空间中的Config
资源,则必须只在可靠来源中定义Config
资源;不得定义gatekeeper-system
Namespace
。
管理限制条件模板库
如需了解有关卸载或安装限制条件模板、它们的关联限制条件或限制条件模板库的信息,请参阅创建限制条件。
命名空间免于强制执行
您可以配置 Policy Controller 以忽略命名空间中的对象。如需了解详情,请参阅从政策控制器中排除命名空间。
更改资源
Policy Controller 还充当变更网络钩子。如需了解详情,请参阅更改资源。
查看政策控制器版本
如需了解政策控制器正在使用的 Gatekeeper 版本,请通过运行以下命令查看映像标记:
kubectl get deployments -n gatekeeper-system gatekeeper-controller-manager \
-o="jsonpath={.spec.template.spec.containers[0].image}"
用于构建 Gatekeeper 的 Git 标记(或哈希)以及 ConfigManagement Operator 版本号包含在映像标记中,如下所示:
.../gatekeeper:VERSION_NUMBER-GIT_TAG.gBUILD_NUMBER
例如,对于以下映像:
gcr.io/config-management-release/gatekeeper:anthos1.3.2-480baac.g0
anthos1.3.2
是版本号。480baac
是 Git 标记。0
是内部版本号。
升级政策控制器
在升级 Policy Controller 之前,请查看版本说明以详细了解版本之间的变化。
如需升级 Policy Controller,请完成以下步骤:
控制台
- 在 Google Cloud 控制台中,进入安全状况管理部分下的 GKE Enterprise 政策页面。
- 在设置标签页下您要升级版本的集群旁边,选择 edit 修改配置。
- 展开修改 Policy Controller 配置菜单。
- 从版本下拉列表中,选择您要升级到的版本。
- 点击保存更改。
gcloud
运行以下命令:
gcloud container fleet policycontroller update \
--version=VERSION \
--memberships=MEMBERSHIP_NAME
替换以下内容:
VERSION
:要升级到的版本MEMBERSHIP_NAME
:您在注册集群时选择的成员资格名称。您可以通过运行gcloud container fleet memberships list
找到成员资格名称。
卸载 Policy Controller
请按照以下步骤从集群中卸载政策控制器。
控制台
如需为集群停用政策控制器,请完成以下任务:
- 在 Google Cloud 控制台中,前往安全状况管理部分下的 GKE Enterprise 政策页面。
- 在设置标签页下的集群表中,选择修改配置列中的修改 edit。
- 在集群窗格中,向下滚动并展开关于 Policy Controller 菜单。
- 选择卸载 Policy Controller。
- 按照确认对话框中的说明操作并选择确认,以确认卸载。
卸载 Policy Controller 后,状态列显示未安装 do_not_disturb_on。
gcloud Policy Controller
如需卸载 Policy Controller,请运行以下命令:
gcloud container fleet policycontroller disable \
--memberships=MEMBERSHIP_NAME
将 MEMBERSHIP_NAME
替换为要停用 Policy Controller 的已注册集群的成员资格名称。您可以指定多个成员资格(以英文逗号分隔)。
gcloud ConfigManagement
如需卸载 Policy Controller,请执行以下操作:
在
apply-spec.yaml
文件中修改 ConfigManagement Operator 配置,并将policyController.enabled
设置为false
。在
apply-spec.yaml
文件中应用更改:gcloud beta container fleet config-management apply \ --membership=CLUSTER_NAME \ --config=CONFIG_YAML \ --project=PROJECT_ID
请替换以下内容:
- CLUSTER_NAME:添加您要将此配置应用于的已注册集群。
- CONFIG_YAML:添加
apply-spec.yaml
文件的路径。 - PROJECT_ID:添加您的项目 ID。
移除 ConfigManagement Operator
如果您是通过 ConfigManagement
对象安装的 Policy Controller,则还需要从集群中移除 ConfigManagement Operator。
如需移除 ConfigManagement Operator,请运行以下命令:
从集群中删除 ConfigManagement 对象:
kubectl delete configmanagement --all
运行此命令后,会发生以下情况:
- ConfigManagement Operator 在集群中创建的任何 ClusterRole 和 ClusterRoleBinding 都将从集群中删除。
- ConfigManagement Operator 安装的任何准入控制器配置都将被删除。
- 除了
git-creds
Secret 以外,config-management-system
命名空间的内容都将被删除,而对于从 1.9.0 开始的 Policy Controller 版本,config-management-operator
Deployment 和config-management-operator
Pod 也要排除在外。如果没有config-management-system
命名空间,ConfigManagement Operator 将无法运行。由 ConfigManagement Operator 控制器创建或修改的任何 CustomResourceDefinition (CRD) 都将从创建或修改了这些对象的集群中移除。运行 ConfigManagement Operator 所需的 CRD 仍然存在,因为从 Kubernetes 的角度看,它们是由安装 ConfigManagement Operator 的用户添加的。有关移除这些组件的信息将在下一步中介绍。
如果您需要保留
git-creds
Secret,请立即执行以下操作:kubectl -n config-management-system get secret git-creds -o yaml
删除
config-management-system
命名空间:kubectl delete ns config-management-system
删除
config-management-monitoring
命名空间:kubectl delete ns config-management-monitoring
删除 ConfigManagement CustomResourceDefinition:
kubectl delete crd configmanagements.configmanagement.gke.io
政策控制器 RBAC 和权限
政策控制器包含具有高权限的工作负载。Open Policy Agent Gatekeeper 操作文档中介绍了这些工作负载的权限。
Policy Controller 资源请求
下表列出了每个受支持的 Policy Controller 版本的 Kubernetes 资源要求。只有在您是通过 ConfigManagement
对象安装的 Policy Controller 时,对 ConfigManagement Operator 的资源请求才适用。
组件 | CPU | 内存 |
---|---|---|
ConfigManagement Operator | 100 m | 100 Mi |
Policy Controller | 100 m | 256 Mi |
后续步骤
- 详细了解政策控制器。
- 详细了解 Policy Controller 软件包。
- 了解如何创建限制条件。
- 排查政策控制器问题。