透過叢集 v1beta1 API,可以預設的 ClusterClass 定義為基礎佈建叢集。

ClusterClass API v1beta1

Kubernetes 叢集 API 是一套工具,用於提供 Kubernetes 叢集的宣告式佈建、升級和運作。ClusterClass 是叢集 API 的演進版本,可用於定義管理多組叢集的生命週期的範本。主管上的 TKG 2.0 使用 v1beta1 API 支援 ClusterClass。

主管上的 TKG 2.0 隨附一個名為 tanzukubernetescluster 的預設 ClusterClass 定義。tanzukubernetescluster ClusterClass 為使用 v1beta API 在主管上建立 TKG 2.0 叢集提供範本。tanzukubernetescluster ClusterClass 在所有使用者命名空間中均可用。若要基於此 ClusterClass 建立叢集,請在叢集規格中參考它。如需有關指引,請參閱 v1beta 範例。

預設 ClusterClass tanzukubernetescluster

預設 tanzukubernetescluster ClusterClass 是不可變的。它在此處僅作為參考提供。
apiVersion: cluster.x-k8s.io/v1beta1
kind: ClusterClass
metadata:
  name: tanzukubernetescluster
  annotations:
    run.tanzu.vmware.com/resolve-tkr: ""
spec:
  controlPlane:
    metadata:
      annotations:
        run.tanzu.vmware.com/resolve-os-image: os-name=photon
    ref:
      apiVersion: controlplane.cluster.x-k8s.io/v1beta1
      kind: KubeadmControlPlaneTemplate
      name: "tkc-control-plane"
    machineInfrastructure:
      ref:
        kind: VSphereMachineTemplate
        apiVersion: vmware.infrastructure.cluster.x-k8s.io/v1beta1
        name: "tkc-control-plane"
    machineHealthCheck:
      maxUnhealthy: 100%
      nodeStartupTimeout: 2h0m0s
      unhealthyConditions:
        - status: Unknown
          timeout: 5m0s
          type: Ready
        - status: "False"
          timeout: 12m0s
          type: Ready
  infrastructure:
    ref:
      apiVersion: vmware.infrastructure.cluster.x-k8s.io/v1beta1
      kind: VSphereClusterTemplate
      name: "tkc-infrastructure"
  workers:
    machineDeployments:
      - class: node-pool  
        template:
          metadata:
            annotations:
              run.tanzu.vmware.com/resolve-os-image: os-name=photon            
          bootstrap:
            ref:
              kind: KubeadmConfigTemplate
              apiVersion: bootstrap.cluster.x-k8s.io/v1beta1
              name: "tkc-md"
          infrastructure:
            ref:
              kind: VSphereMachineTemplate
              apiVersion: vmware.infrastructure.cluster.x-k8s.io/v1beta1
              name: "tkc-md"
        machineHealthCheck:
          maxUnhealthy: 100%
          nodeStartupTimeout: 2h0m0s
          unhealthyConditions:
            - status: Unknown
              timeout: 5m0s
              type: Ready
            - status: "False"
              timeout: 12m0s
              type: Ready
  variables:
    - name: TKR_DATA
      required: false
      schema:
        openAPIV3Schema:
          type: object
          additionalProperties:
            type: object
            properties:
              kubernetesSpec:
                type: object
                properties:
                  version:
                    type: string
                  imageRepository:
                    type: string
                  etcd:
                    type: object
                    properties:
                      imageTag:
                        type: string
                  coredns:
                    type: object
                    properties:
                      imageTag:
                        type: string
              osImageRef:
                type: object
                properties:
                  name:
                    type: string
              labels:
                type: object
                additionalProperties:
                  type: string
    - name: vmClass
      required: true
      schema:
        openAPIV3Schema:
          type: string
    - name: storageClass
      required: true
      schema:
        openAPIV3Schema:
          type: string
    - name: storageClasses
      required: false
      schema:
        openAPIV3Schema:
          type: array
          items:
            type: string
    - name: defaultStorageClass
      required: false
      schema:
        openAPIV3Schema:
          type: string
    - name: extensionCert
      required: false
      schema:
        openAPIV3Schema:
          type: object
          properties:
            contentSecret:
              type: object
              properties:
                name:
                  type: string
                key:
                  type: string
    - name: clusterEncryptionConfigYaml
      required: false
      schema:
        openAPIV3Schema:
          type: string
    - name: defaultRegistrySecret
      required: false
      schema:
        openAPIV3Schema:
          type: object
          properties:
            namespace:
              type: string
            name:
              type: string
            data:
              type: string
    - name: ntp
      required: false
      schema:
        openAPIV3Schema:
          type: string
    - name: user
      required: false
      schema:
        openAPIV3Schema:
          type: object
          properties:
            passwordSecret:
              type: object
              properties:
                name:
                  type: string
                key:
                  type: string
            sshAuthorizedKey:
              type: string
    - name: nodePoolTaints
      required: false
      schema:
        openAPIV3Schema:
          type: array
          items:
            type: object
            properties:
              key:
                type: string
              value:
                type: string
              effect:
                type: string
              timeAdded:
                type: integer
    - name: nodePoolLabels
      required: false
      schema:
        openAPIV3Schema:
          type: array
          items:
            type: object
            properties:
              key:
                type: string
              value:
                type: string
    - name: proxy
      required: false
      schema:
        openAPIV3Schema:
          type: object
          properties:
            httpProxy:
              type: string
            httpsProxy:
              type: string
            noProxy:
              type: array
              items:
                type: string
    - name: trust
      required: false
      schema:
        openAPIV3Schema:
          type: object
          properties:
            additionalTrustedCAs:
              type: array
              items:
                type: object
                properties:
                  name:
                    type: string
    - name: controlPlaneVolumes
      required: false
      schema:
        openAPIV3Schema:
          type: array
          items:
            type: object
            properties:
              storageClass:
                type: string
              mountPath:
                type: string
              name:
                type: string
              capacity:
                type: object
                properties:
                  storage:
                    type: string                   
    - name: nodePoolVolumes
      required: false
      schema:
        openAPIV3Schema:
          type: array
          items:
            type: object
            properties:
              storageClass:
                type: string
              mountPath:
                type: string
              name:
                type: string
              capacity:
                type: object
                properties:
                  storage:
                    type: string

