antony@notes:~/misc$ cat "部署-VKS-Clusters.md"
部署 VKS Clusters
部署 VKS Clusters
1. 先決條件
- 多個 ESX 主機透過 vSphere Distributed Switch (VDS) 連接。
- 已設定 Shared storage,例如 vSAN 或 NFS。
- 已啟用 vSphere HA 和 fully-automated DRS。
- 已啟用 vSphere Lifecycle Manager (vLCM)。
- 已設定網路,可使用 NSX 及其內嵌的 load balancer,或使用 VDS 搭配外部的 load balancer。
2. ESXI 安裝設定
- 幫每一台 esxi 都設定固定 ip、DNS



- 幫每一台 esxi 設定 ntp 校時


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 要再添加兩張網卡,總共三個,並且都要不同網段

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

- 第二台 ESXI

- 第三台 ESXI

設定 VDS 給 VIP 使用
- 此網段為
172.20.2.0/24 - 做出 VDS ,這個 VDS 給 VIP 使用
在 vSphere Client 中,導覽到 Datacenter。
在瀏覽器中的 Datacenter 上按一下滑鼠右鍵,然後選取 Distributed Switch > 新增 Distributed Switch。

輸入新 Distributed Switch 的名稱,例如:
DSwitch。
在選取版本中,輸入 Distributed Switch 的版本。 選取
8.0.3。
在設定組態中,輸入上行連接埠數目,輸入值
1和取名VIP。
檢閱設定,然後按一下完成。

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

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

加入 esxi 主機

- 指定一張網卡



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

- 加入 esxi 主機

- 指定一張網卡

2.4. 確認已設定 vsan

- 要記得略過快速入門

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

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


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

安裝 Avi VM

VMware Avi Load Balancer







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

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



設定 avi 自己的 vip

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

- 可以透過 vip 登入 avi

設定授權
到授權頁面把 license 改成 enterprise tier


設定 DNS/NTP
- Administration Settings DNS/NTP



設定 VMware Cloud
建立 vCenter Cloud 讓 Avi 能「在 vSphere 上自動部署並管理」Service Engine,並使用該 vSphere 環境的 network/storage/compute 資源來提供 load balancing
- 透過在「建立」下拉清單中選擇此選項來設定VMware vCenter/vSphere ESX雲端

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


- 配置 vCenter 的憑證


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

- 設定 Network

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

- Infrastructure > Cloud Resources > Networks

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

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

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


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


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

建立 DNS profile


- 這邊先新增任意一個 domain

- 再回到 VMware Cloud 設定 IPAM

設定 Certificate


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

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


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

- 更換訪問 avi 入口憑證


設定 Service Engine Group
- Infrastructure > Cloud Resources > Service Engine Group



設定 Static Routes
- Infrastructure > Cloud Resources > VRF Context

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


設定 vSphere zone


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

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






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

- 起始 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 範圍重疊

- 設定 workload cluster 網路資訊

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


創建 workload cluster(TKG)
- 確認 supervisor 狀態都正確


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

- 準備一台 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

- 建立一個
tkg-workloadsnamespace

新增權限

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

新增儲存區


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

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

- 也可以建立自定義 VM Class


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


登入 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 檢查是否已經存在

如果遇到一直同步失敗,就移除 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
- 登入 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 9m47stroubshooting
- 進到 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