请参阅以下说明,以基于自定义 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

    如有必要,可以使用 less 查看自定义 ClusterClass。

    kubectl get clusterclass custom-cc -o json | less
    注: 发出命令“q”可以退出 less。

第 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. 使用 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 部分:配置 Pod 安全

如果使用的是 TKR 版本 1.25 及更高版本,请为名为 custom-nsvSphere 命名空间 配置 Pod 安全。请参见为 TKR 1.25 及更高版本配置 PSA

如果使用的是 TKR 版本 1.24 及更低版本,则集群中的 Pod 需要绑定到 Pod 安全策略。要在集群级别应用所需的资源对象,请使用以下过程。
  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. 应用 Pod 安全策略。
    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