用於自訂叢集的 ClusterClass 變數

可以使用變數根據 tanzukubernetescluster ClusterClass 來自訂叢集。使用名稱-值對定義變數。語法必須符合 openAPIV3Schema 的要求。

使用 v1beta1 API 佈建叢集需要兩個變數:
  • 虛擬機器類別
  • 儲存區類別
還可以使用其他變數來自訂叢集,例如:
  • Proxy
  • TLS 憑證
  • SSH 金鑰

下列區段列出了預設 tanzukubernetescluster ClusterClass 可用的所有變數。

clusterEncryptionConfigYaml

使用 clusterEncryptionConfigYaml 變數設定叢集加密。

clusterEncryptionConfigYaml
為提供加密組態詳細資料的 YAML 檔案的字串。
可以使用 kube-apiserver 加密組態套件設定對 etcd 資料庫中資料的加密。請參閱 Kubernetes 說明文件中的 〈加密靜態密碼資料〉
...
    variables:
    #clusterEncryptionConfigYaml specifies the base64 encoded 
    #EncryptionConfiguration YAML
    #the YAML contains a base64 encryption configuration for the cluster identity
    #the key is generated randomly
    - name: clusterEncryptionConfigYaml
      value: string which is name of the EncryptionConfiguration YAML 

controlPlaneCertificateRotation

使用 controlPlaneCertificateRotation 變數設定系統,在控制平面節點的 TLS 憑證到期之前觸發憑證推出,從而輪替這些憑證。如果已設定,則控制平面憑證輪替可用於所有新的和現有的控制平面節點。
controlPlaneCertificateRotation
布林值,用於啟用該功能以及到期前輪替憑證的天數 (最小值為到期前 7 天)。如需詳細資訊,請參閱 使用 Kubeadm Control Plane 提供者自動輪替憑證
...
    variables:
    - name: controlPlaneCertificateRotation.activate
      value: true (default is false which means not enabled)
    - name: controlPlaneCertificateRotation.daysBefore
      value: EXPIRY-DAYS 

controlPlaneVolumes

