ClusterClass 생성

이 항목에서는 클래스 기반 워크로드 클러스터를 TKG(Tanzu Kubernetes Grid) 독립 실행형 관리 클러스터와 함께 생성하기 위한 토대로 사용할 수 있는 고유한 사용자 지정 ClusterClass 리소스 정의를 생성하는 방법을 설명합니다. ClusterClass에서 클러스터를 기반으로 하려면 해당 spec.topology.class를 ClusterClass 이름으로 설정합니다.

이 절차는 vSphere with Tanzu Supervisor가 있는 TKG에는 적용되지 않습니다.

중요

사용자 지정 ClusterClass 리소스 정의를 생성하는 것은 고급 사용자를 위한 것입니다. VMware는 ClusterClass 개체를 기준으로 하는 워크로드 클러스터의 기능을 보장하지는 않습니다. 기본 ClusterClass 리소스를 사용하여 워크로드 클러스터를 생성하려면 클러스터 배포 단계의 절차를 따르십시오.

요구 사항

ClusterClass 정의를 생성하려면 다음 도구가 로컬에 설치되어 있어야 합니다.

도구 버전
clusterctl v1.2.0
ytt 0.42.0
jq 1.5-1
yq v4.30.5

옵션: 오버레이 및 새 개체 규격

새 ClusterClass를 생성하려면 ClusterClass 개체 소스 아래에 연결된 기존의 기본 ClusterClass 개체로 시작한 다음 이를 ytt 오버레이로 수정하는 것이 좋습니다. 기본 ClusterClass 개체의 새 버전이 게시되면 동일한 사용자 지정을 구현하기 위해 오버레이를 새 버전에 적용할 수 있습니다. 아래 절차에서는 사용자 지정 ClusterClass 개체를 생성하는 이 방법을 설명합니다.

아무것도 없는 새 ClusterClass 개체를 작성하려면 클러스터 API 설명서의 ClusterClass 쓰기를 따르십시오.

사용자 지정 ClusterClass 개체 생성

Tanzu Framework 저장소에 정의된 기존 ClusterClass를 기반으로 사용자 지정 ClusterClass 개체 정의를 생성하려면 다음을 수행합니다.

ClusterClass 개체 소스 검색

  1. Github의 Tanzu Framework 코드 저장소에서 v0.28.1 zip 번들을 다운로드하여 압축을 풉니다.

  2. 대상 인프라를 기준으로 저장소의 package 하위 디렉토리로 cd.

    • AWS: packages/tkg-clusterclass-aws
    • Azure: packages/tkg-clusterclass-azure
    • vSphere: packages/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. 출력 위에 수동으로 .spec.topology.variablesdryrun_cluster.yaml에 추가합니다(예: 이 diff의 출력).

    $ diff custom_cluster.yaml dryrun_cluster.yaml
    186a187,214
    >     - name: TKR_DATA
    >       value:
    >         v1.24.10+vmware.1:
    >           kubernetesSpec:
    >             coredns:
    >               imageTag: v1.8.6_vmware.12
    >             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.24.10+vmware.1
    >           labels:
    >             image-type: ova
    >             os-arch: amd64
    >             os-name: photon
    >             os-type: linux
    >             os-version: "3"
    >             ova-version: v1.24.10+vmware.1-tkg.1-efe12079f22627aa1246398eba077476
    >             run.tanzu.vmware.com/os-image: v1.24.10---vmware.1-tkg.1-efe12079f22627aa1246398eba077476
    >             run.tanzu.vmware.com/tkr: v1.24.10---vmware.1-tkg.1-zshippable
    >           osImageRef:
    >             moid: vm-156
    >             template: /dc0/vm/photon-3-kube-v1.24.10+vmware.1-tkg.1-efe12079f22627aa1246398eba077476
    >             version: v1.24.10+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
    
    주의

    변수 TKR_DATA가 TKG Webhook에 의해 주입되기 때문에 매니페스트를 생성하는 데 사용된 dryrun_cluster.yaml을 사용하지 마십시오.

  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