在 Autopilot 模式下控制特权工作负载准入

您可以在 Google Kubernetes Engine (GKE) Autopilot 模式下运行特权工作负载,方法是在集群中为这些工作负载安装许可清单。本文档介绍了如何执行以下任务:

  • 将 GKE 配置为仅在 Autopilot 模式下运行特定特权工作负载。
  • 为特权工作负载安装许可清单。

本文档面向以下类型的角色:

  • 希望确保第三方工作负载需要许可名单才能在集群上运行并且来自 GKE 批准的来源的安全工程师。
  • 希望在集群上启用第三方工作负载以取消屏蔽应用团队的平台工程师。

您应该已经熟悉以下概念:

关于 Autopilot 中的特权工作负载

Autopilot 模式会对工作负载强制执行一组默认限制条件,以改善您的安全状况。您可以通过安装与这些工作负载对应的许可清单来修改这些限制,以运行特定的特权工作负载。默认情况下,Autopilot 允许您安装来自 Autopilot 合作伙伴和特定开源项目的许可清单。符合条件的 GKE 客户还可以为上传到 Cloud Storage 存储桶的客户拥有的特权工作负载创建许可清单。

每个许可清单都是一个与特定特权工作负载匹配的文件。如需运行特权工作负载,请执行以下操作:

  1. 将集群配置为允许从特定路径安装许可清单。默认情况下,系统支持来自 Autopilot 合作伙伴和已获批准的开源项目的所有许可清单。
  2. 在集群中创建 AllowlistSynchronizer,以安装许可清单并使许可清单保持最新状态。

关于特权工作负载和许可名单的 bug 和功能请求

特权工作负载的所有者负责创建、开发和维护其工作负载和许可清单。如果您遇到 bug 或想要提出关于特权工作负载或许可清单的功能请求,请与相应的所有者联系。

准备工作

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

  • 启用 Google Kubernetes Engine API。
  • 启用 Google Kubernetes Engine API
  • 如需使用 Google Cloud CLI 执行此任务,请安装并初始化 gcloud CLI。如果您之前安装了 gcloud CLI,请通过运行 gcloud components update 命令来获取最新版本。较早版本的 gcloud CLI 可能不支持运行本文档中的命令。

要求

  • AllowlistSynchronizer 自定义资源需要 GKE 1.32.2-gke.1652000 版或更高版本。
  • 您必须知道要在集群中运行的特权工作负载。
  • 如需修改集群的许可清单路径配置,您的集群必须运行 GKE 1.35 版或更高版本。

为集群配置许可清单路径

本部分介绍如何配置集群,以支持从一组已批准的路径安装许可清单。默认情况下,Autopilot 支持从 GKE 合作伙伴和获批的开源项目安装许可清单。您可以为各个集群修改此默认配置。您还可以使用组织政策为整个组织、文件夹或项目指定已获批准的许可清单来源。

  1. 确定要添加到集群的许可清单文件的路径。您可以在创建或更新集群时指定多个路径。您还可以通过指定空字符串(而非路径)来禁止从任何来源安装许可清单。如需详细了解您可以指定的路径,请参阅许可清单路径。

  2. 如需控制集群的已批准许可清单来源,请在创建或更新 Autopilot 或 Standard 集群时使用 --autopilot-privileged-admission 标志,如以下命令所示:

    gcloud container clusters create-auto CLUSTER_NAME \
        --location=LOCATION \
        --autopilot-privileged-admission=ALLOWLIST1_PATH,ALLOWLIST2_PATH,...
    

    替换以下内容:

    • CLUSTER_NAME:新集群的名称。
    • LOCATION:集群控制平面的位置,例如 us-central1。
    • ALLOWLIST1_PATH,ALLOWLIST2_PATH,...:许可清单文件或目录的路径的逗号分隔列表。例如 gke://*,gs://my-agent/privileged-logging-agent.yaml。您还可以通过指定空字符串 ("") 来禁止从任何来源安装许可清单。

如果您在不指定 --autopilot-privileged-admission 标志的情况下更新现有集群,则该集群的现有路径配置不会更改。您不必在每次更新集群时都指定此标志。

集群创建或更新操作完成后,您可以通过创建 AllowlistSynchronizer 从指定路径安装许可清单。

创建新的 AllowlistSynchronizer

