Skip to content

antony@notes:~/misc$ cat "部署-VKS-Clusters.md"

部署 VKS Clusters

2026-02-10· misc

部署 VKS Clusters

1. 先決條件

  • 多個 ESX 主機透過 vSphere Distributed Switch (VDS) 連接。
  • 已設定 Shared storage,例如 vSAN 或 NFS。
  • 已啟用 vSphere HAfully-automated DRS
  • 已啟用 vSphere Lifecycle Manager (vLCM)
  • 已設定網路,可使用 NSX 及其內嵌的 load balancer,或使用 VDS 搭配外部的 load balancer

2. ESXI 安裝設定

  • 幫每一台 esxi 都設定固定 ip、DNS

image

image

image

  • 幫每一台 esxi 設定 ntp 校時

image

image

2.1 設定 vCenter

參考:https://hackmd.io/@wu-andy/rkXpmTGteg

2.2. 環境資訊

  • vCenter 版本:8.0.3
  • 3 台 ESXi 版本:8.0.3

2.3. 設定 VSS 和 VDS

  • 每台 ESXI 要再添加兩張網卡,總共三個,並且都要不同網段

image

重新命名 VSS(VM Network)

  • 此網段為 172.21.1.0/24
  • 將 VSS(VM Network) 重新命名成 mgmt,所有 ESXI 都要做,這裡更改名稱主要是因為 supervisor 再找網卡會因為名稱有空格找不到

image image

  • 第二台 ESXI

image image

  • 第三台 ESXI

image image

設定 VDS 給 VIP 使用

  • 此網段為 172.20.2.0/24
  • 做出 VDS ,這個 VDS 給 VIP 使用
  1. 在 vSphere Client 中,導覽到 Datacenter。

  2. 在瀏覽器中的 Datacenter 上按一下滑鼠右鍵,然後選取 Distributed Switch > 新增 Distributed Switch。 image

  3. 輸入新 Distributed Switch 的名稱,例如:DSwitchimage

  4. 在選取版本中,輸入 Distributed Switch 的版本。 選取 8.0.3image

  5. 在設定組態中,輸入上行連接埠數目,輸入值 1 和取名 VIPimage

  6. 檢閱設定,然後按一下完成。 image

  7. 在您建立的 Distributed Switch 上按一下滑鼠右鍵,然後選取設定編輯設定。 image

  8. 在進階索引標籤上,輸入大於 1700 的值作為 MTU (位元組) 值,然後按一下確定。 在承載覆疊流量的任何網路上,MTU 大小必須大於或等於 1700。 例如,9000。 如果 vks 是安裝在 NSX 環境, MTU 就要設大於 1700。沒有的話可以只設 1500 image

  9. 加入 esxi 主機

image image image

  • 指定一張網卡

image

image image image

image

VDS 給 workload cluster 使用

  • 此網段為 172.20.3.0/24
  • 再做出一個 VDS,這個 VDS 給 workload cluster 使用

image image image image image

  • 加入 esxi 主機

image image image

  • 指定一張網卡

image image image image

2.4. 確認已設定 vsan

image

  • 要記得略過快速入門

image

  • 在監控 -> Skyline Health 點選無回應警示

image

2.5. 確認已啟用 vSphere HA 和 fully-automated DRS

image

image

2.6. 確認已啟用 vSphere Lifecycle Manager (vLCM)

image

安裝 Avi VM

image

VMware Avi Load Balancer

image

image

image

image

image

image

image

設定 Avi

第一次登入才需設管理帳號密碼

image

設定一組密碼,用來加密設定匯出與排程備份中的敏感資料(例如金鑰、憑證、雲端/整合帳密等)。之後做還原/匯入時,必須提供同一組密語,否則無法還原。

image

image

image

設定 avi 自己的 vip

image

  • 如果有多個 avi 主機也可以把其他主機加入,做出 avi 叢集

image

  • 可以透過 vip 登入 avi

image

設定授權

到授權頁面把 license 改成 enterprise tier

image

image

設定 DNS/NTP

  • Administration Settings DNS/NTP

image

image

image

設定 VMware Cloud

建立 vCenter Cloud 讓 Avi 能「在 vSphere 上自動部署並管理」Service Engine,並使用該 vSphere 環境的 network/storage/compute 資源來提供 load balancing

  1. 透過在「建立」下拉清單中選擇此選項來設定VMware vCenter/vSphere ESX雲端

