
在 vSphere 7.0U3B 環境中部署 Tanzu Kubernetes Grid Service (TKGs) 時,即便按照官方文件操作,仍可能遭遇不少意料之外的挑戰。本文整理了在實際部署過程中遇到的三個關鍵問題:VM Class 關聯性、Pod 安全性原則 (PSP) 以及私有映像檔倉庫的憑證信任問題,並提供相應的解決方案,協助維運團隊避開這些常見的配置陷阱。
1. 創建 TKC 集群失敗:VM Class 的隱形依賴 #
在嘗試拉起 Kubernetes v1.21 版本的集群時,我們定義了一個標準的 TanzuKubernetesCluster YAML 文件,指定 Control Plane 與 Worker Nodes 皆使用 best-effort-small 的 VM Class。
apiVersion: run.tanzu.vmware.com/v1alpha1
kind: TanzuKubernetesCluster
metadata:
name: tkgs-cluster-1
namespace: test
spec:
distribution:
version: v1.21
topology:
controlPlane:
count: 1
class: best-effort-small
storageClass: tanzu-vsan-storage-policy
workers:
count: 2
class: best-effort-small
storageClass: tanzu-vsan-storage-policy
然而,執行 kubectl create -f tkc.yaml 後,卻收到了一個模糊的錯誤訊息:

問題根源與解決方案 #
透過增加詳細輸出參數 -v9 進行排查,發現系統無法找到指定的 VM Class。

這是在 vSphere 7.0u2a 版本引入 VM Service 功能後的行為改變。在舊版本中,我們可以直接在 YAML 中引用 VM Class;但在新版本中,必須先在 vSphere Namespace 層級明確關聯可用的 VM Class。
解決步驟:
- 進入 vSphere Namespace 設定頁面。
- 在 VM Service 區塊點擊 “Manage VM Classes”。
- 勾選 YAML 中定義的
best-effort-small。


完成關聯後,再次執行創建指令,TKC 集群即可順利部署。

2. Deployment 無法啟動:被忽視的 PodSecurityPolicy #
集群建立成功後,緊接著面臨的是應用程式部署失敗的問題。創建 Deployment 後,Pod 遲遲無法啟動。

問題根源與解決方案 #
檢查 ReplicaSet 的事件日誌,發現這是由於 TKGs 預設啟用了 PodSecurityPolicy (PSP) Admission Controller。這是一種安全機制,要求 Pod 必須在擁有相應權限的情況下才能運行。
在 TKGs 中,預設的安全策略會阻止未經授權的 Pod 啟動。
解決步驟:
為了解決這個問題,我們需要將適當的 PSP 綁定給使用者。雖然生產環境建議自定義最小權限原則,但在測試環境中,我們可以將 VMware 預設的 psp:vmware-system-privileged 綁定給所有已驗證的使用者 (system:authenticated)。
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: default-tkg-admin-privileged-binding
roleRef:
kind: ClusterRole
name: psp:vmware-system-privileged
apiGroup: rbac.authorization.k8s.io
subjects:
- kind: Group
apiGroup: rbac.authorization.k8s.io
name: system:authenticated
套用此 RoleBinding 後,Deployment 隨即正常啟動。

3. 私有倉庫映像檔拉取失敗:信任鏈的斷裂 #
最後一個挑戰是使用自建的 Container Registry。當 Pod 嘗試拉取映像檔時,出現了典型的 x509 憑證錯誤:

問題根源與解決方案 #
這是由於 TKGs 節點不信任私有倉庫的自簽憑證 (Self-signed Certificate)。要解決此問題,必須將私有倉庫的 CA 憑證加入到 TKGs 的信任列表中。
解決步驟:
使用 administrator 權限修改 TkgServiceConfiguration,將 Base64 編碼後的 CA 憑證加入 trust.additionalTrustedCAs 欄位。
apiVersion: run.tanzu.vmware.com/v1alpha2
kind: TkgServiceConfiguration
metadata:
name: tkg-service-configuration
spec:
defaultCNI: antrea
trust:
additionalTrustedCAs:
- name: first-cert-name
data: base64-encoded string of a PEM encoded public cert 1
修改設定後,需要觸發 TKC 節點的更新(例如重新部署集群)以讓新的憑證配置生效。完成後,Pod 即可成功從私有倉庫拉取映像檔。