使用 controlPlaneVolumes 變數為控制平面節點設定持續性磁碟區。
controlPlaneVolumes
可選物件陣列,其中每個物件都包含 namestorageClassmountPath (均為字串),以及可選的 capacity 物件 (包含 storage 字串)。
...
    variables:
      #controlPlaneVolumes is an optional set of PVCs to create and
      #attach to each node
      - name: controlPlaneVolumes
        value: |
          #name of the PVC to be used as the suffix (node.name)
          - name: NAME
            #mountPath is the directory where the volume device is mounted
            #takes the form /dir/path
            mountPath: /dir/path
            #storageClass is the storage class to use for the PVC
            storageClass: tkg2-storage-profile
            #capacity is the PVC storage capacity
            capacity:
              #storage sets the capacity for the disk volume
              #if not specified defaults to storageClass capacity
              storage: 4Gi           

defaultRegistrySecret

使用 defaultRegistrySecret 變數為叢集設定預設容器登錄。

defaultRegistrySecret
包含預設容器登錄的公開金鑰、憑證名稱和命名空間的物件。
如果在 主管 上啟用 Harbor 登錄,則 defaultRegistrySecret 變數會指定叢集信任的登錄服務憑證。憑證密碼標記有 managed-by: vmware-vRegistry。建立叢集時,系統會將 defaultRegistry 憑證插入 defaultRegistrySecret 變數中。建立叢集後,您可以透過手動更新此變數來管理憑證輪替或任何更新。
...
    variables:
    - name: defaultRegistrySecret
      value:
        #data holds the base64 encoded data.ca\.crt content
        #data.ca\.crt is already encoded, so raw cert data is encoded twice
        data: LS0tLS1CRUdJTiBDRVJU...S0tRU5EIENFUlRJRklDQVRFL
        #name specifies the name of the registry cert secret 
        name: harbor-ca-key-pair
        #namespace specifies the ns of the registry cert secret
        namespace: svc-harbor-domain-c9

defaultStorageClass

使用 defaultStorageClass 變數為叢集設定預設儲存區類別。

defaultStorageClass
可識別要用作預設儲存區類別的儲存區類別的字串,通常 Helm 圖和 Tanzu 套件等應用程式需要它。
...
    variables:
    - name: defaultStorageClass
      value: tkg2-storage-profile

extensionCert

使用 extensionCert 變數設定 TLS 憑證。

extensionCert
包含具有 namekey 字串的 contentSecret 物件的物件。 contentSecret 會參考為 TLS 憑證建立的 Kubernetes 密碼物件。
...
    variables:
    #extensionCert specifies the cert and key for Extensions Controller
    #self-signed issuer and certificates must be created in advance
    - name: extensionCert
      value: 
        contentSecret:
          #name specifies the name of secret
          name: string
          #key specifies the content of tls\.crt in the secret's data map
          key: string

nodePoolLabels

使用 nodePoolLabels 變數為 Worker 節點設定標籤。

nodePoolLabels
一或多個物件組成的陣列,每個物件均包含索引鍵/值 (均為字串) 配對。
透過標籤,您可以根據需求組織系統物件,以便進行查詢和報告。如需使用率詳細資料,請參閱 Kubernetes 標籤說明文件

nodePoolTaints

使用 nodePoolTaints 變數將污點套用至 Worker 節點。

nodePoolTaints
物件陣列,其中每個物件都包含適用於 worker 節點的 污點
每個污點物件都包含 key (字串)、 value (字串) 和 effect (字串)。系統會在建立或更新時填入 timeAdded 欄位。

nodePoolVolumes

使用 nodePoolVolumes 變數為叢集節點指定持續性磁碟區。

nodePoolVolumes
可選物件陣列,其中每個物件都包含 namestorageClassmountPath (均為字串),以及可選的 capacity 物件 (包含 storage 字串)。
...
    variables:
      #nodePoolVolumes is an optional set of PVCs to create and
      #attach to each node; use for high-churn components like containerd
      - name: nodePoolVolumes
        value: |
          #name of the PVC to be used as the suffix (node.name)
          - name: etcd
            #mountPath is the directory where the volume device is mounted
            #takes the form /dir/path
            mountPath: /var/lib/containerd
            #storageClass is the storage class to use for the PVC
            storageClass: tkg2-storage-profile
            #capacity is the PVC storage capacity
            capacity:
              #storage sets the capacity for the disk volume
              #if not specified defaults to storageClass capacity
              storage: 4Gi           

ntp

使用 ntp 變數為叢集設定 NTP 伺服器。

