快轉到主要內容

TKGs Cluster 部署實戰:從踩坑到落地的技術指南

Joshan Fan | 范茗閎
作者
Joshan Fan | 范茗閎
熱愛網路、虛擬化和雲原生等技術 😆

在 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 後,卻收到了一個模糊的錯誤訊息:

“The request is invalid”

問題根源與解決方案
#

透過增加詳細輸出參數 -v9 進行排查,發現系統無法找到指定的 VM Class。

這是在 vSphere 7.0u2a 版本引入 VM Service 功能後的行為改變。在舊版本中,我們可以直接在 YAML 中引用 VM Class;但在新版本中,必須先在 vSphere Namespace 層級明確關聯可用的 VM Class。

解決步驟:

  1. 進入 vSphere Namespace 設定頁面。
  2. 在 VM Service 區塊點擊 “Manage VM Classes”。
  3. 勾選 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 即可成功從私有倉庫拉取映像檔。

參考資料
#