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


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

本页面适用于以下类型的角色:

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

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

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

关于 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.1-gke.1729000 版或更高版本。
  • 您必须知道要在集群中运行的合作伙伴工作负载。如需了解如何安装特权工作负载,请参阅合作伙伴的文档。

创建新的 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 合作伙伴

删除特权工作负载

如需不再允许特权工作负载在集群中运行,请从 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 工作负载时的问题

后续步骤