请参阅以下说明,以基于自定义 ClusterClass 置备 TKG 集群。请注意,这些说明特定于 vSphere 8 U2 及更高版本环境。

必备条件

在 vSphere 8 U2 版本中,更新了基于自定义 ClusterClass 置备 TKG 集群的过程。

请遵循以下必备条件。
  • vSphere 8 U2+ 环境
  • 已启用工作负载管理
  • 已配置主管
  • 安装了 适用于 vSphere 的 Kubernetes CLI 工具 的 Ubuntu 客户端
注意: 根据上游集群 API 文档,自定义 ClusterClass 是一种实验性 Kubernetes 功能。由于自定义 ClusterClass 可用的自定义范围,VMware无法测试或验证所有可能的自定义。客户负责测试、验证其自定义 ClusterClass 集群以及进行故障排除。客户可以提交有关其自定义 ClusterClass 集群的支持请求,VMware 技术支持团队会尽最大努力提供帮助,但无法保证解决针对自定义 ClusterClass 集群提出的每个问题。在生产环境中部署自定义 ClusterClass 集群之前,客户应了解这些风险。

高级别工作流

简要工作流如下所示。

只需使用以下工作流即可开始。
步骤 任务 说明
1 通过克隆默认 ClusterClass 创建自定义 ClusterClass。 1:创建自定义 ClusterClass
2 根据自定义 ClusterClass 置备新的 TKG 集群,并确认所有集群节点均正确启动。 2:基于自定义 ClusterClass 创建 TKG 集群
请参阅以下工作流,对自定义 ClusterClass 进行更改,并启动对自定义 ClusterClass 集群节点进行滚动更新。
注: 以下工作流中展示的操作只是可以对自定义 ClusterClass 执行的操作示例。您的用例可能会有所不同,但常规工作流应适用。
步骤 任务 说明
3 通过 SSH 登录到其中一个工作节点,以确认有要更新的软件包。 3:验证是否存在软件包更新
4 更新自定义 ClusterClass,在其中添加执行更新的新命令。 4:更新自定义 ClusterClass
5 确认更新已经运行的新节点部署。 5:验证集群节点的滚动更新

1:创建自定义 ClusterClass

第一部分涉及通过克隆名为 tanzukubernetescluster 的默认 ClusterClass 创建名为 ccccustomclusterclass 的缩写形式)的自定义 ClusterClass。
注: 自定义 ClusterClass 名称是用户定义的。如果使用其他名称,请相应地调整说明。
  1. 创建并配置一个名为 ccc-nsvSphere 命名空间

    配置权限、存储、内容库和虚拟机类。根据需要,请参阅文档

    注: vSphere 命名空间 名称是用户定义的。如果使用其他名称,请相应地调整说明。
  2. 登录到 主管
    kubectl vsphere login --server=IP-ADDRESS --vsphere-username [email protected]
  3. 将默认 ClusterClass 的输出写入名为 ccc.yaml 的文件。
    kubectl -n ccc-ns get clusterclass tanzukubernetescluster -o yaml > ccc.yaml
    或者,快捷方式版本:
    kubectl -n ccc-ns get cc tanzukubernetescluster -o yaml > ccc.yaml
  4. 打开 以编辑克隆的 ClusterClass 文件。
    vim ccc.yaml
  5. 编辑文件 ccc.yaml
    • 删除行 metadata.creationTimestamp
    • 删除行 metadata.generation
    • 删除行 metadata.resourceVersion
    • 删除行 metadata.uid
    • metadata.name 值从 tanzukubernetescluster 更改为 ccc
    • metadata.namespace 值保留不变:ccc-ns
    • 对于 run.tanzu.vmware.com/resolve-tkr: "",将 metadata.annotations 值保留不变。TKR 数据/解析需要此注释。
  6. 保存并验证更改。
    apiVersion: cluster.x-k8s.io/v1beta1
    kind: ClusterClass
    metadata:
      annotations:
        run.tanzu.vmware.com/resolve-tkr: ""
      name: ccc
      namespace: ccc-ns
    spec:
    ...
  7. 创建自定义 ClusterClass 对象。
    kubectl apply -f ccc.yaml -n ccc-ns
    预期结果:
    clusterclass.cluster.x-k8s.io/ccc created
  8. 列出自定义 ClusterClass。
    kubectl get cc -n ccc-ns
    预期结果:
    NAME                     AGE
    ccc                      3m14s
    tanzukubernetescluster   29m
    

2:基于自定义 ClusterClass 创建 TKG 集群