ntp
為 NTP 伺服器的 FQDN 或 IP 位址的字串。
NTP 變數可指定 NTP 伺服器的網域名稱,如下列範例所示。NTP 伺服器會在建立叢集時插入叢集變數中。建立叢集後,您可以透過手動更新此叢集變數來管理伺服器名稱輪替或任何更新。
...
    variables:
    - name: ntp
      value: time1.vmware.com

proxy

使用 proxy 變數為叢集設定 Proxy 伺服器。

proxy
具有參考 Proxy 伺服器以進行輸出叢集連線的參數的物件。
必要的 proxy 參數包括 httpProxyhttpsProxynoProxy。如果要在「叢集」定義中包含 proxy 變數,則所有這三個欄位都為必填。
httpProxyhttpsProxy 欄位會採用參考 Proxy 伺服器的 URI 的字串值,該 Proxy 伺服器被設定為管理 TKG 叢集的輸出 HTTP 和 HTTPS 連線。您可以使用 HTTP 連線到 Proxy 伺服器。不支援 HTTPS 連線。
noProxy 欄位是字串陣列。從 主管 工作負載網路取得 noProxy 值。必須在 noProxy 欄位中包含命名空間網路、入口子網路和出口子網路。
無需在 noProxy 欄位中包括「服務」子網路。TKG 叢集不與此子網路互動。
無需在 noProxy 欄位中包括 clusterNetwork.services.cidrBlocksclusterNetwork.pods.cidrBlocks。系統不會自動代理這些端點。
無需在 noProxy 欄位中包括 localhost 和 127.0.0.1。系統不會自動代理這些端點。
...
    variables:
    #proxy specifies a proxy server to be used for the cluster
    #if omitted no proxy is configured
    - name: proxy
      value:
        #httpProxy is the proxy URI for HTTP connections
        #to endpoints outside the cluster
        httpProxy: http://<user>:<pwd>@<ip>:<port>
        #httpsProxy is the proxy URL for HTTPS connections 
        #to endpoints outside the cluster
        httpsProxy: http://<user>:<pwd>@<ip>:<port>
        #noProxy is the list of destination domain names, domains, 
        #IP addresses, and other network CIDRs to exclude from proxying
        #must include Supervisor Pod, Egress, Ingress CIDRs
        noProxy: [array of strings, comma-separated]

storageClass

使用 storageClass 變數為叢集設定儲存區類別。

storageClass
為 vSphere 儲存區設定檔的名稱的字串,此設定檔已被指派給佈建了 TKG 叢集的 vSphere 命名空間
...
    variables:
    - name: storageClass
      value: tkg2-storage-profile 
使用以下命令列出可用的儲存區類別:
kubectl describe namespace VSPHERE-NAMESPACE-NAME
或者,如果您具有 vSphere 管理員權限:
kubectl describe storageclasses

storageClasses

使用 storageClasses 變數為叢集設定儲存區類別陣列。

storageClasses
一或多個字串組成的陣列,每個字串均是已被指派給佈建了 TKG 叢集的 vSphere 命名空間 的 vSphere 儲存區設定檔的名稱。
...
    variables:
    - name: storageClasses
      value: [tkg2-storage-profile, tkg2-storage-profile-latebinding] 
使用以下命令列出可用的儲存區類別:
kubectl describe namespace VSPHERE-NAMESPACE-NAME
或者,如果您具有 vSphere 管理員權限:
kubectl describe storageclasses

TKR_DATA

使用 TKR_DATA 變數指定 TKR 資訊。

TKR_DATA
用於指定 TKR 版本和其他詳細資料的物件。
version 是由叢集節點使用、採用 TKR NAME 格式的字串。
只有不具有 legacy-tkr 標籤的 TKR 才與 vSphere 9 主管上的 TKG 相容。請參閱 將 Tanzu Kubernetes 版本與主管上的 TKG 叢集搭配使用
預設作業系統為 PhotonOS。使用註解指定 Ubuntu TKR

trust

使用 trust 變數為叢集指定一或多個受信任的 CA 憑證。

