创建 ClusterClass

本主题介绍了如何创建您自己的自定义 ClusterClass 资源定义,您可以将其用作创建基于类的工作负载集群(具有 Tanzu Kubernetes Grid (TKG) 独立管理集群)的基础。要使集群基于 ClusterClass,请将其 spec.topology.class 设置为 ClusterClass 名称。

此过程不适用于具有 vSphere with Tanzu 主管的 TKG。

重要

创建自定义 ClusterClass 资源定义适用于高级用户。VMware 不保证基于任意 ClusterClass 对象的工作负载集群的功能。要使用默认 ClusterClass 资源创建工作负载集群,请按照集群部署步骤中的过程操作。

要求

要创建 ClusterClass 定义,需要在本地安装以下工具:

工具 版本
clusterctl v1.2.0
ytt 0.42.0
jq 1.5-1
yq v4.30.5

选项: 覆盖网络与新对象规范

要创建新的 ClusterClass,VMware 建议从 ClusterClass 对象源下链接的现有默认 ClusterClass 对象开始,然后使用 ytt 覆盖对其进行修改。发布新版本的默认 ClusterClass 对象时,可以将覆盖应用于该新版本,以便实现相同的自定义。以下过程介绍了这种创建自定义 ClusterClass 对象的方法。

要从无对象写入新的 ClusterClass 对象,请按照集群 API 文档中的写入 ClusterClass 进行操作。

创建自定义 ClusterClass 对象

要根据 Tanzu Framework 存储库中定义的现有 ClusterClass 创建自定义 ClusterClass 对象定义,请执行以下操作:

检索 ClusterClass 对象源

  1. 从 Github 上的 Tanzu Framework 代码存储库中,下载并解压缩 v0.29.0 zip 包。

  2. 根据您的目标基础架构,将 cd 克隆到存储库的 package 子目录:

    • AWSpackages/tkg-clusterclass-aws
    • Azurepackages/tkg-clusterclass-azure
    • vSpherepackages/tkg-clusterclass-vsphere
  3. bundle 文件夹复制到工作区。它具有以下结构:

    $ tree bundle
    bundle
    |-- config
       |-- upstream
       │   |-- base.yaml
       │   |-- overlay-kube-apiserver-admission.yaml
       │   |-- overlay.yaml
       |-- values.yaml
    

生成基本 ClusterClass 清单

  1. 根据是否已部署独立管理集群,在值文件中捕获基础架构设置,如下所示:

    • 已部署管理集群运行以下命令以生成 default-values.yaml

      cat <<EOF > default_values.yaml
      #@data/values
      
      #@overlay/match-child-defaults missing_ok=True
      ---
      EOF
      kubectl get secret tkg-clusterclass-infra-values -o jsonpath='{.data.values\.yaml}' -n tkg-system | base64 -d >> default_values.yaml
      
    • 无独立管理集群

      1. bundle 目录中,将 values.yaml 复制到新文件 default_values.yaml
      cp bundle/config/values.yaml default_values.yaml
      
      1. 编辑 default_values.yaml,然后根据您的基础架构填写变量设置,例如:
      VSPHERE_DATACENTER: /dc0
      VSPHERE_DATASTORE: /dc0/datastore/sharedVmfs-0
      VSPHERE_FOLDER: /dc0/vm
      

      有关基础架构特定的变量,请参见 配置文件变量参考

  2. 通过值文件生成基本 ClusterClass 清单:

    ytt -f bundle -f default_values.yaml > default_cc.yaml
    

自定义 ClusterClass 清单

