排查部署特权 Autopilot 工作负载的问题


本页面介绍如何解决在 Google Kubernetes Engine (GKE) Autopilot 集群中部署的特权工作负载的问题。

许可名单同步问题

当您部署 AllowlistSynchronizer 时,GKE 会尝试安装并同步您指定的许可名单文件。如果此同步失败,AllowlistSynchronizerstatus 字段会报告错误。

获取 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"

conditions.message 字段和 managedAllowlistStatus.lastError 字段会提供有关错误的详细信息。请使用此信息来解决问题。

特权工作负载部署问题

成功安装许可名单后,您可以在集群中部署相应的特权工作负载。在某些情况下,GKE 可能会拒绝工作负载。

请尝试以下解决方案:

  • 确保集群的 GKE 版本符合工作负载的版本要求。
  • 确保您要部署的工作负载是许可名单文件所应用的工作负载。

如需了解特权工作负载遭拒的原因,请向 GKE 请求有关许可名单违规行为的详细信息:

  1. 获取集群中已安装的许可名单列表:

    kubectl get workloadallowlist
    

    找到应该应用于特权工作负载的许可名单的名称。

  2. 在文本编辑器中打开特权工作负载的 YAML 清单。如果您无法访问 YAML 清单,例如,如果工作负载部署流程使用其他工具,请与工作负载提供商联系以提交问题。跳过其余步骤。

  3. 将以下标签添加到特权工作负载 Pod 规范的 spec.metadata.labels 部分:

    labels:
      cloud.google.com/matching-allowlist: ALLOWLIST_NAME
    

    ALLOWLIST_NAME 替换为您在上一步中获得的许可名单名称。使用 kubectl get workloadallowlist 命令输出中的名称,而不是许可名单文件的路径。

  4. 保存清单并将工作负载应用于集群:

    kubectl apply -f WORKLOAD_MANIFEST_FILE
    

    WORKLOAD_MANIFEST_FILE 替换为清单文件的路径。

    输出会详细说明工作负载中的哪些字段与指定的许可名单不匹配,如下例所示:

    Error from server (GKE Warden constraints violations): error when creating "STDIN": admission webhook "warden-validating.common-webhooks.networking.gke.io" denied the request:
    
    ===========================================================================
    Workload Mismatches Found for Allowlist (example-allowlist-1):
    ===========================================================================
    HostNetwork Mismatch: Workload=true, Allowlist=false
    HostPID Mismatch: Workload=true, Allowlist=false
    Volume[0]: data
             - data not found in allowlist. Verify volume with matching name exists in allowlist.
    Container[0]:
    - Envs Mismatch:
            - env[0]: 'ENV_VAR1' has no matching string or regex pattern in allowlist.
            - env[1]: 'ENV_VAR2' has no matching string or regex pattern in allowlist.
    - Image Mismatch: Workload=k8s.gcr.io/diff/image, Allowlist=k8s.gcr.io/pause2. Verify that image string or regex match.
    - SecurityContext:
            - Capabilities.Add Mismatch: the following added capabilities are not permitted by the allowlist: [SYS_ADMIN SYS_PTRACE]
    - VolumeMount[0]: data
            - data not found in allowlist. Verify volumeMount with matching name exists in allowlist.
    

    在此示例中,存在以下违规行为:

    • 工作负载指定了 hostNetwork: true,但许可名单未指定 hostNetwork: true
    • 工作负载指定了 hostPID: true,但许可名单未指定 hostPID: true
    • 工作负载指定了一个名为 data 的卷,但许可名单未指定名为 data 的卷。
    • 容器指定了名为 ENV_VAR1ENV_VAR2 的环境变量,但许可名单未指定这些环境变量。
    • 容器指定了映像 k8s.gcr.io/diff/image,但许可名单指定了 k8s.gcr.io/pause2
    • 容器添加了 SYS_ADMINSYS_PTRACE 功能,但许可名单不允许添加这些功能。
    • 容器指定了名为 data 的卷装载,但许可名单未指定名为 data 的卷装载。

如果您要部署由第三方提供商提供的工作负载,请向该提供商提交问题以解决违规问题。提供上一步中问题的输出。

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

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