安装 Policy Controller

本页面介绍了如何安装政策控制器。政策控制器会根据与安全、法规或业务规则相关的政策检查、审核和实施集群的合规性。

本页面适用于想要提供并维护自动化以进行审核或强制执行,从而确保云平台中运行的所有资源满足组织合规性要求的 IT 管理员和运维人员。如需详细了解我们在 Google Cloud 内容中提及的常见角色和示例任务,请参阅常见的 GKE Enterprise 用户角色和任务

如果您使用 Google Kubernetes Engine (GKE) Enterprise 版,则可以使用 Policy Controller。如需了解详情,请参阅 Google Kubernetes Engine (GKE) Enterprise 版价格

须知事项

在开始之前,请确保您已执行以下任务:

  1. 安装并初始化 Google Cloud CLI,它提供了以下说明中使用的 gcloudkubectlnomos 命令。如果您之前安装了 gcloud CLI,请运行 gcloud components update 以获取最新版本。如果您使用 Cloud Shell,则系统会预安装 Google Cloud CLI。
  2. 确保您的集群上未安装开源 Open Policy Agent Gatekeeper。如果已安装,请卸载 Gatekeeper,然后再安装 Policy Controller。
  3. 启用 GKE Enterprise API

    启用 GKE Enterprise API

  4. 启用 Policy Controller API。

    启用 Policy Controller API

  5. 创建运行 Kubernetes 1.14.x 或更高版本的集群,或确保您有权访问此集群。Policy Controller 似乎可以在版本低于 1.14.x 的 Kubernetes 上运行,但无法正常工作。

  6. 将所需的 IAM 角色授予注册集群的用户

  7. 如果您计划使用 Google Cloud CLI 配置 Policy Controller,请立即将集群注册舰队。如果您计划使用 Google Cloud 控制台,请在安装 Policy Controller 时注册集群。

  8. 如果您使用的是 GKE 关联集群,请确保 AKS 集群没有 Azure 政策插件,并避免使用 control-plane 键为命名空间添加标签。

  9. 如果您使用的是 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,请完成以下步骤:

  1. 在 Google Cloud 控制台中,前往安全状况管理部分下的 GKE Enterprise 政策页面。

    前往“政策”

  2. 选择 安装 Policy Controller

  3. Policy Controller 安装窗格中,选择以下安装选项之一:

    • 如需在舰队中的所有集群上安装 Policy Controller,请执行以下操作:

      1. 在舰队上安装保持选中状态。

        如果您的项目中没有舰队,则可以在下一步中创建舰队。

      2. 如果您还没有舰队,请为舰队选择一个名称。

      3. 选择激活 Policy Controller

    • 如需在个别集群上安装 Policy Controller,请执行以下操作:

      1. 选择在个别集群上安装

      2. 可用集群表中,选择要安装 Policy Controller 的集群。

      3. 选择激活 Policy Controller

系统会将您重定向至 Policy Controller 设置标签页。在集群上安装并配置 Policy Controller 后,状态列将显示已安装 。此过程可能耗时几分钟。

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

  1. 通过创建新的 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:您的项目 ID
    • CONFIG_YAML_PATHapply-spec.yaml 文件的路径
  2. 应用 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 创建完成,政策控制器开始检查并强制执行限制条件。

验证政策控制器安装

安装政策控制器后,您可以验证它是否成功完成。

控制台

请完成以下步骤:

  1. 在 Google Cloud 控制台中,前往安全状况管理部分下的 GKE Enterprise 政策页面。

    前往“政策”

  2. 设置标签页下的集群表中,检查 Policy Controller 状态列。成功安装的状态为已安装

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 时,系统会默认安装限制条件模板库。此安装过程可能需要几分钟才能完成。您可以验证模板库已成功安装。

控制台

请完成以下步骤:

  1. 在 Google Cloud 控制台中,前往安全状况管理部分下的 GKE Enterprise 政策页面。

    前往“政策”

  2. 设置标签页下的集群表中,选择已安装的软件包列中列出的数字。在政策内容状态窗格中,成功的模板库安装的状态为已安装

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 配置舰队级默认设置,请完成以下步骤:

