安装 Policy Controller

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

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

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

须知事项

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

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

  3. 启用必需的 API:

    控制台

    启用 Policy Controller API。

    启用 Policy Controller API

    gcloud

    运行以下命令:

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

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

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

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

  8. 如果您使用的是 Google Distributed Cloud on VMware 或 Google Distributed Cloud on Bare Metal,请确保在用户集群上安装 Policy Controller。Policy Controller 无法安装在管理员集群上。

安装 Policy Controller

控制台

如需在 Google Cloud 控制台中安装 Policy Controller,请完成以下步骤:

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

    前往“政策”

  2. 点击 配置 Policy Controller。

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

    1. 在添加/修改政策包部分,点击相关切换开关以包含或排除政策包。
    2. 在修改 Policy Controller 配置部分,执行以下操作:

      1. 如需启用变更 webhook,请勾选启用变更 webhook 复选框。此功能与 Autopilot 集群不兼容。
      2. 在审核时间间隔框中,输入两次连续审核之间的间隔时长(以秒为单位)。
      3. 在可豁免的命名空间框中,输入命名空间列表。Policy Controller 会忽略这些命名空间中的对象。 此功能与 Autopilot 集群不兼容。

        最佳实践:

        豁免系统命名空间,以避免环境中出现错误。您可以在“排除命名空间”页面上找到豁免命名空间的说明以及由 Google Cloud 服务创建的常见命名空间的列表。

      4. 如需启用参照限制条件,请勾选启用引用了并非当前正在评估的对象的限制条件模板复选框。

      5. 在版本列表中,选择要使用的 Policy Controller 版本。

    3. 点击保存更改。

  4. 点击配置。

  5. 在确认对话框中,点击确认。 如果您之前未启用 Policy Controller,点击确认将会启用 anthospolicycontroller.googleapis.com API 并在您的集群上安装 Policy Controller。

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

    1. 在设置标签页中,点击同步到舰队设置。
    2. 在舰队中的集群列表中,选择要同步的集群,然后点击同步到舰队设置。此操作可能需要几分钟才能完成。

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

gcloud

通过运行以下命令启用 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。

如需为 Policy Controller 设置舰队级设置,请完成以下步骤:

  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 ...
    
    最佳实践:

    豁免系统命名空间,以避免环境中出现错误。您可以在“排除命名空间”页面上找到豁免命名空间的说明以及由 Google Cloud 服务创建的常见命名空间的列表。

  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
    

Terraform

如需在安装了默认模板库的舰队中启用 Policy Controller,请参阅以下示例:

resource "google_gke_hub_feature" "policycontroller" {
  name     = "policycontroller"
  location = "global"
  project  = data.google_project.default.project_id

  fleet_default_member_config {
    policycontroller {
      policy_controller_hub_config {
        install_spec = "INSTALL_SPEC_ENABLED"
        policy_content {
          bundles {
            bundle = "pss-baseline-v2022"
          }
          template_library {
            installation = "ALL"
          }
        }
      }
    }
  }
}

您可以传递多个 bundle 块来安装 Policy Controller 包概览中列出的任何包 。

如需详细了解如何使用 Terraform,请参阅针对 Policy Controller 的 Terraform 支持。

验证政策控制器安装

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

控制台

请完成以下步骤:

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

    前往“政策”

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

gcloud

运行以下命令:

gcloud container fleet policycontroller describe --memberships=MEMBERSHIP_NAME

安装成功后会显示 membershipStates: MEMBERSHIP_NAME: policycontroller: state: ACTIVE。

验证限制条件模板库安装

安装 Policy Controller 时,系统会默认安装限制条件模板库。此安装过程可能需要几分钟才能完成。您可以验证模板库已成功安装。

控制台

请完成以下步骤:

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

    前往“政策”

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

gcloud

运行以下命令:

kubectl get constrainttemplates

您应该会看到类似于以下示例的输出:

NAME                                      AGE
k8sallowedrepos                           84s
k8scontainerlimits                        84s
k8spspallowprivilegeescalationcontainer   84s
...[OUTPUT TRUNCATED]...

正确安装单个限制条件模板后,其 status.created 字段为 true。

Policy Controller 与 Config Sync 的交互

如果您将 Policy Controller 与 Config Sync 搭配使用,则应注意由 Config Sync 同步的可靠来源(例如 Git 代码库)中存储的资源的以下交互行为:

  • 除非停用限制条件模板库,否则您将无法同步也是模板库一部分的限制条件模板。

  • 如果您要同步存储在 gatekeeper-system 命名空间中的 Config 资源,则必须只在可靠来源中定义 Config 资源;不得定义 gatekeeper-system Namespace。

配置指标

默认情况下,Policy Controller 会尝试将指标同时导出到 Prometheus 和 Cloud Monitoring。 您可能需要完成其他配置步骤(例如授予权限),以允许 Policy Controller 导出指标。 如需了解详情,请参阅使用 Policy Controller 指标。

管理限制条件模板库

如需了解有关卸载或安装限制条件模板、它们的关联限制条件或限制条件模板库的信息,请参阅创建限制条件。

命名空间免于强制执行

您可以配置 Policy Controller 以忽略命名空间中的对象。如需了解详情,请参阅从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 控制台中,前往安全状况管理部分下的政策页面。

    前往“政策”

  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 控制台中,前往安全状况管理部分下的政策页面。

    前往“政策”

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

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

gcloud

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

gcloud container fleet policycontroller disable \
  --memberships=MEMBERSHIP_NAME

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

政策控制器 RBAC 和权限

政策控制器包含具有高权限的工作负载。Open Policy Agent Gatekeeper 操作文档中介绍了这些工作负载的权限。

后续步骤