image

  1. 為雲端提供一個名稱,然後從類型選單中選擇 VMware vCenter/vSphere ESX
  • 設定關閉 dhcp 和 ipv6
  • 勾選 Prefer Static Routes vs Directly Connected Network : Avi 在決定如何把 VIP 的流量送出去時,會優先使用「靜態路由(static route)」定義的 next-hop,而不是直接利用 SE 所在介面上的「直接相連(directly-connected)」行為(例如 ARP)去處理該子網流量

image

image

  1. 配置 vCenter 的憑證

image

image

  1. 選擇指定的 datacenter ,以及選擇 Service Engine(SE)用來做管理介面(management vNIC)的網路。不用勾選 content library,然後保存

image

  1. 設定 Network

image

  1. 設定後保存離開,等待狀態變為綠色

image

  1. Infrastructure > Cloud Resources > Networks

image

定義一個子網路(subnet)與一組靜態 IP 範圍,供 Controller 配發給 Virtual Service 的 VIP(虛擬 IP)和 Service Engine(SE)VM 的管理 / data IP

image

  1. 這邊定義 ip range,supervisor 在啟用的時候會先從裡面拿兩個 VIP 出來用,這兩個 VIP 後端會導流到 supervisor 在 worklaod 網路的那隻腳

image

所以 supervisor 會有三個 VIP

  1. 一個在管理網段(5 個 IP 裡面其中的一個) —> 提供 supervisor 內部運作用
  2. 兩個在 SE 的 VI P範圍 (獨立的兩個VIP) —> 提供使用這下指令與監控用 1 號不過 AVI ,由 supervisor CP 節點取得 2 號使用 AVI,在啟用過程中由 vCenter/Supervisor 發送 API 自動配置
  1. 定義 VIP ip range

image

image image

建立 IPAM profile

建立虛擬服務時,需要使用 IPAM 來指派虛擬 IP 位址。

image

image

  • 當有人(例如 vCenter Supervisor)向我要一個 VIP 時,我被授權從哪些網路發放 IP?這邊指定 VIP 的 network。

image

建立 DNS profile

image

image

  • 這邊先新增任意一個 domain

image

  • 再回到 VMware Cloud 設定 IPAM

image

設定 Certificate

image

image

  • 這邊 common name 要填的是 avi 自己的 vip 所對應的 domain

image

  • SAN 要填的就是 avi 自己的 vip 位置

image

image

  • 複製憑證,待會在創建 supervisor cluster 時會需要貼上此憑證

image

  • 更換訪問 avi 入口憑證

image

image

設定 Service Engine Group

  • Infrastructure > Cloud Resources > Service Engine Group

image

image

image

設定 Static Routes

  • Infrastructure > Cloud Resources > VRF Context

image

  • 這邊要設定 workload 網段要路由到 VIP 網段的 gateway

image

image

設定 vSphere zone

image

image

  • 選擇要用於 VKS 叢集和 vSphere Pod 的叢集

image

設定工作負載管理 (啟動 supervisor)

image

image

image

image

image

image

  • 要將前面在 avi 創建的憑證放進來

image

  • 起始 ip 這邊是設給 supervisor cluster 的 vip,他需要保留五個連續 ip ,所以這裡設定 172.21.1.30,就是代表到 172.21.1.34 都會分配給 supervisor cluster 使用,會使用的是 supervisor control plane 的節點 IP+VIP+升級保留,總共 5 個 IP,但是使用順序不一定
  • 這意這邊起始 ip 不能跟前面 avi 設定的 vip 範圍重疊

image

  • 設定 workload cluster 網路資訊

image

  • 這邊會設定 workload cluster 的 vm 他拿到的 ip 是在以下範圍
  • 網路名稱要填小寫
  • 網路範圍也不能跟前面重複

image

image

創建 workload cluster(TKG)

  • 確認 supervisor 狀態都正確

image

image

  • 開啟瀏覽器,連接 https://172.21.2.81,下載 kubectl CLI Plugin

image

  • 準備一台 ubuntu bastion 機使用指令下載
$ curl -k https://172.21.2.81/wcp/plugin/linux-amd64/vsphere-plugin.zip -o vsphere-plugin.zip
  • 解壓縮
$ sudo apt install unzip

$ unzip vsphere-plugin.zip