trust
用於向叢集新增 TLS 憑證 (其他 CA 或終端憑證) 的物件。
此值為字串陣列 additionalTrustedCA。每個字串都是 Kubernetes 密碼的名稱,該密碼會保留倸用 PEM 格式且為 base64 編碼字串的其他受信任憑證的內容。
若要設定 trust 變數,請執行以下作業:
  1. 使用以下內容建立 Kubernetes 密碼定義 YAML 檔案。
    apiVersion: v1
    data:
      additional-ca-1: TFMwdExTMUNSGlSzZ3Jaa...VVNVWkpRMEMwdExTMHRDZz09
    kind: Secret
    metadata:
      name: cluster01-user-trusted-ca-secret
      namespace: tkg-cluster-ns
    type: Opaque
    密碼資料對應的內容是憑證的使用者定義名稱 ( additional-ca-1)),其值為雙重 base64 編碼憑證。
    備註: 需要雙重 base64 編碼。如果資料對應值的內容沒有使用雙重 base6 編碼,則無法處理產生的 PEM 檔案。

    將此密碼命名為 CLUSTER-NAME-user-trusted-ca-secret,其中 CLUSTER-NAME 是叢集的名稱。必須在叢集所在的同一 vSphere 命名空間 中建立此密碼。

  2. 使用 kubectl -f apply additional-ca-1.yaml 建立 Kubernetes 密碼。
  3. 驗證密碼建立。
    kubeclt get secret -n tkg2-cluster-ns cluster01-user-trusted-ca-secret
    NAME                                             TYPE     DATA   AGE
    cluster01-user-trusted-ca-secret                   Opaque   12     2d22h
    
  4. trust 變數包含在叢集規格中,用於參考密碼的資料對應的 name 值 (在此範例中為 additional-ca-1)。
    spec:
      clusterNetwork:
        pods:
          cidrBlocks:
          - 193.0.0.0/16
        serviceDomain: cluster.local
        services:
          cidrBlocks:
          - 198.201.0.0/16
      topology:
        class: tanzukubernetescluster
        controlPlane:
          metadata: {}
          replicas: 3
        variables:
        - name: storageClass
          value: tkg-storage-profile
        - name: trust
          value:
            additionalTrustedCAs:
            - name: additional-ca-1

user

使用 user 變數指定叢集使用者認證。

user
包含 passwordSecret 物件的物件,此 passwordSecret 物件具有名稱和金鑰字串以及 sshAuthorizedKey 字串。可以使用此變數將使用者的 SSH 金鑰新增到叢集節點以進行遠端 SSH 存取。
「使用者」變數可指定 SSH 登入認證,包括密碼和授權金鑰。依預設,使用者名稱為 vmware-system-user。密碼需要進行雜湊處理,並儲存在佈建了此叢集的同一命名空間的密碼中。 passwordSecret 物件可參考此密碼。例如,在 Linux 上,您可以使用 mkpasswd --method=SHA-512 --rounds=4096 產生安全雜湊。如需詳細資料,請參閱 〈包含使用者和群組〉
...
    variables:
    #user specifies an authorized user and credentials
    - name: user
      value:
        #passwordSecret is an object that contains a Kubernetes secret and key
        passwordSecret:
          #name specifies the secret name
          name: string
          #key specifies the key value pair in the secret's data map
          key: string
        sshAuthorizedKey: string that is the base64-encoded public key

vmClass

使用 vmClass 變數為叢集節點設定虛擬機器類別。

vmClass
對應到虛擬機器類別的名稱的必要字串,該虛擬機器類別已繫結到佈建了 TKG 叢集的 vSphere 命名空間
vmClass 是 VirtualMachineClass 的名稱,說明了要用於叢集節點的虛擬硬體設定。VirtualMachineClass 會控制節點可用的 CPU 和記憶體,以及關於這些資源的要求和限制。請參閱 對主管上的 TKG 叢集使用虛擬機器類別
只能使用已繫結到正在佈建 TKG 叢集的 vSphere 命名空間 的虛擬機器類別。使用命令 kubectl get virtualmachineclassbinding 列出繫結的類別。
可以在不同的範圍中定義 vmClass 變數,以便對控制平面節點和節點集區 worker 節點使用不同的虛擬機器類別。
例如,此處的內嵌 vmClass 變數 overrides 是此特定 machineDeployment 拓撲的主要 vmClass 變數。
...
    workers:
      machineDeployments:
      - class: tkg-worker
        name: compute
        replicas: 3
        variables:
          overrides:
          - name: vmClass
            value: guaranteed-large