要自定义 ClusterClass 清单,请创建该清单旁边的 ytt 覆盖文件。以下示例显示了如何在 ClusterClass 定义中修改 Linux 内核参数。

  1. 创建 custom 文件夹,结构如下所示:

    $ tree custom
     custom
     |-- overlays
     |   -- kernels.yaml
     -- values.yaml
    
  2. 例如,编辑 custom/overlays/kernels.yaml 以将 nfConntrackMax 添加为变量,然后为其定义一个修补程序,该修补程序将添加控制平面节点的内核参数 net.netfilter.nf_conntrack_max 值。

    此覆盖网络在 preKubeadmCommands 字段附加一个命令,以将配置写入到 sysctl.conf。要使设置生效,可以附加命令 sysctl -p 以应用此更改。

    #@ load("@ytt:overlay", "overlay")
    #@ load("@ytt:data", "data")
    
    #@overlay/match by=overlay.subset({"kind":"ClusterClass"})
    ---
    apiVersion: cluster.x-k8s.io/v1beta1
    kind: ClusterClass
    spec:
     variables:
     - name: nfConntrackMax
       required: false
       schema:
         openAPIV3Schema:
           type: string
     patches:
     - name: nfConntrackMax
       enabledIf: '{{ not (empty .nfConntrackMax) }}'
       definitions:
         - selector:
             apiVersion: controlplane.cluster.x-k8s.io/v1beta1
             kind: KubeadmControlPlaneTemplate
             matchResources:
               controlPlane: true
           jsonPatches:
             - op: add
               path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/-
               valueFrom:
                 template: echo "net.netfilter.nf_conntrack_max={{ .nfConntrackMax }}" >> /etc/sysctl.conf
    
  3. 默认 ClusterClass 定义不可改变,因此创建或编辑 custom/values.yaml 覆盖网络,通过添加 -extended 和版本更改自定义 ClusterClass 的名称及其所有模板(例如:

    #@data/values
    
    #@overlay/match-child-defaults missing_ok=True
    ---
    #! Change the suffix so we know from which default ClusterClass it is extended
    CC-VERSION: extended-v1.0.0
    
    #! Add other variables below if necessary
    

    其中,CC-VERSION 是集群类版本的名称,例如 VSPHERE_CLUSTER_CLASS_VERSION

  4. 生成自定义 ClusterClass:

    ytt -f bundle -f default_values.yaml -f custom > custom_cc.yaml
    
  5. (可选)检查默认 ClusterClass 与自定义名称之间的差异,以确认所有名称都具有后缀 -extended 并添加了新的变量和 JSON 修补程序,例如:

    $ diff default_cc.yaml custom_cc.yaml
    4c4
    <   name: tkg-vsphere-default-v1.0.0-cluster
    ---
    >   name: tkg-vsphere-default-extended-v1.0.0-cluster
    15c15
    <   name: tkg-vsphere-default-v1.0.0-control-plane
    ---
    >   name: tkg-vsphere-default-extended-v1.0.0-control-plane
    39c39
    <   name: tkg-vsphere-default-v1.0.0-worker
    ---
    >   name: tkg-vsphere-default-extended-v1.0.0-worker
    63c63
    <   name: tkg-vsphere-default-v1.0.0-kcp
    ---
    >   name: tkg-vsphere-default-extended-v1.0.0-kcp
    129c129
    <   name: tkg-vsphere-default-v1.0.0-md-config
    ---
    >   name: tkg-vsphere-default-extended-v1.0.0-md-config
    165c165
    <   name: tkg-vsphere-default-v1.0.0
    ---
    >   name: tkg-vsphere-default-extended-v1.0.0
    174c174
    <       name: tkg-vsphere-default-v1.0.0-kcp
    ---
    >       name: tkg-vsphere-default-extended-v1.0.0-kcp
    180c180
    <         name: tkg-vsphere-default-v1.0.0-control-plane
    ---
    >         name: tkg-vsphere-default-extended-v1.0.0-control-plane
    195c195
    <       name: tkg-vsphere-default-v1.0.0-cluster
    ---
    >       name: tkg-vsphere-default-extended-v1.0.0-cluster
    205c205
    <             name: tkg-vsphere-default-v1.0.0-md-config
    ---
    >             name: tkg-vsphere-default-extended-v1.0.0-md-config
    211c211
    <             name: tkg-vsphere-default-v1.0.0-worker
    ---
    >             name: tkg-vsphere-default-extended-v1.0.0-worker
    228c228
    <             name: tkg-vsphere-default-v1.0.0-md-config
    ---
    >             name: tkg-vsphere-default-extended-v1.0.0-md-config
    234c234
    <             name: tkg-vsphere-default-v1.0.0-worker
    ---
    >             name: tkg-vsphere-default-extended-v1.0.0-worker
    537a538,542
    >   - name: nfConntrackMax
    >     required: false
    >     schema:
    >       openAPIV3Schema:
    >         type: string
    1807a1813,1825
    >   - name: nfConntrackMax
    >     enabledIf: '{{ not (empty .nfConntrackMax) }}'
    >     definitions:
    >     - selector:
    >         apiVersion: controlplane.cluster.x-k8s.io/v1beta1
    >         kind: KubeadmControlPlaneTemplate
    >         matchResources:
    >           controlPlane: true
    >       jsonPatches:
    >       - op: add
    >         path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/-
    >         valueFrom:
    >           template: echo "net.netfilter.nf_conntrack_max={{ .nfConntrackMax }}" >> /etc/sysctl.conf
    

在管理集群中安装 ClusterClass

要使管理集群能够使用自定义 ClusterClass,请按以下方式安装该集群:

  1. 应用 ClusterClass 清单,例如:

    $ kubectl apply -f custom_cc.yaml
    vsphereclustertemplate.infrastructure.cluster.x-k8s.io/tkg-vsphere-default-extended-v1.0.0-cluster created
    vspheremachinetemplate.infrastructure.cluster.x-k8s.io/tkg-vsphere-default-extended-v1.0.0-control-plane created
    vspheremachinetemplate.infrastructure.cluster.x-k8s.io/tkg-vsphere-default-extended-v1.0.0-worker created
    kubeadmcontrolplanetemplate.controlplane.cluster.x-k8s.io/tkg-vsphere-default-extended-v1.0.0-kcp created
    kubeadmconfigtemplate.bootstrap.cluster.x-k8s.io/tkg-vsphere-default-extended-v1.0.0-md-config created
    clusterclass.cluster.x-k8s.io/tkg-vsphere-default-extended-v1.0.0 created
    
  2. 检查自定义 ClusterClass 是否已传播到默认命名空间,例如:

    $ kubectl get clusterclass,kubeadmconfigtemplate,kubeadmcontrolplanetemplate,vspheremachinetemplate,vsphereclustertemplate
    NAME                                                                AGE
    clusterclass.cluster.x-k8s.io/tkg-vsphere-default-extended-v1.0.0   3m16s
    clusterclass.cluster.x-k8s.io/tkg-vsphere-default-v1.0.0            2d18h
    
    NAME                                                                                             AGE
    kubeadmconfigtemplate.bootstrap.cluster.x-k8s.io/tkg-vsphere-default-extended-v1.0.0-md-config   3m29s
    kubeadmconfigtemplate.bootstrap.cluster.x-k8s.io/tkg-vsphere-default-v1.0.0-md-config            2d18h
    
    NAME                                                                                                AGE
    kubeadmcontrolplanetemplate.controlplane.cluster.x-k8s.io/tkg-vsphere-default-extended-v1.0.0-kcp   3m27s
    kubeadmcontrolplanetemplate.controlplane.cluster.x-k8s.io/tkg-vsphere-default-v1.0.0-kcp            2d18h
    
    NAME                                                                                                       AGE
    vspheremachinetemplate.infrastructure.cluster.x-k8s.io/tkg-vsphere-default-extended-v1.0.0-control-plane   3m31s
    vspheremachinetemplate.infrastructure.cluster.x-k8s.io/tkg-vsphere-default-extended-v1.0.0-worker          3m28s
    vspheremachinetemplate.infrastructure.cluster.x-k8s.io/tkg-vsphere-default-v1.0.0-control-plane            2d18h
    vspheremachinetemplate.infrastructure.cluster.x-k8s.io/tkg-vsphere-default-v1.0.0-worker                   2d18h
    
    NAME                                                                                                 AGE
    vsphereclustertemplate.infrastructure.cluster.x-k8s.io/tkg-vsphere-default-extended-v1.0.0-cluster   3m31s
    vsphereclustertemplate.infrastructure.cluster.x-k8s.io/tkg-vsphere-default-v1.0.0-cluster            2d18h
    

生成自定义工作负载集群清单

基于自定义 ClusterClass 创建新的工作负载集群,如下所示:

  1. 使用 --dry-run 选项运行 tanzu cluster create 以生成集群清单:

    tanzu cluster create --file workload-1.yaml --dry-run > default_cluster.yaml
    
  2. 创建 ytt 覆盖网络或直接编辑集群清单以执行以下操作:

    • topology.class 值替换为自定义 ClusterClass 的名称
    • 使用默认值将自定义变量添加到 variables

    与修改 ClusterClass 对象规范一样,只要存在新的上游集群版本,按如下方式使用覆盖网络,即可自动将更改应用于新对象:

    #@ load("@ytt:overlay", "overlay")
    
    #@overlay/match by=overlay.subset({"kind":"Cluster"})
    ---
    apiVersion: cluster.x-k8s.io/v1beta1
    kind: Cluster
    spec:
     topology:
       class: tkg-vsphere-default-extended-v1.0.0
       variables:
       - name: nfConntrackMax
         value: "1048576"
    
  3. 生成清单:

    ytt -f default_cluster.yaml -f cluster_overlay.yaml > custom_cluster.yaml
    
  4. (可选)与上面的 ClusterClass 一样,可以运行 diff 以将自定义类集群清单与基于默认类的集群进行比较,例如:

    $ diff custom_cluster.yaml default_cluster.yaml
    142c142
    <     class: tkg-vsphere-default-extended-v1.0.0
    ---
    >     class: tkg-vsphere-default-v1.0.0
    185,186d184
    <     - name: nfConntrackMax
    <       value: "1048576"
    

(可选)试运行集群创建

此可选过程显示自定义 ClusterClass 将生成和管理的资源。

  1. 制作 custom_cluster.yaml 的副本:

    cp custom_cluster.yaml dryrun_cluster.yaml
    
  2. 从管理集群复制变量 TKR_DATA

    kubectl get cluster mgmt -n tkg-system -o jsonpath='{.spec.topology.variables}' | jq -r '.[] | select(.name == "TKR_DATA")' | yq -p json '.'
    
  3. 手动将以上输出附加到 dryrun_cluster.yaml 中的 .spec.topology.variables,例如,如以下 diff 输出中所示:

    $ diff custom_cluster.yaml dryrun_cluster.yaml
    186a187,214
    >     - name: TKR_DATA
    >       value:
    >         v1.25.7+vmware.1:
    >           kubernetesSpec:
    >             coredns:
    >               imageTag: v1.9.3_vmware.8
    >             etcd:
    >               imageTag: v3.5.4_vmware.10
    >             imageRepository: projects.registry.vmware.com/tkg
    >             kube-vip:
    >               imageRepository: projects-stg.registry.vmware.com/tkg
    >               imageTag: v0.5.5_vmware.1
    >             pause:
    >               imageTag: "3.7"
    >             version: v1.25.7+vmware.1
    >           labels:
    >             image-type: ova
    >             os-arch: amd64
    >             os-name: photon
    >             os-type: linux
    >             os-version: "3"
    >             ova-version: v1.25.7+vmware.1-tkg.1-efe12079f22627aa1246398eba077476
    >             run.tanzu.vmware.com/os-image: v1.25.7---vmware.1-tkg.1-efe12079f22627aa1246398eba077476
    >             run.tanzu.vmware.com/tkr: v1.25.7---vmware.1-tkg.1-zshippable
    >           osImageRef:
    >             moid: vm-156
    >             template: /dc0/vm/photon-3-kube-v1.25.7+vmware.1-tkg.1-efe12079f22627aa1246398eba077476
    >             version: v1.25.7+vmware.1-tkg.1-efe12079f22627aa1246398eba077476
    
  4. 创建 plan 目录:

    mkdir plan
    
  5. 试运行创建集群,例如:

    $ clusterctl alpha topology plan -f dryrun_cluster.yaml -o plan
    Detected a cluster with Cluster API installed. Will use it to fetch missing objects.
    No ClusterClasses will be affected by the changes.
    The following Clusters will be affected by the changes:
    * default/workload-1
    
    Changes for Cluster "default/workload-1":
    
     NAMESPACE  KIND                    NAME                             ACTION
     default    KubeadmConfigTemplate   workload-1-md-0-bootstrap-lvchb  created
     default    KubeadmControlPlane     workload-1-2zmql                 created
     default    MachineDeployment       workload-1-md-0-hlr7c            created
     default    MachineHealthCheck      workload-1-2zmql                 created
     default    MachineHealthCheck      workload-1-md-0-hlr7c            created
     default    Secret                  workload-1-shim                  created
     default    VSphereCluster          workload-1-fmt2j                 created
     default    VSphereMachineTemplate  workload-1-control-plane-mf6k6   created
     default    VSphereMachineTemplate  workload-1-md-0-infra-k88bk      created
     default    Cluster                 workload-1                       modified
    
    Created objects are written to directory "plan/created"
    Modified objects are written to directory "plan/modified"
    
  6. 您应该会看到生成的以下文件,并在 KubeadmControlPlane_default_workload-1-2zmql.yaml 中找到内核配置。

    $ tree plan
    plan
    |-- created
    |   |-- KubeadmConfigTemplate_default_workload-1-md-0-bootstrap-lvchb.yaml
    |   |-- KubeadmControlPlane_default_workload-1-2zmql.yaml
    |   |-- MachineDeployment_default_workload-1-md-0-hlr7c.yaml
    |   |-- MachineHealthCheck_default_workload-1-2zmql.yaml
    |   |-- MachineHealthCheck_default_workload-1-md-0-hlr7c.yaml
    |   |-- Secret_default_workload-1-shim.yaml
    |   |-- VSphereCluster_default_workload-1-fmt2j.yaml
    |   |-- VSphereMachineTemplate_default_workload-1-control-plane-mf6k6.yaml
    |   `-- VSphereMachineTemplate_default_workload-1-md-0-infra-k88bk.yaml
    `-- modified
       |-- Cluster_default_workload-1.diff
       |-- Cluster_default_workload-1.jsonpatch
       |-- Cluster_default_workload-1.modified.yaml
       `-- Cluster_default_workload-1.original.yaml
    
    2 directories, 13 files
    

    每当对自定义 ClusterClass 进行更改时,都应如上述所述比较资源。

创建自定义集群

根据上面生成的自定义清单创建自定义工作负载集群,如下所示。

  1. 应用上述生成的自定义类集群清单,例如:

    $ kubectl apply -f custom_cluster.yaml
    secret/workload-1-vsphere-credential created
    secret/workload-1-nsxt-credential created
    vspherecpiconfig.cpi.tanzu.vmware.com/workload-1 created
    vspherecsiconfig.csi.tanzu.vmware.com/workload-1 created
    clusterbootstrap.run.tanzu.vmware.com/workload-1 created
    secret/workload-1 created
    cluster.cluster.x-k8s.io/workload-1 created
    
    注意

    请勿使用应用 dryrun_cluster.yaml(用于生成清单),因为TKR_DATA 变量将由 TKG Webhook 注入。

  2. 检查创建的对象属性。例如,对于上述内核修改,请检索 KubeadmControlPlane 对象并确认已设置内核配置:

    $ kubectl get kcp workload-1-jgwd9 -o yaml
    apiVersion: controlplane.cluster.x-k8s.io/v1beta1
    kind: KubeadmControlPlane
    ...
       preKubeadmCommands:
       - hostname "{{ ds.meta_data.hostname }}"
       - echo "::1         ipv6-localhost ipv6-loopback" >/etc/hosts
       - echo "127.0.0.1   localhost" >>/etc/hosts
       - echo "127.0.0.1   {{ ds.meta_data.hostname }}" >>/etc/hosts
       - echo "{{ ds.meta_data.hostname }}" >/etc/hostname
       - echo "net.netfilter.nf_conntrack_max=1048576" >> /etc/sysctl.conf
       useExperimentalRetryJoin: true
    ...
    
  3. 登录到控制平面节点并确认其 sysctl.conf 已修改:

    $ capv@workload-1-cn779-pthp5 [ ~ ]$ sudo cat /etc/sysctl.conf
    ...
    net.ipv4.ip_forward=1
    net.ipv4.tcp_timestamps=1
    net.netfilter.nf_conntrack_max=1048576
    
check-circle-line exclamation-circle-line close-line
Scroll to top icon