使用 集群 v1beta1 API 基于 ClusterClass 创建集群。
  1. 构建 ccc-cluster.yaml 清单以置备集群。
    #ccc-cluster.yaml
    apiVersion: cluster.x-k8s.io/v1beta1
    kind: Cluster
    metadata:
      name: ccc-cluster
    spec:
      clusterNetwork:
        pods:
          cidrBlocks:
          - 192.0.2.0/16
        services:
          cidrBlocks:
          - 198.51.100.0/12
        serviceDomain: cluster.local
      topology:
        class: ccc
        version: v1.26.5---vmware.2-fips.1-tkg.1
        controlPlane:
          replicas: 1
        workers:
          machineDeployments:
            - class: node-pool
              name: tkgs-node-pool-1
              replicas: 1
        variables:
        - name: vmClass
          value: guaranteed-small
        - name: storageClass
          value: tkg-storage-profile
    其中:
    • metadata.name 值是集群的名称:ccc-cluster
    • spec.topology.class 值是自定义 ClusterClass 的名称:ccc
    • spec.topology.version 值是 TKR 版本
    • spec.topology.variables.storageClass 值是持久存储类的名称
    注: 对于测试,控制平面和工作节点池使用 1 个副本足以满足要求。在生产环境中,控制平面使用 3 个副本,每个工作节点池至少使用 3 个副本。
  2. 基于自定义 ClusterClass 创建 TKG 集群。
    kubectl apply -f ccc-cluster.yaml -n ccc-ns
    预期结果:
    cluster.cluster.x-k8s.io/ccc-cluster created
  3. 验证集群置备。
    运行以下命令等待所有集群节点正确启动。
    kubectl -n ccc-ns get cc,clusters,vsphereclusters,kcp,machinedeployment,machineset,machine,vspheremachine,virtualmachineservice
    注: 在单独的会话中运行此命令会很有帮助,这样可以在步骤 5 中监控滚动更新进度。

3:验证是否存在软件包更新

通过 SSH 登录到其中一个工作节点,以确认有要更新的软件包。
注: 此步骤的目的只是确认有要更新的软件包,而不是实际进行更新。推出新的集群节点时,将由自定义 ClusterClass 更新这些软件包(此步骤后的步骤)。此步骤和后续步骤只是示例,用于说明可以对自定义 ClusterClass 执行的操作。
  1. 运行以下命令以获取 SSH 密钥。
    export CC=ccc-cluster && kubectl get secret -n ccc-ns ${CC}-ssh -o jsonpath={.data.ssh-privatekey} | base64 -d > ${CC}-ssh && chomd 4000 ${CC}-ssh
  2. 运行以下命令,获取工作节点虚拟机的 IP 地址。
    kubectl -n ccc-ns get vm -o wide
    注: 如果部署了多个工作节点,请选择一个。请勿使用控制平面节点。
  3. 运行以下命令,通过 SSH 登录到工作节点虚拟机。
    ssh -i ${CC}-ssh vmware-system-user@IP-ADDRESS-OF-WORKER-NODE
    例如:
    ssh -i ${CC}-ssh [email protected]
    注: 输入“yes”以继续连接。
    预期结果:通过 SSH 登录到主机后,您应该会看到以下消息。
    tdnf update info not availble yet!
  4. 运行以下命令并检查更新。
    sudo -i
    tdnf update
  5. 在提示符下,输入“N”表示否(不更新)。
    预期结果:
    Operation aborted
    注: 此处的目的只是检查是否存在更新,而不是启动更新。在下一部分中,将通过向自定义 ClusterClass 添加命令来启动更新。
  6. 键入“exit”以注销 SSH 会话,然后再次键入“exit”。

4:更新自定义 ClusterClass

更新自定义 ClusterClass,在其中添加执行 tdnf 更新的新命令。
  1. 打开名为 ccc 的自定义 ClusterClass 以进行编辑。
    kubectl edit cc ccc -n ccc-ns
  2. 向下滚动到包含 postKubeadmCommands 的以下部分。
      - definitions:
        - jsonPatches:
          - op: add
            path: /spec/template/spec/kubeadmConfigSpec/postKubeadmCommands
            valueFrom:
              template: |
                - touch /root/kubeadm-complete
                - vmware-rpctool 'info-set guestinfo.kubeadm.phase complete'
                - vmware-rpctool 'info-set guestinfo.kubeadm.error ---'
          selector:
            apiVersion: controlplane.cluster.x-k8s.io/v1beta1
            kind: KubeadmControlPlaneTemplate
            matchResources:
              controlPlane: true
        - jsonPatches:
          - op: add
            path: /spec/template/spec/postKubeadmCommands
            valueFrom:
              template: |
                - touch /root/kubeadm-complete
                - vmware-rpctool 'info-set guestinfo.kubeadm.phase complete'
                - vmware-rpctool 'info-set guestinfo.kubeadm.error ---'
          selector:
            apiVersion: bootstrap.cluster.x-k8s.io/v1beta1
            kind: KubeadmConfigTemplate
            matchResources:
              machineDeploymentClass:
                names:
                - node-pool
        name: controlPlanePostKubeadmCommandsSuccess
    
    将以下命令添加到两个 valueFrom.template 字段中。
    - tdnf update -y
    例如:
      - definitions:
        - jsonPatches:
          - op: add
            path: /spec/template/spec/kubeadmConfigSpec/postKubeadmCommands
            valueFrom:
              template: |
                - touch /root/kubeadm-complete
                - vmware-rpctool 'info-set guestinfo.kubeadm.phase complete'
                - vmware-rpctool 'info-set guestinfo.kubeadm.error ---'
                - tdnf update -y
          selector:
            apiVersion: controlplane.cluster.x-k8s.io/v1beta1
            kind: KubeadmControlPlaneTemplate
            matchResources:
              controlPlane: true
        - jsonPatches:
          - op: add
            path: /spec/template/spec/postKubeadmCommands
            valueFrom:
              template: |
                - touch /root/kubeadm-complete
                - vmware-rpctool 'info-set guestinfo.kubeadm.phase complete'
                - vmware-rpctool 'info-set guestinfo.kubeadm.error ---'
                - tdnf update -y
          selector:
            apiVersion: bootstrap.cluster.x-k8s.io/v1beta1
            kind: KubeadmConfigTemplate
            matchResources:
              machineDeploymentClass:
                names:
                - node-pool
        name: controlPlanePostKubeadmCommandsSuccess
    
  3. 保存对自定义 ClusterClass 所做的更改并关闭编辑器。
    wq
    预期结果:
    clusterclass.cluster.x-k8s/ccc edited

