本主題說明如何為 Tanzu Kubernetes Grid (TKG) 獨立管理叢集建立自訂 ClusterClass
資源,如何使用它建立以類別為基礎的工作負載叢集,以及使用基於自訂 ClusterClass 的叢集。
若要使叢集以自訂 ClusterClass 為基礎,請將其 spec.topology.class
設定為自訂 ClusterClass 名稱。
這些程序不適用於具有 vSphere with Tanzu 主管的 TKG。
注意根據上游叢集 API 說明文件,自訂 ClusterClass 是一種實驗性 Kubernetes 功能。由於自訂 ClusterClass 可用的自訂範圍,VMware 無法測試或驗證所有可能的自訂。客戶負責測試、驗證其自訂 ClusterClass 叢集以及進行疑難排解。客戶可以開啟有關其自訂 ClusterClass 叢集的支援票證,VMware 支援會盡量提供協助,但無法保證解決針對自訂 ClusterClass 叢集提出的每個問題。在生產環境中部署自訂 ClusterClass 叢集之前,客戶應瞭解這些風險。要使用預設
ClusterClass
資源建立工作負載叢集,請按照叢集部署步驟中的程序操作。
如要建立自訂 ClusterClass,您需要在本機安裝 ytt
、imgpkg
、Tanzu CLI 和 kubectl
。有關如何下載和安裝 ytt
和 imgpkg
的資訊,請參見安裝 Carvel 工具。
如要建立自訂 ClusterClass,VMware 建議從現有的預設 ClusterClass 資訊清單或 YTT 範本開始,如建立基本 ClusterClass 資訊清單中所述。發佈新版本的預設 ClusterClass 物件時,可以將覆疊套用至該新版本,例如新版本的 TKG,以便實作相同的自訂。本主題中的程序說明了這種建立自訂 ClusterClass 物件的方法。
如要在不使用現有範本的情況下編寫全新的 ClusterClass 物件,請按照叢集 API 說明文件中的寫入 ClusterClass中的程序進行操作。
您可以根據預設 ClusterClass 資訊清單或 Tanzu Kubernetes Grid 提供的 YTT 範本建立基本 ClusterClass 資訊清單。您建立的任何自訂叢集都應基於此基本 ClusterClass 資訊清單。該程序有 3 個步驟:
有三種方法可用於為叢集建立基本 ClusterClass 資訊清單。
重要方法 2 和 3 適用於需要符合以下使用案例的進階使用者:
- 您希望為 CI 系統產生自訂的 ClusterClass 定義,而不必部署獨立的管理叢集。
- 您希望工作負載叢集使用與管理叢集不同的基礎架構。
在 Tanzu Kubernetes Grid v2.3.0 及更新版本中,部署管理叢集後,可以在 ~/.config/tanzu/tkg/clusterclassconfigs
資料夾中找到預設 ClusterClass 資訊清單。
如要查看已部署管理叢集的目標平台的資訊清單,請執行以下命令:
tree ~/.config/tanzu/tkg/clusterclassconfigs/
例如,如果您將管理叢集部署到 vSphere,您將看到以下 YAML 檔案。
.config/tanzu/tkg/clusterclassconfigs/
└── tkg-vsphere-default-v1.1.0.yaml
1 directory, 1 file
產生的資訊清單包含已從管理叢集部署擷取之目標平臺的相關資訊。您可以直接將它當成自訂 ClusterClass 建立的基本資訊清單。有關後續步驟,請參閱自訂基本 ClusterClass 資訊清單。
安裝 Tanzu CLI v1.0.0 或更新版本後,但在部署管理叢集之前,可以在 ~/.config/tanzu/tkg/providers/infrastructure-<provider name>/<provider version>/cconly
資料夾中找到預設 ClusterClass 的 YTT 範本。您可以使用這些範本建立用於建立自訂基本的 ClusterClass 資訊清單。
如要尋找範本,請為您的目標平台執行相應的命令。
tree ~/.config/tanzu/tkg/providers/infrastructure-vsphere/v1.7.0/cconly
您將看到以下 YAML 檔。
.config/tanzu/tkg/providers/infrastructure-vsphere/v1.7.0/cconly
├── base.yaml
├── overlay-kube-apiserver-admission.yaml
└── overlay.yaml
1 directory, 3 files
tree ~/.config/tanzu/tkg/providers/infrastructure-aws/v2.1.3/cconly
您將看到以下 YAML 檔。
.config/tanzu/tkg/providers/infrastructure-aws/v2.1.3/cconly
├── base.yaml
├── overlay-kube-apiserver-admission.yaml
└── overlay.yaml
tree ~/.config/tanzu/tkg/providers/infrastructure-azure/v1.9.2/cconly/
您將看到以下 YAML 檔。
.config/tanzu/tkg/providers/infrastructure-azure/v1.9.2/cconly/
├── base.yaml
├── overlay-kube-apiserver-admission.yaml
└── overlay.yaml
建立一個名為 user_input.yaml
的 YTT 資料值檔案,其中包含以下內容。
#@data/values
#@overlay/match-child-defaults missing_ok=True
---
將適用於目標平台的組態值新增到 user_input.yaml
。
您可以使用部署管理叢集部署時使用的組態值。例如,vSphere 的 user_input.yaml
檔案將類似於以下內容:
#@data/values
#@overlay/match-child-defaults missing_ok=True
---
ENABLE_MHC: true
ENABLE_MHC_CONTROL_PLANE: true
ENABLE_MHC_WORKER_NODE: true
MHC_UNKNOWN_STATUS_TIMEOUT: 5m
MHC_FALSE_STATUS_TIMEOUT: 12m
MHC_MAX_UNHEALTHY_CONTROL_PLANE: 100%
MHC_MAX_UNHEALTHY_WORKER_NODE: 100%
NODE_STARTUP_TIMEOUT: 20m
VSPHERE_TLS_THUMBPRINT: 0A:B4:8F:2E:E4:34:82:90:D5:6A:F8:77:8C:8C:51:24:D2:49:3B:E8
VSPHERE_DATACENTER: /dc0
VSPHERE_DATASTORE: /dc0/datastore/sharedVmfs-0
VSPHERE_FOLDER: /dc0/vm
VSPHERE_NETWORK: /dc0/network/VM Network
VSPHERE_RESOURCE_POOL: /dc0/host/cluster0/Resources
VSPHERE_SERVER: xxx.xxx.xxx.xxx
VSPHERE_USERNAME: [email protected]
VSPHERE_CONTROL_PLANE_DISK_GIB: "20"
VSPHERE_CONTROL_PLANE_MEM_MIB: "8192"
VSPHERE_CONTROL_PLANE_NUM_CPUS: "4" VSPHERE_WORKER_DISK_GIB: "20"
VSPHERE_WORKER_MEM_MIB: "8192"
VSPHERE_WORKER_NUM_CPUS: "4"
VSPHERE_CLUSTER_CLASS_VERSION: "v1.1.0" # change it to the version in TKG BOM
NAMESPACE: "tkg-system" # DO NOT change it
使用 ytt
為您的目標平台產生基本 ClusterClass 資訊清單。
ytt -f ~/.config/tanzu/tkg/providers/infrastructure-vsphere/v1.7.0/cconly -f ~/.config/tanzu/tkg/providers/config_default.yaml -f user_input.yaml
ytt -f ~/.config/tanzu/tkg/providers/infrastructure-aws/v2.1.3/cconly -f ~/.config/tanzu/tkg/providers/config_default.yaml -f user_input.yaml
ytt -f ~/.config/tanzu/tkg/providers/infrastructure-azure/v1.9.2/cconly -f ~/.config/tanzu/tkg/providers/config_default.yaml -f user_input.yaml
現在,您已為基礎架構產生基本資訊清單,有關後續步驟,請參見自訂基本 ClusterClass 資訊清單。
預設 ClusterClass 的 YTT 範本也可以從 TKG 映像存放庫下載。您可以使用這些範本建立用於建立自訂基本的 ClusterClass 資訊清單。
從官方 TKG 登錄中的 providerTemplate
映像中提取 YTT 範本。
對於 TKG v2.3.1,providerTemplate
映像標記為 v0.30.2
。您可以透過搜尋 providerTemplateImage
在 TKG BOM 檔案中尋找標記版本。
imgpkg pull -i projects.registry.vmware.com/tkg/tanzu_core/provider/provider-templates:v0.30.2 -o providers
您會看到類似下列內容的輸出:
Pulling image 'projects.registry.vmware.com/tkg/tanzu_core/provider/provider-templates@sha256:b210d26c610800f5da4b3aa55bfbc8ffae9275fa2c4073a2b1332e2045a6e1da'
Extracting layer 'sha256:3ba336232c0e616b2b6c8f263593497c5a059a645f4c6137ea0eb658f4a8538a' (1/1)
Succeeded
YAML 範本檔將下載到 providers
資料夾中。
建立一個名為 user_input.yaml
的 YTT 資料值檔案,其中包含以下內容。
#@data/values
#@overlay/match-child-defaults missing_ok=True
---
將適用於目標平台的組態值新增到 user_input.yaml
。
您可以使用部署管理叢集部署時使用的組態值。例如,vSphere 的 user_input.yaml
檔案將類似於以下內容:
#@data/values
#@overlay/match-child-defaults missing_ok=True
---
ENABLE_MHC: true
ENABLE_MHC_CONTROL_PLANE: true
ENABLE_MHC_WORKER_NODE: true
MHC_UNKNOWN_STATUS_TIMEOUT: 5m
MHC_FALSE_STATUS_TIMEOUT: 12m
MHC_MAX_UNHEALTHY_CONTROL_PLANE: 100%
MHC_MAX_UNHEALTHY_WORKER_NODE: 100%
NODE_STARTUP_TIMEOUT: 20m
VSPHERE_TLS_THUMBPRINT: 0A:B4:8F:2E:E4:34:82:90:D5:6A:F8:77:8C:8C:51:24:D2:49:3B:E8
VSPHERE_DATACENTER: /dc0
VSPHERE_DATASTORE: /dc0/datastore/sharedVmfs-0
VSPHERE_FOLDER: /dc0/vm
VSPHERE_NETWORK: /dc0/network/VM Network
VSPHERE_RESOURCE_POOL: /dc0/host/cluster0/Resources
VSPHERE_SERVER: xxx.xxx.xxx.xxx
VSPHERE_USERNAME: [email protected]
VSPHERE_CONTROL_PLANE_DISK_GIB: "20"
VSPHERE_CONTROL_PLANE_MEM_MIB: "8192"
VSPHERE_CONTROL_PLANE_NUM_CPUS: "4" VSPHERE_WORKER_DISK_GIB: "20"
VSPHERE_WORKER_MEM_MIB: "8192"
VSPHERE_WORKER_NUM_CPUS: "4"
VSPHERE_CLUSTER_CLASS_VERSION: "v1.1.0" # change it to the version in TKG BOM
NAMESPACE: "tkg-system" # DO NOT change it
使用 ytt
為您的目標平台產生基本 ClusterClass 資訊清單。
ytt -f providers/infrastructure-vsphere/v1.7.0/cconly -f providers/config_default.yaml -f user_input.yaml
ytt -f providers/infrastructure-aws/v2.1.3/cconly -f providers/config_default.yaml -f user_input.yaml
ytt -f ~/.config/tanzu/tkg/providers/infrastructure-azure/v1.9.2/cconly -f ~/.config/tanzu/tkg/providers/config_default.yaml -f user_input.yaml
現在,您已為基礎架構產生基本資訊清單,有關後續步驟,請參見自訂基本 ClusterClass 資訊清單。
若要自訂 ClusterClass 資訊清單,請在該資訊清單旁建立 ytt
覆疊檔。以下範例顯示了如何在 ClusterClass 定義中修改 Linux 核心參數。
建立 custom
資料夾,結構如下所示:
tree custom
custom
|-- overlays
|-- filter.yaml
|-- kernels.yaml
編輯 custom/overlays/kernels.yaml
。
例如,將 nfConntrackMax
新增為變數,然後為其定義一個修補程式,該修補程式會將其值新增控制平面節點的核心參數 net.netfilter.nf_conntrack_max
。
此覆疊在 preKubeadmCommands
欄位附加一個命令,以將組態寫入到 sysctl.conf
。若要使設定生效,可以附加命令 sysctl -p
以套用此變更。預設 ClusterClass 定義不可變,因此此覆疊還會透過新增 -extended
來變更自訂 ClusterClass 及其所有範本的名稱。
cat custom/overlays/kernels.yaml
#@ load("@ytt:overlay", "overlay")
#@overlay/match by=overlay.subset({"kind":"ClusterClass"})
---
apiVersion: cluster.x-k8s.io/v1beta1
kind: ClusterClass
metadata:
name: tkg-vsphere-default-v1.1.0-extended
spec:
variables:
- name: nfConntrackMax
required: false
schema:
openAPIV3Schema:
type: string
patches:
- name: nfConntrackMax
enabledIf: '{{ not (empty .nfConntrackMax) }}'
definitions:
- selector:
apiVersion: controlplane.cluster.x-k8s.io/v1beta1
kind: KubeadmControlPlaneTemplate
matchResources:
controlPlane: true
jsonPatches:
- op: add
path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/-
valueFrom:
template: echo "net.netfilter.nf_conntrack_max={{ .nfConntrackMax }}" >> /etc/sysctl.conf
- op: add
path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/-
value: sysctl -p
移除不希望變更的資源。
在此範例中,所有範本都將在自訂和預設 ClusterClass 之間共用,以便全部移除。您也可以以同樣的方式基於預設範本建立自訂範本,在這種情況下,請確保不排除 kind
。
cat custom/overlays/filter.yaml
#@ load("@ytt:overlay", "overlay")
#@overlay/match by=overlay.not_op(overlay.subset({"kind": "ClusterClass"})),expects="0+"
---
#@overlay/remove
使用預設 ClusterClass 資訊清單產生基本 ClusterClass。
ytt -f tkg-vsphere-default-v1.1.0.yaml -f custom/overlays/filter.yaml > default_cc.yaml
產生自訂 ClusterClass。
ytt -f tkg-vsphere-default-v1.1.0.yaml -f custom/ > custom_cc.yaml
(可選) 檢查預設 ClusterClass 與自訂 ClusterClass 之間的差異,以確認變更已套用。
diff default_cc.yaml custom_cc.yaml
您會看到類似下列內容的輸出:
4c4
< name: tkg-vsphere-default-v1.1.0
---
> name: tkg-vsphere-default-v1.1.0-extended
638a639,643
> - name: nfConntrackMax
> required: false
> schema:
> openAPIV3Schema:
> type: string
2607a2613,2628
> - name: nfConntrackMax
> enabledIf: '{{ not (empty .nfConntrackMax) }}'
> definitions:
> - selector:
> apiVersion: controlplane.cluster.x-k8s.io/v1beta1
> kind: KubeadmControlPlaneTemplate
> matchResources:
> controlPlane: true
> jsonPatches:
> - op: add
> path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/-
> valueFrom:
> template: echo "net.netfilter.nf_conntrack_max={{ .nfConntrackMax }}" >> /etc/sysctl.conf
> - op: add
> path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/-
> value: sysctl -p
在此範例中,您可以看到已將 -extended
新增到叢集名稱中。
如要使管理叢集能夠使用自訂 ClusterClass,請透過套用新資訊清單來安裝它。
套用 ClusterClass 資訊清單。
kubectl apply -f custom_cc.yaml
您應會看到以下輸出。
clusterclass.cluster.x-k8s.io/tkg-vsphere-default-v1.1.0-extended created
檢查自訂 ClusterClass 是否已散佈到預設命名空間,例如:
kubectl get clusterclass
您應會看到以下輸出。
NAME AGE
tkg-vsphere-default-v1.1.0 2d23h
tkg-vsphere-default-v1.1.0-extended 11s
建立自訂 ClusterClass 後,您可以使用它建立包含自訂的新工作負載叢集。
使用 --dry-run
選項執行 tanzu cluster create
,從標準叢集組態檔產生叢集資訊清單。
tanzu cluster create --file workload-1.yaml --dry-run > default_cluster.yaml
建立 ytt
覆疊或直接編輯叢集資訊清單。
建議的選項是建立 ytt
覆疊 (例如,cluster_overlay.yaml
) 以執行以下操作:
topology.class
值替換為自訂 ClusterClass 的名稱variables
區塊與修改 ClusterClass 物件規格一樣,只要存在新的上游叢集版本,依照以下方式使用覆疊,即可自動將變更套用至新物件:
#@ load("@ytt:overlay", "overlay")
#@overlay/match by=overlay.subset({"kind":"Cluster"})
---
apiVersion: cluster.x-k8s.io/v1beta1
kind: Cluster
spec:
topology:
class: tkg-vsphere-default-v1.1.0-extended
variables:
- name: nfConntrackMax
value: "1048576
產生 custom_cluster.yaml
資訊清單:
ytt -f default_cluster.yaml -f cluster_overlay.yaml > custom_cluster.yaml
(選用) 與上方的 ClusterClass 一樣,可以執行 diff
以將自訂類別叢集資訊清單與以預設類別為基礎的叢集進行比較,例如:
diff custom_cluster.yaml default_cluster.yaml
您會看到類似下列內容的輸出:
< class: tkg-vsphere-default-v1.1.0
---
> class: tkg-vsphere-default-v1.1.0-extended
142a143,144
> - name: nfConntrackMax
> value: "1048576"
以上述產生的自訂資訊清單為基礎,來建立自訂工作負載叢集,如下所示。
建立叢集。
tanzu cluster create -f custom_cluster.yaml
檢查建立的物件內容。
例如,對於上述核心修改,請擷取 KubeadmControlPlane
物件並確認已設定核心組態:
kubectl get kcp workload-1-jgwd9 -o yaml
您會看到類似下列內容的輸出:
apiVersion: controlplane.cluster.x-k8s.io/v1beta1
kind: KubeadmControlPlane
...
preKubeadmCommands:
- hostname "{{ ds.meta_data.hostname }}"
- echo "::1 ipv6-localhost ipv6-loopback" >/etc/hosts
- echo "127.0.0.1 localhost" >>/etc/hosts
- echo "127.0.0.1 {{ ds.meta_data.hostname }}" >>/etc/hosts
- echo "{{ ds.meta_data.hostname }}" >/etc/hostname
- echo "net.netfilter.nf_conntrack_max=1048576" >> /etc/sysctl.conf
- sysctl -p
...
登入控制平面節點並確認其 sysctl.conf
已修改:
capv@workload-1-jgwd9:~$ sudo cat /etc/sysctl.conf
...
net.ipv6.neigh.default.gc_thresh3=16384
fs.file-max=9223372036854775807
net.netfilter.nf_conntrack_max=1048576
如果使用先前版本建立了自訂叢集,則可以將其升級到最新的 TKG 版本。
升級叢集之前,需要執行一些準備步驟。
在升級管理叢集之前,請使用為上一版本建立的自訂資訊清單版本建立測試叢集。
例如,建立一個名為 test-upgrade
的自訂叢集。
取得 TKG 2.2 管理叢集提供的 ClusterClass 版本的相關資訊。
kubectl get clusterclass
如果使用 TKG v2.2.0 建立自訂叢集,ClusterClass 版本應為 1.0.0。例如:
NAME AGE
tkg-vsphere-default-extended-v1.0.0 21m
tkg-vsphere-default-v1.0.0 10d
取得有關在 test-upgrade
叢集中執行的 ClusterClass 版本的資訊。
kubectl get cluster test-upgrade -o jsonpath='{.spec.topology.class}'
輸出應為 tkg-vsphere-default-extended-v1.0.0
。
依照升級獨立管理叢集中的說明操作,將管理叢集升級到 TKG 2.3。
取得將管理叢集升級到 v.2.3 後可用的 ClusterClass 版本的相關資訊。
kubectl get cluster mgmt-cluster-name -n tkg-system -o jsonpath='{.spec.topology.class}'
如果管理叢集在 vSphere 上執行,輸出應為 tkg-vsphere-default-v1.1.0
。
tkg-vsphere-default-v1.1.0-extended
並包含與舊版本 tkg-vsphere-default-extended-v1.0.0
相同的自訂變數。custom_cc.yaml
命名。在管理叢集中安裝新的自訂 ClusterClass。
kubectl apply -f custom_cc.yaml
取得管理叢集現在可用的 ClusterClass 版本的相關資訊。
kubectl get clusterclass
應同時顯示舊版本和較新版本。
NAME AGE
tkg-vsphere-default-extended-v1.0.0 61m
tkg-vsphere-default-v1.0.0 10d
tkg-vsphere-default-v1.1.0 25m
tkg-vsphere-default-v1.1.0-extended 15s
在執行準備步驟後,可以在升級生產叢集之前在測試叢集上測試升級。
將叢集 test-upgrade
從舊版本的自訂 ClusterClass 調整為新版本。
kubectl patch cluster test-upgrade --type merge -p '{"spec": {"topology": {"class": "tkg-vsphere-default-v1.1.0-extended"}}}'
輸出應為 cluster.cluster.x-k8s.io/test-upgrade patched
。
取得有關現在在 test-upgrade
叢集中執行的 ClusterClass 版本的資訊。
kubectl get cluster test-upgrade -o jsonpath='{.spec.topology.class}'
輸出應為 tkg-vsphere-default-v1.1.0-extended
。以前其為 tkg-vsphere-default-extended-v1.0.0
。
等待幾分鐘,然後執行 kubectl get cluster
,直到看到 UpdatesAvailable
已更新為 true
。
kubectl get cluster test-upgrade -o yaml
準備就緒後,輸出中應顯示類似於以下內容的訊息:
...
status:
conditions:
...
- lastTransitionTime: "2023-06-19T09:59:21Z"
message: '[v1.25.9+vmware.1-tkg.1-20230609 v1.26.4+vmware.1-tkg.1-20230609]'
status: "True"
type: UpdatesAvailable
controlPlaneReady: true
infrastructureReady: true
observedGeneration: 5
phase: Provisioned
升級 test-upgrade
叢集。
tanzu cluster upgrade test-upgrade
檢查建立的物件內容。
例如,對於上述核心修改,請擷取 KubeadmControlPlane
物件並確認已設定核心組態:
kubectl get kcp test-upgrade-nsc6d -o yaml
您會看到類似下列內容的輸出:
apiVersion: controlplane.cluster.x-k8s.io/v1beta1
kind: KubeadmControlPlane
...
preKubeadmCommands:
- hostname "{{ ds.meta_data.hostname }}"
- echo "::1 ipv6-localhost ipv6-loopback" >/etc/hosts
- echo "127.0.0.1 localhost" >>/etc/hosts
- echo "127.0.0.1 {{ ds.meta_data.hostname }}" >>/etc/hosts
- echo "{{ ds.meta_data.hostname }}" >/etc/hostname
- sed -i 's|".*/pause|"projects-stg.registry.vmware.com/tkg/pause|' /etc/containerd/config.toml
- systemctl restart containerd
- echo "net.netfilter.nf_conntrack_max=1048576" >> /etc/sysctl.conf
- sysctl -p
如果測試升級成功,請在生產叢集上重複執行升級中的步驟。
附註如果在升級過程中遇到任何錯誤,可以透過將叢集從新版本的自訂 ClusterClass 重訂基底回退為舊版本。
如果已建立具有預設 ClusterClass 的叢集,並且希望將其更新為使用自訂 ClusterClass,請使用 kubectl
編輯叢集物件:
spec.topology.class
更改為自訂 ClassClass 資訊清單的名稱。spec.topology.variables
以附加自訂變數。如果要還原為新版本的預設 ClusterClass:
spec.topology.class
變更為新版本的預設 ClusterClass。spec.topology.variables
以移除自訂變數。您可能需要新增在新版本的預設 ClusterClass 中定義的新變數。