Google Kubernetes Engine (GKE) Autopilot 叢集中的具備特殊權限工作負載必須正確設定,才能避免發生問題。設定錯誤可能會導致許可清單同步失敗,或導致工作負載遭到拒絕。這些問題可能會導致重要代理程式或服務無法以必要權限執行。
請參閱本文,排解在 Autopilot 上部署具備特權的工作負載時發生的問題。請參閱相關指南,瞭解如何解決許可清單同步處理錯誤,以及診斷特權工作負載遭拒的原因。
對於在 Autopilot 叢集上部署具有提升權限工作負載的平台管理員、營運人員和安全團隊而言,這項資訊非常重要。如要進一步瞭解 Google Cloud 內容中提及的常見角色和範例工作,請參閱「常見的 GKE 使用者角色和工作」。
允許清單同步處理問題
部署 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
欄位
會提供錯誤的詳細資訊。請參考這些資訊解決問題。
多個 AllowlistSynchronizer
在 1.33.4-gke.1035000 之前的 GKE 叢集版本中,如果存在多個 AllowlistSynchronizer
,WorkloadAllowlists
可能無法安裝。
如要解決這個問題,請只使用包含多個 allowlistPaths
的單一 AllowlistSynchronizer
。
或者,您也可以將叢集升級至較新版本。
部署具備特殊權限的工作負載時發生問題
成功安裝許可清單後,請在叢集中部署對應的具備權限工作負載。在某些情況下,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
的磁碟區掛接。
- 工作負載指定
如果您部署的第三方供應商提供的工作負載有違規情形,請向該供應商回報問題,以解決違規事項。提供上一個步驟的輸出內容。
具備特殊權限的工作負載和允許清單的錯誤與功能要求
合作夥伴有責任建立、開發及維護自己的高權限工作負載和允許清單。如果遇到錯誤,或對特許工作負載或許可清單有功能要求,請與對應的合作夥伴聯絡。
後續步驟
如果無法在說明文件中找到問題的解決方法,請參閱「取得支援」一文,尋求進一步的協助, 包括下列主題的建議:
- 與 Cloud 客戶服務聯絡,建立支援案件。
- 在 StackOverflow 上提問,並使用
google-kubernetes-engine
標記搜尋類似問題,向社群尋求支援。你也可以加入#kubernetes-engine
Slack 頻道,取得更多社群支援。 - 使用公開版 Issue Tracker 開啟錯誤或功能要求。