5:验证集群节点的滚动更新

更新自定义 ClusterClass 会触发对基于该 ClusterClass 置备的集群的集群节点执行滚动更新。应用了上述命令后,会出现新节点。
  1. 运行以下命令,验证集群置备。
    等待所有集群节点正确启动。
    kubectl -n ccc-ns get cc,clusters,vsphereclusters,kcp,machinedeployment,machineset,machine,vspheremachine,virtualmachineservice
  2. 您应该会看到部署了具有新 UUID 的新节点。
  3. 运行以下命令,通过 SSH 登录到工作节点虚拟机。
    ssh -i ${CC}-ssh vmware-system-user@IP-ADDRESS-OF-WORKER-NODE
    预期结果:通过 SSH 登录到主机后,您应该会看到以下消息。
    tdnf update info not availble yet!
  4. 运行下列命令。
    sudo -i
    tdnf update

    预期结果:应看到需要更新的软件包较少。

  5. 在提示符下,输入“N”表示否(不更新)。
    预期结果:
    Operation aborted
  6. 运行以下命令以确认 tdnf 已运行。
    cat /var/log/cloud-init-output.log | grep -i tdnf
  7. 键入“exit”以注销 SSH 会话,然后再次键入“exit”。

维护自定义 ClusterClass

TKG 服务 升级到新版本后,必须确保使用对新 TKG 服务 版本附带的默认 ClusterClass 所做的更改更新从先前 TKG 服务 版本的默认 ClusterClass 派生的自定义 ClusterClass。

使用以下工作流使自定义 ClusterClass 与系统提供的 ClusterClass 保持同步。请注意,这些说明假定您已按照本文所述创建了初始自定义 ClusterClass。
  1. 升级 TKG 服务 版本。

    例如,从 TKG 服务 v3.0 升级到 v3.1。

    请参见安装和升级 TKG 服务

  2. 按照此处的说明创建新的自定义 ClusterClass。

    通过在新自定义 ClusterClass 的名称后面附加 TKG 服务 版本(例如,ccc-3.1)来手动对其进行版本控制。

  3. 将先前自定义 ClusterClass 中的自定义修补程序和变量添加到新的自定义 ClusterClass。

    为此,请添加 cat ccc.yaml,并将自定义修补程序和变量从其复制到 ccc-3.1.yaml

  4. 应用新的自定义 ClusterClass 并等待协调成功。
  5. 通过编辑 Cluster 对象中的 spec.topology.class 字段,使用以前的自定义 ClusterClass 将 TKG 集群更新为新的自定义 ClusterClass。

非受管 ClusterClass

对于 vSphere 8 U2+,有一个注释,如果您不希望 TKG 控制器管理自定义 ClusterClass,则可以将该注释添加到自定义 ClusterClass。请注意,如果添加此注释,您将负责手动创建所有底层 Kubernetes 对象,例如证书、密钥等。有关执行此操作的指导,请参阅 vSphere 8 U1 自定义 ClusterClass 文档

注释如下所示:
注释键
run.tanzu.vmware.com/unmanaged-clusterclass " "
下例介绍了如何将注释添加到名为 ccc 的自定义 ClusterClass:
apiVersion: cluster.x-k8s.io/v1beta1
kind: ClusterClass
metadata:
  annotations:
    run.tanzu.vmware.com/resolve-tkr: ""
    run.tanzu.vmware.com/unmanaged-clusterclass: ""
  name: ccc
  namespace: ccc-ns
spec:
...