クラスタ 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「tanzukubernerescluster」

デフォルトの 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 を使用してクラスタをプロビジョニングするには、2 つの変数が必要です。
  • 仮想マシン クラス
  • ストレージ クラス
クラスタをカスタマイズするために、次のような変数がさらに使用可能です。
  • プロキシ
  • TLS 証明書
  • SSH キー

以下セクションに、デフォルトの tanzukubernetescluster ClusterClass で使用できるすべての変数を示します。

clusterEncryptionConfigYaml

clusterEncryptionConfigYaml 変数は、クラスタの暗号化を構成する場合に使用します。

clusterEncryptionConfigYaml
暗号化構成の詳細を提供する YAML ファイルである文字列。
Kube-apiserver 暗号化構成パッケージを使用して、etcd データベースでデータの暗号化を構成できます。Kubernetes のドキュメントの Encrypting Secret Data at Restを参照してください。
...
    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 日以上前)。詳細については、「 Automatically rotating certificates using Kubeadm Control Plane provider」を参照してください。
...
    variables:
    - name: controlPlaneCertificateRotation.activate
      value: true (default is false which means not enabled)
    - name: controlPlaneCertificateRotation.daysBefore
      value: EXPIRY-DAYS 

controlPlaneVolumes

controlPlaneVolumes 変数は、制御プレーン ノードのパーシステント ボリュームを構成する場合に使用します。
controlPlaneVolumes
オブジェクトのオプションの配列。それぞれに namestorageClass、および mountPath が含まれ、それぞれが文字列であり、およびオプションの storage 文字列が含まれる capacity オブジェクトです。
...
    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
name 文字列と key 文字列を含む 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 変数は、ワーカー ノードのラベルを構成する場合に使用します。

nodePoolLabels
1 つ以上のオブジェクトの配列。各オブジェクトにはキーと値のペア(両方とも文字列)が含まれています。
ラベルを使用すると、クエリやレポートを実行しやすくするために、要件に応じてシステム オブジェクトを管理できます。使用方法の詳細については、Kubernetes ラベルのドキュメントを参照してください。

nodePoolTaints

nodePoolTaints 変数は、テイントをワーカー ノードに適用する場合に使用します。

nodePoolTaints
オブジェクトの配列。各オブジェクトには、ワーカーノードに適用される テイントが含まれています。
各テイント オブジェクトには、 key(文字列)、 value(文字列)、および effect(文字列)が含まれます。作成または更新時に、 timeAdded フィールドにポピュレートされます。

nodePoolVolumes

nodePoolVolumes 変数は、クラスタ ノードのパーシステント ボリュームを指定する場合に使用します。

nodePoolVolumes
オブジェクトのオプションの配列。それぞれに namestorageClass、および mountPath が含まれ、それぞれが文字列であり、オプションの storage 文字列が含まれる capacity オブジェクトです。
...
    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 パラメータは httpProxyhttpsProxy、および noProxy です。クラスタ定義に proxy 変数を含める場合、3 つのフィールドはすべて必須です。
httpProxy フィールドと httpsProxy フィールドでは、TKG クラスタからの送信 HTTP および HTTPS 接続を管理するように構成されているプロキシ サーバの URI を参照する文字列値が使用されます。HTTP を使用してプロキシ サーバに接続できます。HTTPS 接続はサポートされていません。
noProxy フィールドは文字列の配列です。 noProxy 値を スーパーバイザー ワークロード ネットワークから取得します。名前空間ネットワーク、Ingress、および Egress サブネットを noProxy フィールドに含める必要があります。
noProxy フィールドにサービス サブネットを含める必要はありません。TKG クラスタは、このサブネットと連携しません。
noProxy フィールドに clusterNetwork.services.cidrBlocks および clusterNetwork.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
TKG クラスタがプロビジョニングされている vSphere 名前空間 に割り当てられている vSphere ストレージ プロファイルの名前である文字列。
...
    variables:
    - name: storageClass
      value: tkg2-storage-profile 
次のコマンドを使用して、使用可能なストレージ クラスを一覧表示します。
kubectl describe namespace VSPHERE-NAMESPACE-NAME
または、vSphere 管理者権限がある場合は、次の手順を実行します。
kubectl describe storageclasses

storageClasses

storageClasses 変数は、クラスタのストレージ クラスの配列を構成する場合に使用します。

storageClasses
1 つ以上の文字列の配列。各文字列は、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 と互換性があります。 スーパーバイザー上の TKG クラスタでの Tanzu Kubernetes リリースの使用を参照してください。
デフォルトのオペレーティング システムは PhotonOS です。注釈を使用して、 Ubuntu TKRを指定します。

trust

trust 変数は、クラスタの信頼できる CA 証明書を 1 つ以上指定する場合に使用します。

trust
クラスタに TLS 証明書(追加の CA またはエンド証明書のいずれか)を追加するためのオブジェクト。
値は、文字列の配列である additionalTrustedCAs です。各文字列は、PEM 形式の base64 エンコード文字列による、追加の信頼されている証明書の内容を保持する Kubernetes シークレットの名前です。
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
    シークレットのデータ マップの内容は、値が base64 二重エンコード証明書である証明書のユーザー定義名 ( additional-ca-1) です。
    注: 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. シークレットのデータ マップの name 値を参照するクラスタ仕様に trust 変数を含めます。この例では、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
名前文字列とキー文字列、および sshAuthorizedKey 文字列を持つ、passwordSecret オブジェクトを含むオブジェクト。この変数を使用して、ユーザーの SSH キーをリモート SSH アクセス用のクラスタ ノードに追加できます。
ユーザー変数は、パスワードと認証済みキーを含む SSH ログイン認証情報を指定します。デフォルトのユーザー名は vmware-system-user です。パスワードはハッシュされ、クラスタがプロビジョニングされているのと同じ名前空間のシークレットに格納される必要があります。 passwordSecret オブジェクトはこのシークレットを参照します。たとえば、Linux では、 mkpasswd --method=SHA-512 --rounds=4096 を使用して安全なハッシュを生成できます。詳細については、 Including users and groupsを参照してください。
...
    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 変数を定義できます。
たとえば、ここではインラインの vmClass 変数は、この特定の machineDeployment トポロジに対するプライマリの vmClass 変数を overrides(オーバーライド)します。
...
    workers:
      machineDeployments:
      - class: tkg-worker
        name: compute
        replicas: 3
        variables:
          overrides:
          - name: vmClass
            value: guaranteed-large