請參閱以下指示,根據自訂 ClusterClass 佈建 TKG 叢集。請注意,這些指示特定於 vSphere 8 U1 環境。
必要條件
從 vSphere 8 U1 版本開始,提供了根據自訂 ClusterClass 佈建 TKG 叢集的程序。如果使用的是 vSphere 8 U2,請參閱 v1beta1 範例:以自訂 ClusterClass 為基礎的叢集 (vSphere 8 U2 及更新版本的工作流程)。
請遵循以下必要條件。
- vSphere 8 U1 環境
- 工作負載管理已啟用
- 主管 已設定
- 安裝了 vSphere 適用的 Kubernetes CLI 工具 的 Ubuntu 用戶端
小心: 根據上游叢集 API
說明文件,自訂 ClusterClass 是一種實驗性 Kubernetes 功能。由於自訂 ClusterClass 可用的自訂範圍,VMware 無法測試或驗證所有可能的自訂。客戶負責測試、驗證其自訂 ClusterClass 叢集以及進行疑難排解。客戶可以開啟有關其自訂 ClusterClass 叢集的支援票證,VMware 支援會盡量提供協助,但無法保證解決針對自訂 ClusterClass 叢集提出的每個問題。在生產環境中部署自訂 ClusterClass 叢集之前,客戶應瞭解這些風險。
第 1 部分:建立自訂 ClusterClass
第一部分涉及透過複製名為
tanzukubernetescluster
的預設 ClusterClass 建立自訂 ClusterClass。
- 建立名為 custom-ns 的 vSphere 命名空間。
- 登入 主管。
- 將內容切換到名為 custom-ns 的 vSphere 命名空間。
- 取得預設 ClusterClass。
kubectl get clusterclass tanzukubernetescluster -o json
- 複製預設 ClusterClass,建立一個名為 custom-cc 的自訂 ClusterClass。
kubectl get clusterclass tanzukubernetescluster -o json | jq '.metadata.name="custom-cc"' | kubectl apply -f -
預期的結果:clusterclass.cluster.x-k8s.io/custom-cc created
- 取得自訂 ClusterClass。
kubectl get clusterclass custom-cc -o json
如有必要,您可以使用較少的 功能來檢視自訂 ClusterClass。
kubectl get clusterclass custom-cc -o json | less
備註: 發出命令「q」以減少結束。
第 2 部分:建立佈建 TKG 叢集所需的 主管 物件
下一部分是建立使用自訂 ClusterClass 對自訂 TKG 叢集進行初始部署所需的
主管 物件。
備註: 依預設,我們使用叢集名稱「ccc-cluster」。如果您使用不同的叢集名稱,則需要變更其適當的欄位。
- 為自我簽署的延伸憑證建立簽發者。
#self-signed-extensions-issuer.yaml apiVersion: cert-manager.io/v1 kind: Issuer metadata: name: self-signed-extensions-issuer spec: selfSigned: {}
kubectl apply -f self-signed-extensions-issuer.yaml -n custom-ns
預期的結果:issuer.cert-manager.io/self-signed-extensions-issuer created
- 建立延伸 CA 憑證的密碼。
#extensions-ca-certificate.yaml apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: ccc-cluster-extensions-ca spec: commonName: kubernetes-extensions duration: 87600h0m0s isCA: true issuerRef: kind: Issuer name: self-signed-extensions-issuer secretName: ccc-cluster-extensions-ca usages: - digital signature - cert sign - crl sign
kubectl apply -f extensions-ca-certificate.yaml -n custom-ns
預期的結果:certificate.cert-manager.io/ccc-cluster-extensions-ca created
- 建立延伸 CA 憑證的簽發者。
#extensions-ca-issuer.yaml apiVersion: cert-manager.io/v1 kind: Issuer metadata: name: ccc-cluster-extensions-ca-issuer spec: ca: secretName: ccc-cluster-extensions-ca
kubectl apply -f extensions-ca-issuer.yaml -n custom-ns
預期的結果:issuer.cert-manager.io/ccc-cluster-extensions-ca-issuer created
- 建立驗證服務憑證的密碼。
#auth-svc-cert.yaml apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: ccc-cluster-auth-svc-cert spec: commonName: authsvc dnsNames: - authsvc - localhost - 127.0.0.1 duration: 87600h0m0s issuerRef: kind: Issuer name: ccc-cluster-extensions-ca-issuer secretName: ccc-cluster-auth-svc-cert usages: - server auth - digital signature
kubectl apply -f auth-svc-cert.yaml -n custom-ns
預期的結果:certificate.cert-manager.io/ccc-cluster-auth-svc-cert created
- 確認簽發者和憑證的建立。
kubectl get issuers -n custom-ns NAME READY AGE ccc-cluster-extensions-ca-issuer True 2m57s self-signed-extensions-issuer True 14m
kubectl get certs -n custom-ns NAME READY SECRET AGE ccc-cluster-auth-svc-cert True ccc-cluster-auth-svc-cert 34s ccc-cluster-extensions-ca True ccc-cluster-extensions-ca 5m
第 3 部分:根據自訂 ClusterClass 建立 TKG 叢集
可以使用
叢集 v1beta1 API 根據 ClusterClass 建立叢集。基於自訂 ClusterClass 的 v1beta1 叢集需要以下最小變數集。
變數 | 說明 |
---|---|
vmClass | 請參閱對 TKG 服務 叢集使用虛擬機器類別。 |
storageClass | 請參閱為 vSphere 命名空間 設定持續性儲存區。 |
ntp | 用於啟用 主管 的 NTP 伺服器。 |
extensionCert | 在上一部分中建立「延伸 CA 憑證」後自動產生。 |
clusterEncryptionConfigYaml | 以下部分將逐步說明取得此檔案的程序 |
- 建立加密密碼。
#encryption-secret.yaml apiVersion: v1 data: key: all3dzZpODFmRmh6MVlJbUtQQktuN2ViQzREbDBQRHlxVk8yYXRxTW9QQT0= kind: Secret metadata: name: ccc-cluster-encryption type: Opaque
kubectl apply -f encryption-secret.yaml -n custom-ns
預期的結果:secret/ccc-cluster-encryption created
- 從 主管 收集 NTP 伺服器。
kubectl -n vmware-system-vmop get configmap vmoperator-network-config -o jsonpath={.data.ntpservers}
- 構建
cluster-with-ccc.yaml
資訊清單以佈建叢集。#cluster-with-ccc.yaml apiVersion: cluster.x-k8s.io/v1beta1 kind: Cluster metadata: name: ccc-cluster spec: clusterNetwork: pods: cidrBlocks: - 193.0.0.0/16 serviceDomain: managedcluster1.local services: cidrBlocks: - 198.201.0.0/16 topology: class: custom-cc version: v1.26.5---vmware.2-fips.1-tkg.1 controlPlane: metadata: {} replicas: 3 workers: machineDeployments: - class: node-pool metadata: { } name: node-pool-workers replicas: 3 variables: - name: vmClass value: guaranteed-medium - name: storageClass value: tkg-storage-profile - name: ntp value: time.acme.com - name: extensionCert value: contentSecret: key: tls.crt name: ccc-cluster-extensions-ca - name: clusterEncryptionConfigYaml value: LS0tCm...Ht9Cg==
在叢集資訊清單中,驗證或更新以下欄位:參數 說明 metadata.name
v1Beta1 叢集的名稱。 spec.topology.class
自訂 ClusterClass 的名稱。 spec.topology.version
Tanzu Kubernetes 版本 版本 spec.topology.variables.storageClass.value
連結到將佈建叢集的 vSphere 命名空間 的儲存區原則 spec.topology.variables.ntp.value
NTP 伺服器位址 spec.topology.variables.extensionCert.value.contentSecret.name
驗證 spec.topology.variables.clusterEncryptionConfigYaml.value
填入 ClusterEncryptionConfig 密碼中的 data.key
值 - 根據自訂 ClusterClass 建立叢集。
kubectl apply -f cluster-with-ccc.yaml -n custom-ns
預期的結果:cluster.cluster.x-k8s.io/ccc-cluster created
使用 vSphere Client,確認叢集已建立。
- 登入 TKG 叢集。
kubectl vsphere login --server=xxx.xxx.xxx.xxx --vsphere-username [email protected] --tanzu-kubernetes-cluster-name ccc-cluster --tanzu-kubernetes-cluster-namespace custom-ns
第 4 部分:建立管理 TKG 叢集所需的 主管 物件
套用具有 CCC 的叢集後,各種控制器將嘗試進行布建;但是,基礎結構資源仍需要額外的物件才能正確執行啟動程式。
參數 | 值 |
---|---|
驗證 | 需要收集驗證值並將其更新到名為 values.yaml 的檔案中 |
Base64 編碼 | values.yaml 檔案將編碼為 base64 字串 |
guest-cluster-auth-service-data-values.yaml | 在套用檔案之前,此字串將新增至從 CCC_config_yamls.tar.gz 下載的 guest-cluster-auth-service-data-values.yaml 檔案 |
GuestClusterAuthSvcDataValues 密碼 | 最後,必須修改客體叢集啟動程式,以參考新建立的 GuestClusterAuthSvcDataValues 密碼。 |
- 將內容切換至佈建叢集所在的 vSphere 命名空間。
kubectl config use-context custom-ns
- 取得
authServicePublicKeys
值。kubectl -n vmware-system-capw get configmap vc-public-keys -o jsonpath="{.data.vsphere\.local\.json}"
將結果複製到名為values.yaml
的文字檔案中。authServicePublicKeys: '{"issuer_url":"https://...SShrDw=="]}]}}'
- 取得叢集 UID 以更新
authServicePublicKeys
。kubectl get cluster -n custom-ns ccc-cluster -o yaml | grep uid
- 在
values.yaml
檔案的authServicePublicKeys
部分中,將叢集 UID 附加到「client_id
」值。語法:
vmware-tes:vc:vns:k8s:clusterUID
例如:vmware-tes:vc:vns:k8s:7d95b50b-4fd4-4642-82a3-5dbfe87f499c
- 取得憑證值 (將 ccc-cluster 取代為所選叢集名稱)。
kubectl -n custom-ns get secret ccc-cluster-auth-svc-cert -o jsonpath="{.data.tls\.crt}" | base64 -d
- 將憑證新增到
values.yaml
。在
authServicePublicKeys
部分下面新增憑證內容。備註: 憑證必須縮進 4 個空格,以避免出現錯誤。例如:authServicePublicKeys: '{"issuer_url":"https://...SShrDw=="]}]}}' ceritificate: | -----BEGIN CERTIFICATE----- MIIDPTCCAiWgAwIBAgIQMibGSjeuJelQoPxCof/+xzANBgkqhkiG9w0BAQsFADAg ... sESk/RDTB1UAvi8PD3zcbEKZuRxuo4IAJqFFbAabwULhjUo0UwT+dIJo1gLf5/ep VoIRJS7j6VT98WbKyZp5B4I= -----END CERTIFICATE-----
- 取得 privateKey 值。
kubectl -n custom-ns get secret ccc-cluster-auth-svc-cert -o jsonpath="{.data.tls\.key}"
- 驗證
values.yaml
檔案。authServicePublicKeys: '{"issuer_url":"https://10.197.79.141/openidconnect/vsphere.local","client_id":"vmware-tes:vc:vns:k8s:7d95...499c",...SShrDw=="]}]}}' certificate: | -----BEGIN CERTIFICATE----- MIIDPTCCAiWgAwIBAgIQWQyXAQDRMhgrGre8ysVN0DANBgkqhkiG9w0BAQsFADAg ... uJSBP49sF0nKz5nf7w+BdYE= -----END CERTIFICATE----- privateKey: LS0tLS1CRUdJTi...VktLS0tLQo=
- 使用 base64 編碼對
values.yaml
檔案進行雜湊處理,以收集guest-cluster-auth-service-data-values.yaml
檔案的輸出。base64 -i values.yaml -w 0
- 建立
guest-cluster-auth-service-data-values.yaml
檔案。以下是密碼的範本。apiVersion: v1 data: values.yaml: YXV0a...ExRbz0K kind: Secret metadata: labels: tkg.tanzu.vmware.com/cluster-name: ccc-cluster tkg.tanzu.vmware.com/package-name: guest-cluster-auth-service.tanzu.vmware.com.1.3.0+tkg.2-vmware name: ccc-cluster-guest-cluster-auth-service-data-values type: Opaque
請參閱下表,填入所需的密碼值。參數 值 data.values.yaml
values.yaml
的 Base64 編碼字串metadata.labels.cluster-name
叢集的名稱,例如
ccc-cluster
metadata.labels.package-name
guest-cluster-auth-service.tanzu.vmware.com.version
若要取得此值,請執行命令
kubectl get tkr v1.26.5---vmware.2-fips.1-tkg.1 -o yaml
根據您使用的版本變更 TKR 版本
metadata.name
叢集的名稱,例如
ccc-cluster
- 建立
guest-cluster-auth-service-data-values.yaml
密碼。kubectl apply -f guest-cluster-auth-service-data-values.yaml -n custom-ns
- 編輯叢集啟動程式以參考密碼。
kubectl edit clusterbootstrap ccc-cluster -n custom-ns
- 在行
guest-cluster-auth-service.tanzu.vmware.com.version:
下方新增以下行。valuesFrom: secretRef: ccc-cluster-guest-cluster-auth-service-data-values
例如:spec: additionalPackages: - refName: guest-cluster-auth-service.tanzu.vmware.com.1.3.0+tkg.2-vmware valuesFrom: secretRef: ccc-cluster-guest-cluster-auth-service-data-values
- 儲存並結束以套用 clusterbootstrap 修改。
第 5 部分:設定網繭安全性
如果使用的是 TKR 1.25 版及更新版本,請為名為 custom-ns
的 vSphere 命名空間 設定網繭安全性。請參閱為 TKR 1.25 及更新版本設定 PSA。
如果使用的是 TKR 1.24 版及更低版本,則叢集中的網繭需要繫結到網繭安全性原則。若要在叢集層級套用所需的資源物件,請使用下列程式。
- 收集 TKG 叢集 kubeconfig 。
kubectl -n custom-ns get secret ccc-cluster-kubeconfig -o jsonpath="{.data.value}" | base64 -d > ccc-cluster-kubeconfig
- 建立
psp.yaml
檔案。apiVersion: policy/v1beta1 kind: PodSecurityPolicy metadata: name: tanzu-system-kapp-ctrl-restricted spec: privileged: false allowPrivilegeEscalation: false requiredDropCapabilities: - ALL volumes: - configMap - emptyDir - projected - secret - downwardAPI - persistentVolumeClaim hostNetwork: false hostIPC: false hostPID: false runAsUser: rule: MustRunAsNonRoot seLinux: rule: RunAsAny supplementalGroups: rule: MustRunAs ranges: - min: 1 max: 65535 fsGroup: rule: MustRunAs ranges: - min: 1 max: 65535 readOnlyRootFilesystem: false
- 套用網繭安全性原則。
KUBECONFIG=ccc-cluster-kubeconfig kubectl apply -f psp.yaml
- 登入 TKG 叢集。
kubectl vsphere login --server=10.197.154.66 --vsphere-username [email protected] --insecure-skip-tls-verify --tanzu-kubernetes-cluster-name ccc-cluster --tanzu-kubernetes-cluster-namespace custom-ns
- 列出命名空間。
KUBECONFIG=ccc-cluster-kubeconfig kubectl get ns -A
NAME STATUS AGE default Active 13d kube-node-lease Active 13d kube-public Active 13d kube-system Active 13d secretgen-controller Active 13d tkg-system Active 13d vmware-system-antrea Active 13d vmware-system-cloud-provider Active 13d vmware-system-csi Active 13d vmware-system-tkg Active 13d
第 6 部分:vSphere SSO 角色與自訂 TKG 叢集同步
必須將在 vSphere 命名空間 中建置的 vCenter Single Sign-On 使用者的 rolebinding 從 主管 同步到 TKG 叢集,開發人員才能管理叢集工作負載。
此程序需要從
主管 匯出現有的 rolebinding 清單,收集具有「編輯」角色的 rolebinding,建立檔案
sync-cluster-edit-rolebinding.yaml
,然後使用其 KUBECONFIG 套用至 TKG 叢集。
- 從 主管 收集現有 rolebinding。
kubectl get rolebinding -n custom-ns -o yaml
- 從傳回的 rolebinding 物件清單中,識別
roleRef.name
等於「edit」的物件。例如:apiVersion: v1 items: - apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: creationTimestamp: "2023-08-25T18:44:45Z" name: ccc-cluster-8lr5x-ccm namespace: custom-ns ownerReferences: - apiVersion: vmware.infrastructure.cluster.x-k8s.io/v1beta1 blockOwnerDeletion: true controller: true kind: ProviderServiceAccount name: ccc-cluster-8lr5x-ccm uid: b5fb9f01-9a55-4f69-8673-fadc49012994 resourceVersion: "108766602" uid: eb93efd4-ae56-4d9f-a745-d2782885e7fb roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: ccc-cluster-8lr5x-ccm subjects: - kind: ServiceAccount name: ccc-cluster-8lr5x-ccm namespace: custom-ns - apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: creationTimestamp: "2023-08-25T18:44:45Z" name: ccc-cluster-8lr5x-pvcsi namespace: custom-ns ownerReferences: - apiVersion: vmware.infrastructure.cluster.x-k8s.io/v1beta1 blockOwnerDeletion: true controller: true kind: ProviderServiceAccount name: ccc-cluster-8lr5x-pvcsi uid: d9342f8f-13d2-496d-93cb-b24edfacb5c1 resourceVersion: "108766608" uid: fd1820c7-7993-4299-abb7-bb67fb17f1fd roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: ccc-cluster-8lr5x-pvcsi subjects: - kind: ServiceAccount name: ccc-cluster-8lr5x-pvcsi namespace: custom-ns - apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: creationTimestamp: "2023-08-25T16:58:06Z" labels: managedBy: vSphere name: wcp:custom-ns:group:vsphere.local:administrators namespace: custom-ns resourceVersion: "108714148" uid: d74a98c7-e7da-4d71-b1d5-deb60492d429 roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: edit subjects: - apiGroup: rbac.authorization.k8s.io kind: Group name: sso:[email protected] - apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: creationTimestamp: "2023-08-25T16:58:21Z" labels: managedBy: vSphere name: wcp:custom-ns:user:vsphere.local:administrator namespace: custom-ns resourceVersion: "108714283" uid: 07f7dbba-2670-4100-a59b-c09e4b2edd6b roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: edit subjects: - apiGroup: rbac.authorization.k8s.io kind: User name: sso:[email protected] kind: List metadata: resourceVersion: ""
- 建立名為
sync-cluster-edit-rolebinding.yaml
的檔案,新增除預設 [email protected] 以外的任何其他 rolebinding。例如:apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: labels: run.tanzu.vmware.com/vmware-system-synced-from-supervisor: "yes" name: vmware-system-auth-sync-wcp:custom-ns:group:vsphere.local:administrators roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - apiGroup: rbac.authorization.k8s.io kind: Group name: sso:[email protected] apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: labels: run.tanzu.vmware.com/vmware-system-synced-from-supervisor: "yes" name: vmware-system-auth-sync-wcp:custom-ns:group:SSODOMAIN.COM:testuser roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - apiGroup: rbac.authorization.k8s.io kind: Group name: sso:[email protected]
備註: 在metadata.name
欄位中,所有使用者的使用者角色前面都會加上vmware-system-auth-sync-
。對於所有非預設角色,需要修改 metadata.name 和 subjects.name 項目。 - 套用 sync-cluster-edit-rolebinding.yaml 組態以同步 rolebinding。
KUBECONFIG=ccc-cluster-kubeconfig kubectl apply -f sync-cluster-edit-rolebinding.yaml