运行 GKE Autopilot 合作伙伴提供的特权工作负载


本页面介绍了如何运行 Google Kubernetes Engine (GKE) Autopilot 合作伙伴提供的特权工作负载。您将了解如何设置同步工作负载,以在集群中安装许可名单并保持许可名单最新状态。

本页面面向以下类型的角色:

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

如需详细了解我们在文档中提及的常见角色和示例任务,请参阅常见的 GKE 用户角色和任务

在阅读本页面之前,请确保您熟悉以下内容:

关于 Autopilot 中的特权合作伙伴工作负载

GKE 允许部分获批的合作伙伴在 Autopilot 集群中运行特权工作负载。这些特权工作负载可以绕过 Autopilot 强制执行的部分安全限制。例如,合作伙伴可能需要运行使用特定 Linux 功能或需要特权容器的工作负载。

合作伙伴为其特权工作负载创建和维护许可名单。每个许可名单都是与特定特权合作伙伴工作负载匹配的文件。合作伙伴将这些许可名单文件提交给 GKE 以供审批。获得批准后,GKE 会在 Google 管理的仓库中托管许可名单文件。

如需运行合作伙伴工作负载,您需要在集群中安装相应的许可名单文件。GKE 提供了一个名为 AllowlistSynchronizer 的 Kubernetes 自定义资源,可安装许可名单并使其保持最新状态。成功安装许可名单后,您可以部署相应的特权合作伙伴工作负载。

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

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

AllowlistSynchronizer 控制器简介

AllowlistSynchronizer 是在 GKE 控制平面中运行的控制器。您可以将新的 AllowlistSynchronizer 部署为 YAML 清单,方式与部署任何其他 Kubernetes 工作负载类似。在清单中,您可以指定要安装的许可名单文件的路径,该路径可从第三方合作伙伴处获取。同步器会在 Google 管理的仓库中查找合作伙伴的许可名单文件,并在集群中安装许可名单。

同步器每 10 分钟检查一次许可名单文件的更新。如果存在更新,同步器会在集群中安装更新后的许可名单。

如需不再允许特定工作负载,请更新现有的 AllowlistSynchronizer 以移除相应的许可名单文件路径,然后从集群中删除 WorkloadAllowlist 对象。如果您删除了已安装的 WorkloadAllowlist 对象,但未从许可名单同步器中移除路径,则该同步器会重新安装许可名单。合作伙伴无法从 Google 管理的仓库中删除许可名单文件。

准备工作

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

  • 启用 Google Kubernetes Engine API。
  • 启用 Google Kubernetes Engine API
  • 如果您要使用 Google Cloud CLI 执行此任务,请安装初始化 gcloud CLI。 如果您之前安装了 gcloud CLI,请运行 gcloud components update 以获取最新版本。

要求

  • AllowlistSynchronizer 自定义资源需要 GKE 1.32.2-gke.1652000 版或更高版本。
  • 您必须知道要在集群中运行的合作伙伴工作负载。如需了解如何安装特权工作负载,请参阅合作伙伴的文档。

创建新的 AllowlistSynchronizer

如需运行合作伙伴提供的特权工作负载,您需要将相应许可名单文件的路径添加到 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, ...:要安装的合作伙伴许可名单文件的一个或多个路径。请查看所选合作伙伴工作负载的文档,了解此路径的信息。您可以指定整个目录或单个文件。
  3. 将 YAML 文件部署到集群:

    kubectl apply -f PATH_TO_YAML_FILE
    

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

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

  4. 等待同步器报告 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/allowlist1.yaml"
      generation: 1
      phase: Installed
      lastSuccessfulSync: "2024-10-10T10:00:00Z"
    - filePath: "gs://path/to/allowlist2.yaml"
      phase: Failed
      lastError: "Initial install failed: invalid contents"
      lastSuccessfulSync: "2024-10-08T10:00:00Z"

如需了解这些字段,请参阅 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 字段,或者您要使用的版本的摘要不在列表中,请直接与合作伙伴联系,要求他们更新许可名单。合作伙伴将映像摘要添加到其许可名单并向 GKE 提交更改后,您集群中的许可名单同步器会自动安装更新后的许可名单。

  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 摘要,如上例所示。如果摘要不匹配,镜像映像将无法运行。如需在对合作伙伴映像创建镜像时保留映像摘要,请考虑使用 craneORASskopeo 等工具。

删除特权工作负载

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

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

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

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

    kubectl get workloadallowlist
    

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

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

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

如需阻止在特定集群中安装特权工作负载许可名单,请使用 ValidatingAdmissionPolicy。验证允许政策可确保 Kubernetes 资源符合特定条件,然后才允许在集群中运行。例如,您可以验证标签是否具有特定值。

如需阻止在集群中安装许可名单,请执行以下操作:

  1. 将以下 ValidatingAdmissionPolicy 清单保存为 disallow-allowlists.yaml

    apiVersion: admissionregistration.k8s.io/v1
    kind: ValidatingAdmissionPolicy
    metadata:
      name: "disallow-allowlists"
    spec:
      failurePolicy: Fail
      matchConstraints:
        resourceRules:
        - apiGroups:   ["auto.gke.io"]
          apiVersions: ["*"]
          operations:  ["*"]
          resources:   ["allowlistsynchronizers"]
      validations:
      - expression: "false"
        message: 'AllowlistSynchronizer creation is not allowed'
    
  2. 将以下 ValidatingAdmissionPolicyBinding 清单保存为 disallow-allowlists-binding.yaml

    apiVersion: admissionregistration.k8s.io/v1
    kind: ValidatingAdmissionPolicyBinding
    metadata:
      name: "disallow-allowlists-binding"
    spec:
      policyName: "disallow-allowlists"
      validationActions: [Deny]
    
  3. 在集群中部署 ValidatingAdmissionPolicy:

    kubectl apply -f disallow-allowlists.yaml
    kubectl apply -f disallow-allowlists-binding.yaml
    

此政策可阻止在集群中创建新的 AllowlistSynchronizer。

问题排查

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

后续步骤