如需运行特权工作负载,您需要将相应许可名单文件的路径添加到 YAML 文件中的 AllowlistSynchronizer 规范。然后,您将 AllowlistSynchronizer 部署到集群。

  1. 在文本编辑器中,创建新的 YAML 文件。
  2. 将以下内容添加到该 YAML 文件中:

    apiVersion: auto.gke.io/v1
    kind: AllowlistSynchronizer
    metadata:
      name: ALLOWLIST_SYNCHRONIZER_NAME
    spec:
      allowlistPaths:
      - ALLOWLIST1_PATH
      - ALLOWLIST2_PATH
    

    替换以下内容:

    • ALLOWLIST_SYNCHRONIZER_NAME:新同步器的名称。选择一个描述性名称,用于标识许可名单支持的工作负载或团队。
    • ALLOWLIST1_PATH, ALLOWLIST2_PATH, ...:要安装的许可清单文件或目录的路径列表,例如以下 GKE 批准的许可清单示例:

      allowlistPaths:
      - Gke-Org/accelerators/*
      - Wiz/wiz-sensor/v1/wiz-sensor-v1.yaml
      

      或者,在以下客户拥有的许可清单示例中:

      allowlistPaths:
      - my-agent/log-collector/*
      - my-agent/privileged-logging-agent.yaml
      

      集群配置必须支持您指定的路径,如为集群配置许可清单路径部分中所述。此外,每个 AllowlistSynchronizer 必须仅包含 GKE 批准的许可清单,或仅包含客户拥有的许可清单。

  3. 如果您从 客户拥有的 Cloud Storage 存储桶安装许可清单,请将 spec.projectNumber 和 spec.bucketName 字段添加到 AllowlistSynchronizer。如需了解详情,请参阅 AllowlistSynchronizer CustomResourceDefinition。

  4. 将 YAML 文件部署到集群:

    kubectl apply -f PATH_TO_YAML_FILE
    

    将 PATH_TO_YAML_FILE 替换为您在上一步中创建的 YAML 文件的路径。

    AllowlistSynchronizer 控制器会在集群中安装指定路径中的许可名单文件。

  5. 等待同步器报告 Ready 状态:

    kubectl wait --for=condition=Ready allowlistsynchronizer/ALLOWLIST_SYNCHRONIZER_NAME \
        --timeout=60s
    

您还可以将许可清单安装和特权工作负载部署集成到持续集成和持续部署 (CI/CD) 流水线中。配置工作流,使其在许可清单成功安装后才部署相应的工作负载。

更新现有的 AllowlistSynchronizer

您可以更新现有的 AllowlistSynchronizer,以添加或移除许可名单文件。在以下情况下,您可能需要更新现有同步器:

  • 工作负载所有者添加了一个名称不同的新许可名单文件。
  • 您希望向现有同步器添加新的工作负载许可名单,以对相关许可名单进行分组。
  • 您希望从同步器中移除许可名单,因为您不再想使用相应的工作负载。

如需更新现有的 AllowlistSynchronizer 对象,请执行以下操作:

  1. 列出集群中的现有同步器:

    kubectl get allowlistsynchronizer
    
  2. 在文本编辑器中打开要更新的同步器的规范。

  3. 更新 spec.allowlistPaths 字段以添加、修改或移除许可名单文件路径。

  4. 保存并关闭文本编辑器。

  5. 将更新后的配置应用于集群:

    kubectl apply -f PATH_TO_YAML_FILE
    

    将 PATH_TO_YAML_FILE 替换为您在上一步中更新的 YAML 文件的路径。

部署更新后的同步器配置时,AllowlistSynchronizer 对象状态中的 managedAllowlistStatus.generation 字段会递增 1。然后,AllowlistSynchronizer 控制器会应用您的更改。

监控许可名单同步状态

安装 AllowlistSynchronizer 或更新现有同步器后,您可以监控同步状态。通过状态,您可以跟踪许可名单文件的安装、移除或修改情况,以及可能发生的任何错误。

如需监控同步的一般状态,请运行以下命令:

kubectl get allowlistsynchronizer ALLOWLIST_SYNCHRONIZER_NAME -o yaml

输出类似于以下内容:

...
status:
  conditions:
  - type: Ready
    status: "False"
    reason: "SyncError"
    message: "some allowlists failed to sync: example-allowlist-1.yaml"
    lastTransitionTime: "2024-10-12T10:00:00Z"
    observedGeneration: 2
  managedAllowlistStatus:
    - filePath: "gs://path/to/example-allowlist-2.yaml"
      generation: 1
      phase: Installed
      lastSuccessfulSync: "2024-10-10T10:00:00Z"
    - filePath: "gs://path/to/example-allowlist-1.yaml"
      phase: Failed
      lastError: "Initial install failed: invalid contents"
      lastSuccessfulSync: "2024-10-08T10:00:00Z"

在此示例输出中,example-allowlist-1.yaml 许可清单未能同步,而 example-allowlist-2.yaml 许可清单已成功安装。如需了解这些字段,请参阅 AllowlistSynchronizer 状态。

验证集群中是否存在许可名单

如需验证集群中是否存在许可名单,请运行以下命令:

kubectl get workloadallowlist

输出是集群中已安装许可名单的列表。检查输出是否包含您要使用的许可名单。

部署特权工作负载

成功安装许可名单后,您可以在集群中部署相应的工作负载。工作负载所有者还应向您提供工作负载的安装说明。如需查看 Autopilot 合作伙伴的列表以及其文档的链接,请参阅 Autopilot 合作伙伴。

使用私有映像镜像代码库

您可以将特权工作负载的容器映像镜像到您拥有的私有仓库中。如需在工作负载中运行这些镜像映像,您必须满足以下所有要求:

  • 镜像映像的 SHA-256 摘要必须与公开提供的工作负载的映像摘要一致。
  • 您指定的 SHA-256 映像摘要必须存在于已同步到您集群的 WorkloadAllowlist 对象中。

如果工作负载支持镜像映像,则该工作负载的许可清单规范包含映像摘要列表,这些映像摘要会包含在该工作负载的许可清单规范的 containers.imageDigests 字段中。通常,此字段包含容器映像的每种可用版本的单独摘要。如需查看此映像摘要列表,请执行以下操作:

  1. 验证集群中是否存在许可名单。
  2. 获取已安装的许可名单的规范:

    kubectl get workloadallowlist ALLOWLIST_NAME -o yaml
    

    将 ALLOWLIST_NAME 替换为已安装的许可名单的名称。例如 company-name-solution-v1.0.0。

    对于支持此功能的工作负载,输出类似于以下内容。imageDigests 字段包含一列允许的摘要。

    # lines omitted for clarity
    - containerName: pause-container1
      imageDigests:
      - cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229
      - 932ea160d395f3d7f76c0c17a52a63c4cfe1836a900f1058b6bc20b16fd10d23
    

    如果输出不包含 imageDigests 字段,或者您要使用的版本的摘要不在列表中,请直接与工作负载所有者联系,要求他们更新许可名单。工作负载所有者将映像摘要添加到其许可名单后,您集群中的许可名单同步器会自动安装更新后的许可名单。

  3. 将其中一个受支持的映像摘要添加到您的工作负载清单中。

例如,请考虑合作伙伴公开提供的 Pod 规范中的以下映像:

...
  containers:
  - name: pause-container1
    image: partner-repo/pause1@sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229
    securityContext:
      privileged: true

如果摘要与公开提供的摘要一致,那么您可以使用镜像映像,如以下示例所示:

...
  containers:
  - name: pause-container1
    image: my-private-repo/pause1@sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229
    securityContext:
      privileged: true

您必须在映像字段中添加 SHA-256 摘要,如上例所示。如果摘要不匹配,镜像映像将无法运行。如需在对合作伙伴映像创建镜像时保留映像摘要,请考虑使用 crane、ORAS 或 skopeo 等工具。

删除特权工作负载

如需不再允许特权工作负载在集群中运行,请从 AllowlistSynchronizer 中移除相应许可名单的路径。同步器会卸载该许可名单。

如果您从集群中删除 WorkloadAllowlist 对象,而不是更新同步器,则同步器会重新安装许可清单。请确保从 AllowlistSynchronizer 中移除路径。

如需卸载许可名单,请执行以下操作:

  1. 在管理许可清单的 AllowlistSynchronizer 的 YAML 清单中,移除要卸载的许可清单的路径。如需查看相关说明,请参阅“更新现有的 AllowlistSynchronizer”部分。
  2. 如需验证许可名单是否已卸载,请获取集群中 WorkloadAllowlist 对象的列表:

    kubectl get workloadallowlist
    

    在输出中,确保您要移除的许可名单未出现。

  3. 从集群中删除工作负载。如需查看相关说明,请参阅工作负载提供方的文档。

阻止在集群中安装许可名单

如需阻止在特定集群中安装特权工作负载许可名单,请在创建或更新集群时在 --autopilot-privileged-admission 标志中指定空字符串 ("")。

  • 如需为集群停用特定许可清单路径,请在创建或更新集群时省略这些许可清单的路径:

    gcloud container clusters update CLUSTER_NAME \
        --location=LOCATION \
        --autopilot-privileged-admission=ALLOWLIST1_PATH,ALLOWLIST2_PATH,...
    

    将 ALLOWLIST1_PATH,ALLOWLIST2_PATH,... 替换为以英文逗号分隔的许可清单来源路径列表。省略要停用的路径。

  • 如需在现有集群中停用所有许可清单,请将已批准的路径指定为空字符串:

    gcloud container clusters update CLUSTER_NAME \
        --location=LOCATION \
        --autopilot-allowlist-paths=""
    

问题排查

如果同步或工作负载部署失败,请参阅排查部署特权 Autopilot 工作负载的问题。

后续步骤