控制台

  1. 在 Google Cloud 控制台中,前往 Feature Manager 页面。

    前往 Feature Manager

  2. 政策窗格中,点击配置

  3. 查看舰队级设置。您注册到舰队的所有新集群都会继承这些设置。

  4. 可选:如需更改默认设置,请点击自定义舰队设置。在显示的对话框中,执行以下操作:

    1. 添加/修改政策包部分,点击相关切换开关以包含或排除政策包。
    2. 修改 Policy Controller 配置部分,执行以下操作:
      1. 如需启用变更 webhook,请勾选启用变更 webhook 复选框。此功能与 Autopilot 集群不兼容。
      2. 审核时间间隔框中,输入两次连续审核之间的间隔时长(以秒为单位)。
      3. 可豁免的命名空间框中,输入命名空间列表。Policy Controller 会忽略这些命名空间中的对象。
      4. 如需启用参照限制条件,请勾选启用引用了并非当前正在评估的对象的限制条件模板复选框。
      5. 版本列表中,选择要使用的 Policy Controller 版本。
    3. 点击保存更改
  5. 点击配置

  6. 在确认对话框中,点击确认。 如果您之前未启用 Policy Controller,点击确认将会启用 anthospolicycontroller.googleapis.com API。

  7. 可选:将现有集群同步到默认设置:

    1. 舰队中的集群列表中,选择您要同步的集群。
    2. 点击同步到舰队设置,然后在出现的确认对话框中点击确认。此操作可能需要几分钟才能完成。

gcloud

  1. 创建一个名为 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 ...
    
  2. 将默认配置应用于舰队:

    gcloud container fleet policycontroller enable \
      --fleet-default-member-config=fleet-default.yaml
    
  3. 如需验证配置是否已应用,请运行以下命令:

    gcloud container fleet policycontroller describe
    
  4. 如需移除舰队级默认配置,请运行以下命令:

    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,请完成以下步骤:

控制台

  1. 在 Google Cloud 控制台中,进入安全状况管理部分下的 GKE Enterprise 政策页面。

    前往“政策”

  2. 设置标签页下您要升级版本的集群旁边,选择 修改配置
  3. 展开修改 Policy Controller 配置菜单。
  4. 版本下拉列表中,选择您要升级到的版本。
  5. 点击保存更改

gcloud

运行以下命令:

gcloud container fleet policycontroller update \
  --version=VERSION \
  --memberships=MEMBERSHIP_NAME

替换以下内容:

  • VERSION:要升级到的版本
  • MEMBERSHIP_NAME:您在注册集群时选择的成员资格名称。您可以通过运行 gcloud container fleet memberships list 找到成员资格名称。

卸载 Policy Controller

请按照以下步骤从集群中卸载政策控制器。

控制台

如需为集群停用政策控制器,请完成以下任务:

  1. 在 Google Cloud 控制台中,前往安全状况管理部分下的 GKE Enterprise 政策页面。

    前往“政策”

  2. 设置标签页下的集群表中,选择修改配置列中的修改
  3. 在集群窗格中,向下滚动并展开关于 Policy Controller 菜单。
  4. 选择卸载 Policy Controller
  5. 按照确认对话框中的说明操作并选择确认,以确认卸载。

卸载 Policy Controller 后,状态列显示未安装

gcloud Policy Controller

如需卸载 Policy Controller,请运行以下命令:

gcloud container fleet policycontroller disable \
  --memberships=MEMBERSHIP_NAME

MEMBERSHIP_NAME 替换为要停用 Policy Controller 的已注册集群的成员资格名称。您可以指定多个成员资格(以英文逗号分隔)。

gcloud ConfigManagement

如需卸载 Policy Controller,请执行以下操作:

  1. apply-spec.yaml 文件中修改 ConfigManagement Operator 配置,并将 policyController.enabled 设置为 false

  2. 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,请运行以下命令:

  1. 从集群中删除 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 的用户添加的。有关移除这些组件的信息将在下一步中介绍。
  2. 如果您需要保留 git-creds Secret,请立即执行以下操作:

    kubectl -n config-management-system get secret git-creds -o yaml
    
  3. 删除 config-management-system 命名空间:

    kubectl delete ns config-management-system
    
  4. 删除 config-management-monitoring 命名空间:

    kubectl delete ns config-management-monitoring
    
  5. 删除 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

后续步骤