本页面介绍如何解决在 Google Kubernetes Engine (GKE) Autopilot 集群中部署的特权工作负载的问题。
许可名单同步问题
当您部署 AllowlistSynchronizer
时,GKE 会尝试安装并同步您指定的许可名单文件。如果此同步失败,AllowlistSynchronizer
的 status
字段会报告错误。
获取 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 请求有关许可名单违规行为的详细信息:
获取集群中已安装的许可名单列表:
kubectl get workloadallowlist
找到应该应用于特权工作负载的许可名单的名称。
在文本编辑器中打开特权工作负载的 YAML 清单。如果您无法访问 YAML 清单,例如,如果工作负载部署流程使用其他工具,请与工作负载提供商联系以提交问题。跳过其余步骤。
将以下标签添加到特权工作负载 Pod 规范的
spec.metadata.labels
部分:labels: cloud.google.com/matching-allowlist: ALLOWLIST_NAME
将
ALLOWLIST_NAME
替换为您在上一步中获得的许可名单名称。使用kubectl get workloadallowlist
命令输出中的名称,而不是许可名单文件的路径。保存清单并将工作负载应用于集群:
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_VAR1
和ENV_VAR2
的环境变量,但许可名单未指定这些环境变量。 - 容器指定了映像
k8s.gcr.io/diff/image
,但许可名单指定了k8s.gcr.io/pause2
。 - 容器添加了
SYS_ADMIN
和SYS_PTRACE
功能,但许可名单不允许添加这些功能。 - 容器指定了名为
data
的卷装载,但许可名单未指定名为data
的卷装载。
- 工作负载指定了
如果您要部署由第三方提供商提供的工作负载,请向该提供商提交问题以解决违规问题。提供上一步中问题的输出。
关于特权工作负载和许可名单的 bug 和功能请求
合作伙伴负责创建、开发和维护其特权工作负载和许可名单。如果您遇到 bug 或想要提出关于特权工作负载或许可名单的功能请求,请与相应的合作伙伴联系。