カスタム ClusterClass に基づいて TKG クラスタをプロビジョニングするには、次の手順を参照してください。これらの手順は、vSphere 8 U1 環境に固有であることに注意してください。

前提条件

カスタム ClusterClass に基づいて TKG クラスタをプロビジョニングする手順は、vSphere 8 U1 リリース以降で使用できます。vSphere 8 U2 を使用している場合は、「v1beta1 の例:カスタム ClusterClass に基づくクラスタ(vSphere 8 U2 以降のワークフロー)」を参照してください。

次の前提条件を満たす必要があります。
  • vSphere 8 U1 環境
  • ワークロード管理が有効
  • スーパーバイザー 構成済み
  • vSphere 向け Kubernetes CLI Tools がインストールされている Ubuntu クライアント
注目: カスタム ClusterClass は、アップストリーム クラスタ API の ドキュメントに基づく Kubernetes の試験的な機能です。カスタム ClusterClass で使用可能なカスタマイズの範囲により、VMwareは可能なすべてのカスタマイズをテストまたは検証できません。ユーザーは、カスタム ClusterClass クラスタのテスト、検証、およびトラブルシューティングを行う必要があります。カスタム ClusterClass クラスタに関するサポート チケットを発行できますが、VMwareサポートはベスト エフォートベースにのみ制限され、カスタム ClusterClass クラスタに対して発行されたすべての問題の解決を保証することはできません。本番環境にカスタム ClusterClass クラスタを展開する前に、これらのリスクを認識しておく必要があります。

パート 1:カスタム ClusterClass の作成

最初のパートでは、 tanzukubernetescluster という名前のデフォルトの ClusterClass のクローンを作成することで、カスタム ClusterClass を作成します。
  1. custom-ns という名前の vSphere 名前空間 を作成します。
  2. スーパーバイザー にログインします。
  3. custom-ns という名前の vSphere 名前空間 にコンテキストを切り替えます。
  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 名前空間 に適用されている StoragePolicy
    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. values.yaml ファイルを base64 エンコードでハッシュ化して、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-ns という名前の vSphere 名前空間 のポッド セキュリティを構成します。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 ユーザーのロールバインドを スーパーバイザー から TKG クラスタに同期する必要があります。

このプロセスでは、既存のロールバインド リストを スーパーバイザー からエクスポートし、「編集」ロールを持つロールバインドを収集し、 sync-cluster-edit-rolebinding.yaml ファイルを作成してから、KUBECONFIG を使用して TKG クラスタに適用する必要があります。
  1. スーパーバイザー から既存のロールバインドを収集します。
    kubectl get rolebinding -n custom-ns  -o yaml
  2. ロールバインド オブジェクトの返されたリストから、「編集」と等しい roleRef.name を持つオブジェクトを特定します。
    例:
    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] 以外のロールバインドを追加します。例:
    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 構成を適用して、ロールバインドを同期します。
    KUBECONFIG=ccc-cluster-kubeconfig kubectl apply -f sync-cluster-edit-rolebinding.yaml