$ sudo cp -r bin/* /usr/local/bin
  • 登入 supervisor,使用 VC 帳號登入
$ kubectl vsphere login --insecure-skip-tls-verify --server=172.21.2.81


Username: administrator@vsphere.local
Password:
Logged in successfully.

You have access to the following contexts:
   172.21.2.81
   svc-tkg-domain-c19
   svc-velero-domain-c19

If the context you wish to use is not in this list, you may need to try
logging in again later, or contact your cluster administrator.

To change context, use `kubectl config use-context <workload name>`
  • 此時看到的 control-plane 三台就是剛剛創建的 supervisor vm,而 worker 就是 esxi 三台,因此如果在這裡創見 pod ,就是直接跑在 esxi 上
$ kubectl get no -owide
NAME                               STATUS   ROLES                  AGE     VERSION                  INTERNAL-IP   EXTERNAL-IP   OS-IMAGE                 KERNEL-VERSION       CONTAINER-RUNTIME
423d9b295547c821ffd05433fe560885   Ready    control-plane,master   42m     v1.30.10+vmware.1-fips   172.21.3.52   <none>        VMware Photon OS/Linux   5.10.237-2.ph4-esx   containerd://1.7.25+vmware.2-fips
423dee48377f7b6bf5ee23a17f104118   Ready    control-plane,master   42m     v1.30.10+vmware.1-fips   172.21.3.51   <none>        VMware Photon OS/Linux   5.10.237-2.ph4-esx   containerd://1.7.25+vmware.2-fips
423df53a268cb03c9c8f7833d1968033   Ready    control-plane,master   50m     v1.30.10+vmware.1-fips   172.21.3.50   <none>        VMware Photon OS/Linux   5.10.237-2.ph4-esx   containerd://1.7.25+vmware.2-fips
esxi1.andy.lab                     Ready    agent                  4m58s   v1.30.5-sph-806add6      172.21.1.2    <none>        <unknown>                <unknown>            <unknown>
esxi2.andy.lab                     Ready    agent                  7m      v1.30.5-sph-806add6      172.21.1.3    <none>        <unknown>                <unknown>            <unknown>
esxi3.andy.lab                     Ready    agent                  5m53s   v1.30.5-sph-806add6      172.21.1.4    <none>        <unknown>                <unknown>            <unknown>

建立 vSphere namespace

image

  • 建立一個 tkg-workloads namespace

image

新增權限

image

  • 設定 administrator@vsphere.local 為擁有者

image

新增儲存區

image

image

  • vSAN Default Storage Policy 在 sc 裡名稱會叫 vsan-default-storage-policy
$ kubectl get storageclass
NAME                                       PROVISIONER              RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
management-storage-policy-encryption       csi.vsphere.vmware.com   Delete          Immediate           true                   5d18h
management-storage-policy-regular          csi.vsphere.vmware.com   Delete          Immediate           true                   5d18h
management-storage-policy-single-node      csi.vsphere.vmware.com   Delete          Immediate           true                   5d18h
management-storage-policy-stretched-lite   csi.vsphere.vmware.com   Delete          Immediate           true                   5d18h
management-storage-policy-thin             csi.vsphere.vmware.com   Delete          Immediate           true                   5d18h
vm-encryption-policy                       csi.vsphere.vmware.com   Delete          Immediate           true                   5d18h
vsan-default-storage-policy                csi.vsphere.vmware.com   Delete          Immediate           true                   5d18h

新增 VM Class

image

  • 選用預設定義的 best-effort-medium

image

  • 也可以建立自定義 VM Class

image

image image

  • 建立一個 4core CPU,16G RAM

image

image

登入 supervisor,使用 VC 帳號登入

$ kubectl vsphere login --insecure-skip-tls-verify --server=172.21.2.81


Username: administrator@vsphere.local
Password:
Logged in successfully.

You have access to the following contexts:
   10.200.2.31
   svc-tkg-domain-c17
   svc-velero-domain-c17
   tkg-workloads
  • 切換 context
$ kubectl config use-context tkg-workloads
  • 檢視目前 TKG 可使用的版本,這邊會使用 v1.32.3---vmware.1-fips-vkr.2 版本
$ kubectl get tkr
v1.31.11---vmware.3-fips-vkr.1            v1.31.11+vmware.3-fips-vkr.1            True    True         5d17h
v1.31.4---vmware.1-fips-vkr.3             v1.31.4+vmware.1-fips-vkr.3             True    True         5d17h
v1.31.7---vmware.1-fips-vkr.2             v1.31.7+vmware.1-fips-vkr.2             True    True         5d17h
v1.32.0---vmware.6-fips-vkr.2             v1.32.0+vmware.6-fips-vkr.2             True    True         5d17h
v1.32.3---vmware.1-fips-vkr.2             v1.32.3+vmware.1-fips-vkr.2             True    True         5d17h
v1.32.7---vmware.3-fips-vkr.1             v1.32.7+vmware.3-fips-vkr.1             True    True         5d17h
......
  • 在 content library 檢查是否已經存在

image

如果遇到一直同步失敗,就移除 Kubernetes Service Content Library 後再重新指定讓他在同步一次

離線環境要自行準備 content library https://wp-content.vmware.com/v2/latest/參考

  • 編輯 cluster.yaml
$ nano my-tkg-cluster.yaml
apiVersion: run.tanzu.vmware.com/v1alpha2
kind: TanzuKubernetesCluster
metadata:
  name: tkgs-v2-cluster-default
  namespace: tkg-workloads
spec:
  topology:
    controlPlane:
      replicas: 1
      vmClass: best-effort-medium  # 根據自己定義的名稱更換
      storageClass: 'vsan-default-storage-policy' # 根據自己定義的名稱更換
      tkr:
        reference:
          name: v1.32.3---vmware.1-fips-vkr.2
    nodePools:
    - name: worker-nodepool-a1
      replicas: 1
      vmClass: best-effort-medium  # 根據自己定義的名稱更換
      storageClass: 'vsan-default-storage-policy' # 根據自己定義的名稱更換
      tkr:
        reference:
          name: v1.32.3---vmware.1-fips-vkr.2
  • 部署 3m1w 架構
apiVersion: run.tanzu.vmware.com/v1alpha2
kind: TanzuKubernetesCluster
metadata:
  name: my-tkgs-cluster
  namespace: tkg-workloads
spec:
  topology:
    controlPlane:
      replicas: 3
      vmClass: myvm  # 根據自己定義的名稱更換
      storageClass: 'vsan-default-storage-policy' # 根據自己定義的名稱更換
      tkr:
        reference:
          name: v1.32.3---vmware.1-fips-vkr.2
    nodePools:
    - name: worker-nodepool-a1
      replicas: 1
      vmClass: myvm  # 根據自己定義的名稱更換
      storageClass: 'vsan-default-storage-policy' # 根據自己定義的名稱更換
      volumes:
        - name: containerd
          mountPath: /var/lib/containerd
          capacity:
            storage: 50Gi
      tkr:
        reference:
          name: v1.32.3---vmware.1-fips-vkr.2
  settings:
    storage:
      defaultClass: 'vsan-default-storage-policy'
    network:
      cni:
        name: calico
      serviceDomain: cluster.local

新版使用 cluster yaml 部署 TKG 參考

  • 部署 TKG
$ kubectl apply -f my-tkg-cluster.yaml
  • 檢視 TKG 部署完成
$ kubectl -n tkg-workloads get tkc
Warning: run.tanzu.vmware.com/tanzukubernetescluster is deprecated. It is succeeded by cluster.x-k8s.io/cluster. Refer to documentation.
NAME                      CONTROL PLANE   WORKER   KUBERNETES RELEASE NAME         AGE   READY   KUBERNETES RELEASE COMPATIBLE   UPDATES AVAILABLE
tkgs-v2-cluster-default   1               1        v1.32.7---vmware.3-fips-vkr.1   80m   True    True

image

  • 登入 TKG 叢集
$ kubectl vsphere login --server=10.200.2.31 \
--tanzu-kubernetes-cluster-name tkgs-v2-cluster-default \
--tanzu-kubernetes-cluster-namespace tkg-workloads \
--insecure-skip-tls-verify \
-u administrator@vsphere.local
  • 檢視叢集狀態是否正常
$ kubectl get no
NAME                                                           STATUS   ROLES           AGE    VERSION
tkgs-v2-cluster-default-ljb66-8jk74                            Ready    control-plane   18m    v1.32.7+vmware.3-fips
tkgs-v2-cluster-default-worker-nodepool-a1-jh2cz-f65qq-9q5fl   Ready    <none>          9m1s   v1.32.7+vmware.3-fips

$ kubectl get po -A
NAMESPACE                      NAME                                                                           READY   STATUS      RESTARTS      AGE
kube-system                    antrea-agent-9dqxv                                                             2/2     Running     0             9m47s
kube-system                    antrea-agent-tjkn5                                                             2/2     Running     0             17m
kube-system                    antrea-controller-798b767987-7hl8h                                             1/1     Running     0             17m
kube-system                    coredns-5958c95bcd-hvdrg                                                       1/1     Running     0             18m
kube-system                    coredns-5958c95bcd-ms2qz                                                       1/1     Running     0             15m
kube-system                    docker-registry-tkgs-v2-cluster-default-ljb66-8jk74                            1/1     Running     0             19m
kube-system                    docker-registry-tkgs-v2-cluster-default-worker-nodepool-a1-jh2cz-f65qq-9q5fl   1/1     Running     0             9m47s
kube-system                    etcd-tkgs-v2-cluster-default-ljb66-8jk74                                       1/1     Running     0             19m
kube-system                    kube-apiserver-tkgs-v2-cluster-default-ljb66-8jk74                             1/1     Running     0             19m
kube-system                    kube-controller-manager-tkgs-v2-cluster-default-ljb66-8jk74                    1/1     Running     1 (17m ago)   19m
kube-system                    kube-proxy-lt8qd                                                               1/1     Running     0             9m47s
kube-system                    kube-proxy-rfmtp                                                               1/1     Running     0             18m
kube-system                    kube-scheduler-tkgs-v2-cluster-default-ljb66-8jk74                             1/1     Running     1 (17m ago)   19m
kube-system                    metrics-server-54d7fc854c-5v4zn                                                1/1     Running     0             17m
kube-system                    snapshot-controller-fd845b8f8-fwxr2                                            1/1     Running     0             18m
secretgen-controller           secretgen-controller-5dd46bbcfc-tljsr                                          1/1     Running     0             17m
tkg-system                     kapp-controller-7449dcf686-d2hnt                                               2/2     Running     0             18m
vmware-system-antrea           antrea-pre-upgrade-job-klmv4                                                   0/1     Completed   0             18m
vmware-system-auth             guest-cluster-auth-svc-vz9zh                                                   1/1     Running     0             16m
vmware-system-cloud-provider   guest-cluster-cloud-provider-86466bf878-jp8t2                                  1/1     Running     1 (17m ago)   18m
vmware-system-csi              vsphere-csi-controller-798c4f56b9-gcr69                                        7/7     Running     0             18m
vmware-system-csi              vsphere-csi-node-fqs8t                                                         3/3     Running     4 (15m ago)   18m
vmware-system-csi              vsphere-csi-node-r6csv                                                         3/3     Running     0             9m47s

troubshooting

  • 進到 VC
root@vc [ ~ ]# cd /usr/lib/vmware-wcp/

# 查看 supervisor 密碼
root@vc [ /usr/lib/vmware-wcp ]# ./decryptK8Pwd.py
Read key from file

Connected to PSQL

Cluster: domain-c17:16f96da8-eab0-4cb7-b70c-fdcb7737bb3a
IP: 10.200.0.60
PWD: (WV92wWtP{+7F^~1
------------------------------------------------------------
  • 登入 supervisor 後查看 pod 是否異常
root@422f993f634f1e829e2340fa1d73b0eb [ ~ ]# k -n vmware-system-ako get po
NAME                                                        READY   STATUS    RESTARTS   AGE
vmware-system-ako-ako-controller-manager-677ff55d9d-x5k94   1/1     Running   0          53m

參考

https://techdocs.broadcom.com/us/en/vmware-security-load-balancing/avi-load-balancer/avi-load-balancer-vmware-cloud-foundation/9-0/deploying-vsphere-supervisor-with-vds-and-avi-load-balancer.html

https://techdocs.broadcom.com/us/en/vmware-cis/vcf/vsphere-supervisor-services-and-standalone-components/latest/managing-vsphere-kubernetes-service/running-tkg-service-clusters/deploying-tkg-service-clusters.html

https://techdocs.broadcom.com/us/en/vmware-security-load-balancing/avi-load-balancer/avi-load-balancer/22-1/vmware-avi-load-balancer-administration-guide/access-settings/certificates/changing-the-nsx-advanced-load-balancer-controller-s-default-certificate.html