請參閱以下指示,根據自訂 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。
  1. 建立名為 custom-nsvSphere 命名空間
  2. 登入 主管
  3. 將內容切換到名為 custom-nsvSphere 命名空間
  4. 取得預設 ClusterClass。
    kubectl get clusterclass tanzukubernetescluster -o json
  5. 複製預設 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
  6. 取得自訂 ClusterClass。
    kubectl get clusterclass custom-cc -o json

    如有必要,您可以使用較少的 功能來檢視自訂 ClusterClass。

    kubectl get clusterclass custom-cc -o json | less
    備註: 發出命令「q」以減少結束。

第 2 部分:建立佈建 TKG 叢集所需的 主管 物件

下一部分是建立使用自訂 ClusterClass 對自訂 TKG 叢集進行初始部署所需的 主管 物件。
備註: 依預設,我們使用叢集名稱「ccc-cluster」。如果您使用不同的叢集名稱,則需要變更其適當的欄位。
  1. 為自我簽署的延伸憑證建立簽發者。
    #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
  2. 建立延伸 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
  3. 建立延伸 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
  4. 建立驗證服務憑證的密碼。
    #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
  5. 確認簽發者和憑證的建立。
    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 以下部分將逐步說明取得此檔案的程序
  1. 建立加密密碼。
    #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
  2. 主管 收集 NTP 伺服器。
    kubectl -n vmware-system-vmop get configmap vmoperator-network-config -o jsonpath={.data.ntpservers}
  3. 構建 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
  4. 根據自訂 ClusterClass 建立叢集。
    kubectl apply -f cluster-with-ccc.yaml -n custom-ns
    預期的結果:
    cluster.cluster.x-k8s.io/ccc-cluster created

    使用 vSphere Client,確認叢集已建立。

  5. 登入 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 密碼。
  1. 將內容切換至佈建叢集所在的 vSphere 命名空間
    kubectl config use-context custom-ns
  2. 取得 authServicePublicKeys 值。
    kubectl -n vmware-system-capw get configmap vc-public-keys -o jsonpath="{.data.vsphere\.local\.json}"
    將結果複製到名為 values.yaml 的文字檔案中。
    authServicePublicKeys: '{"issuer_url":"https://...SShrDw=="]}]}}'
  3. 取得叢集 UID 以更新 authServicePublicKeys
    kubectl get cluster -n custom-ns ccc-cluster -o yaml | grep uid
  4. values.yaml 檔案的 authServicePublicKeys 部分中,將叢集 UID 附加到「client_id」值。

    語法:vmware-tes:vc:vns:k8s:clusterUID

    例如:
    vmware-tes:vc:vns:k8s:7d95b50b-4fd4-4642-82a3-5dbfe87f499c
  5. 取得憑證值 (將 ccc-cluster 取代為所選叢集名稱)。
    kubectl -n custom-ns get secret ccc-cluster-auth-svc-cert -o jsonpath="{.data.tls\.crt}" | base64 -d
  6. 將憑證新增到 values.yaml

    authServicePublicKeys 部分下面新增憑證內容。

    備註: 憑證必須縮進 4 個空格,以避免出現錯誤。
    例如:
    authServicePublicKeys: '{"issuer_url":"https://...SShrDw=="]}]}}'
    ceritificate: |
        -----BEGIN CERTIFICATE-----
        MIIDPTCCAiWgAwIBAgIQMibGSjeuJelQoPxCof/+xzANBgkqhkiG9w0BAQsFADAg
        ...
        sESk/RDTB1UAvi8PD3zcbEKZuRxuo4IAJqFFbAabwULhjUo0UwT+dIJo1gLf5/ep
        VoIRJS7j6VT98WbKyZp5B4I=
        -----END CERTIFICATE-----
  7. 取得 privateKey 值。
    kubectl -n custom-ns get secret ccc-cluster-auth-svc-cert -o jsonpath="{.data.tls\.key}"
  8. 驗證 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=
    
  9. 使用 base64 編碼對 values.yaml 檔案進行雜湊處理,以收集 guest-cluster-auth-service-data-values.yaml 檔案的輸出。
    base64 -i values.yaml -w 0
  10. 建立 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

  11. 建立 guest-cluster-auth-service-data-values.yaml 密碼。
    kubectl apply -f guest-cluster-auth-service-data-values.yaml -n custom-ns
  12. 編輯叢集啟動程式以參考密碼。
    kubectl edit clusterbootstrap ccc-cluster -n custom-ns
  13. 在行 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
  14. 儲存並結束以套用 clusterbootstrap 修改。

第 5 部分:設定網繭安全性

如果使用的是 TKR 1.25 版及更新版本,請為名為 custom-nsvSphere 命名空間 設定網繭安全性。請參閱為 TKR 1.25 及更新版本設定 PSA

如果使用的是 TKR 1.24 版及更低版本,則叢集中的網繭需要繫結到網繭安全性原則。若要在叢集層級套用所需的資源物件,請使用下列程式。
  1. 收集 TKG 叢集 kubeconfig 。
    kubectl -n custom-ns get secret ccc-cluster-kubeconfig -o jsonpath="{.data.value}" | base64 -d > ccc-cluster-kubeconfig
  2. 建立 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
  3. 套用網繭安全性原則。
    KUBECONFIG=ccc-cluster-kubeconfig kubectl apply -f psp.yaml
  4. 登入 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
  5. 列出命名空間。
    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 叢集。
  1. 主管 收集現有 rolebinding。
    kubectl get rolebinding -n custom-ns  -o yaml
  2. 從傳回的 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: ""
    
  3. 建立名為 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 項目。
  4. 套用 sync-cluster-edit-rolebinding.yaml 組態以同步 rolebinding。
    KUBECONFIG=ccc-cluster-kubeconfig kubectl apply -f sync-cluster-edit-rolebinding.yaml