This site will be decommissioned on December 31st 2024. After that date content will be available at techdocs.broadcom.com.

여러 가용성 영역에서 클러스터 실행

이 항목에서는 여러 AZ(가용성 영역)에서 실행되는 새 TKG(Tanzu Kubernetes Grid) 워크로드 클러스터를 배포하는 방법과 기존 관리 및 워크로드 클러스터를 여러 또는 다른 AZ에서 실행하도록 변경하는 방법을 설명합니다.

설치 관리자 인터페이스를 사용하여 여러 AZ에서 실행되는 새로운 독립형 관리 클러스터를 구성하려면 설치 관리자 인터페이스를 사용하여 관리 클러스터 배포의 vSphere 리소스 구성을 참조하십시오.

참고

이 항목은 독립형 관리 클러스터가 있는 TKG에 적용됩니다. 여러 가용성 영역에서 Supervisor와 함께 TKG를 실행하려면 vSphere 8.0 설명서의 다중 영역 Supervisor 배포에 대한 VSphere 영역 생성을 참조하십시오.

개요

Kubernetes 개체: vSphere 클러스터에 여러 가용성 영역을 사용하도록 설정하기 위해 CAPV(클러스터 API 제공자 vSphere)는 다음 두 가지 CRD(사용자 리소스 정의)를 사용합니다.

  • VSphereFailureDomain CRD는 지역/영역별 태그 지정 정보와 vSphere 데이터 센터, 클러스터, 호스트, 데이터스토어 정보를 포함하는 토폴로지 정의를 캡처합니다.
  • VSphereDeploymentZone CRD는 kubernetes 노드에 대한 배치 제약 조건 정보와 VSphereFailureDomain 연결을 캡처합니다.

Kubernetes-vSphere 연결: VSphereFailureDomainVSphereDeploymentZone 개체 정의는 지역 및 AZ를 다음 설정으로 정의합니다.

  • 지역: spec.region
  • 영역/AZ: spec.zone

vSphere는 k8s-regionk8s-zone 태그를 지정하여 Kubernetes의 지역과 AZ를 vSphere 기본 개체와 연결합니다.

AZ 범위: 다음과 같이 AZ 및 지역을 vSphere 개체와 연결하여 vSphere 여러 수준에서 범위를 지정할 수 있습니다.

AZ 범위 영역/AZ 지역 다중 AZ 사용
클러스터 AZ vSphere 클러스터 vSphere 데이터 센터 데이터 센터의 여러 클러스터에 노드 분산
호스트 그룹 AZ vSphere 호스트 그룹 vSphere 클러스터 단일 클러스터의 여러 호스트에 노드 분산

이 항목의 구성은 개체가 vSphere에서 태그가 지정되고 VSphereFailureDomainVSphereDeploymentZone 정의에서 참조되는 방식에 따라 vSphere 개체, 즉 vSphere 데이터 센터, 클러스터, 호스트에 TKG 클러스터 제어부 및 Worker 노드를 분산합니다.

Cluster 개체 구성: Cluster 개체 사양은 AZ를 정의하는 VSphereDeploymentZone 개체의 서로 다른 속성과 일치하는 다양한 방식으로 제어부 및 Worker 노드에 AZ를 구성합니다.

노드 유형 spec.topology 아래의 속성 VSphereDeploymentZone 속성과 일치하려면
제어부 노드 variables.controlPlaneZoneMatchingLabels metadata.labels 쌍 목록 {"environment": "staging", "region": "room1"}
작업자 노드 각 시스템 배포를 위한 machineDeployments.MD-INDEX.failureDomain metadata.name 값 목록 [rack1,rack2,rack3]

제어부 노드는 레이블 일치를 기반으로 AZ에 할당되므로 클러스터 제어부 노드에서 사용할 수 있는 각 AZ 조합을 구분하는 레이블을 생성해야 합니다.

사전 요구 사항

여러 또는 다른 AZ에서 실행되도록 TKG 클러스터를 배포하거나 변경하기 위한 사전 요구 사항은 다음과 같습니다.

  • 워크로드 클러스터가 vSphere에서 실행되는 Tanzu Kubernetes Grid 관리 클러스터.
  • vSphere 계정의 필수 사용 권한에 설명된 대로 TKG에 설정된 vSphere 계정에 다음 사용 권한이 추가되었습니다.
    • 호스트(Host) > 인벤토리(Inventory) > 클러스터 수정(Modify cluster)

여러 AZ에 워크로드 클러스터 배포

다음 섹션에 설명된 대로 워크로드 클러스터를 배포하여 세 가지 기본 단계의 여러 AZ(가용성 영역)에서 해당 제어부 또는 작업자 노드를 실행할 수 있습니다.

  1. vSphere 지역 및 AZ 준비
  2. Kubernetes에서 FailureDomainDeployment Zone 개체 생성
  3. 클러스터 배포

vSphere 지역 및 AZ 준비

TKG에서 지역 및 AZ를 지원하기 위한 vSphere 준비하려면 다음을 수행합니다.

  1. TKG 클러스터 노드가 호스팅될 지역 및 AZ에 대한 vSphere 개체를 식별하거나 생성합니다.

    • 호스트 그룹 AZ: vSphere 호스트 그룹을 AZ로 사용하는 경우 사용하려는 각 AZ에 대해 하나의 호스트 그룹과 해당 VM 그룹을 생성해야 합니다.

      1. 다음 방법 중 하나로 호스트 그룹 및 VM 그룹 개체를 생성합니다.

        • vCenter의 구성(Configure) > VM/호스트 그룹(VM/Host Groups) > 추가(Add)…에서 호스트 그룹 및 VM 그룹을 생성합니다.

          • 호스트 그룹을 생성하려면 더미 VM을 생성하여 그룹 멤버로 추가해야 할 수 있습니다.
        • govc CLI 사용하여 다음과 유사한 govc 명령을 실행합니다. 예를 들어 호스트 그룹 rack1 및 VM 그룹 rack1-vm-group을 생성합니다.

          govc cluster.group.create -cluster=RegionA01-MGMT -name=rack1 -host esx-01a.corp.tanzu esx-02a.corp.tanzu
          
          govc cluster.group.create -cluster=RegionA01-MGMT -name=rack1-vm-group -vm
          
      2. 생성된 VM 그룹과 호스트 그룹 간에 선호도 규칙을 추가하여 VM 그룹의 VM이 생성된 호스트 그룹의 호스트에서 실행되도록 합니다.

        • 유형(Type)가상 시스템을 호스트로(Virtual Machines to Hosts)로 설정하고 그룹 내 호스트에서 실행해야 함 규칙을 포함합니다.
  2. vSphere 클러스터 AZ를 구성하는지 또는 호스트 그룹 AZ를 구성하는지에 따라 다음과 같이 vSphere 개체에 태그를 지정합니다. 이러한 예에서는 govc CLI를 사용하지만 vCenter에서 태그 및 사용자 지정 특성(Tags & Custom Attributes) 창을 사용할 수도 있습니다.

    • 클러스터 AZ:

      각 AZ에 대해 govc를 사용하여 k8s-region 범주 태그를 생성하고 데이터 센터에 연결하고 각 vSphere 클러스터에 k8s-zone 범주 태그를 연결합니다. 예를 들어 데이터 센터 dc0us-west-1 및 해당 클러스터 cluster1 등과 같은 영역으로 태그를 지정하려면 AZs us-west-1a 등으로 태그를 지정합니다.

      govc tags.category.create -t Datacenter k8s-region
      
      govc tags.category.create -t ClusterComputeResource k8s-zone
      
      govc tags.create -c k8s-region us-west-1
      
      govc tags.create -c k8s-zone us-west-1a
      govc tags.create -c k8s-zone us-west-1b
      govc tags.create -c k8s-zone us-west-1c
      
      govc tags.attach -c k8s-region us-west-1 /dc0
      
      govc tags.attach -c k8s-zone us-west-1a /dc0/host/cluster1
      govc tags.attach -c k8s-zone us-west-1b /dc0/host/cluster2
      govc tags.attach -c k8s-zone us-west-1c /dc0/host/cluster3
      
    • 호스트 그룹 AZ:

      각 AZ에 대해 govc를 사용하여 k8s-region 범주 태그를 생성하고 vSphere 클러스터에 연결하고 각 호스트 그룹에 k8s-zone 범주 태그를 연결합니다. 예를 들어 클러스터 /dc1/host/room1-mgmt를 지역 room1로, 그리고 해당 호스트 그룹 /dc1/host/room1-mgmt/esx-01a.corp.tanzu 등을 AZs rack1 등으로 태그 지정합니다.

      govc tags.category.create -t ClusterComputeResource k8s-region
      govc tags.category.create -t HostSystem k8s-zone
      
      govc tags.create -c k8s-region room1
      
      govc tags.create -c k8s-zone rack1
      govc tags.create -c k8s-zone rack2
      govc tags.create -c k8s-zone rack3
      
      govc tags.attach -c k8s-region room1 /dc1/host/room1-mgmt
      
      govc tags.attach -c k8s-zone rack1 /dc1/host/room1-mgmt/esx-01a.corp.tanzu
      govc tags.attach -c k8s-zone rack1 /dc1/host/room1-mgmt/esx-01b.corp.tanzu
      govc tags.attach -c k8s-zone rack1 /dc1/host/room1-mgmt/esx-01c.corp.tanzu
      

Kubernetes에서 FailureDomainDeployment Zone 개체 생성

클러스터를 여러 가용성 영역에 배포하기 전에 지역 및 영역을 정의하는 Kubernetes 개체 FailureDomainDeployment Zone을 생성해야 합니다. spec.region, spec.zone, spec.topology 아래의 모든 설정은 vCenter에서 구성된 개체 경로 및 태그와 일치해야 합니다.

  • VSphereDeploymentZone 개체의 경우 spec.failuredomain 값이 VSphereFailureDomain 정의의 metadata.name 값 중 하나와 일치해야 합니다.
  • spec.server 개체의 VSphereDeploymentZone 값은 설치 관리자 인터페이스 IaaS 제공자 창 또는 관리 클러스터 구성 파일의 VSPHERE_SERVER 설정에 VSPHERE_SERVER 입력된 vCenter 서버 주소(IP 또는 FQDN)와 일치해야 합니다.
  • metadata.name 값은 모두 소문자여야 합니다.

vSphere 클러스터 AZ 또는 호스트 그룹 AZ를 구성하는지 여부에 따라 다음과 같이 FailureDomainDeployment Zone 개체를 생성합니다.

  • 클러스터 AZ:

    데이터 센터 내의 여러 vSphere 클러스터 노드에 워크로드 클러스터를 분산하는 방법의 예로, 다음 코드는 us-west-1a, us-west-1b, us-west-1c라는 세 가지 배포 영역에 필요한 개체를 정의하며 각각은 고유한 네트워크 및 스토리지 매개 변수가 있는 vSphere 클러스터입니다.

      ---
      apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
      kind: VSphereFailureDomain
      metadata:
       name: us-west-1a
      spec:
       region:
         name: us-west-1
         type: Datacenter
         tagCategory: k8s-region
       zone:
         name: us-west-1a
         type: ComputeCluster
         tagCategory: k8s-zone
       topology:
         datacenter: dc0
         computeCluster: cluster1
         datastore: ds-c1
         networks:
         - net1
         - net2
      ---
      apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
      kind: VSphereFailureDomain
      metadata:
       name: us-west-1b
      spec:
       region:
         name: us-west-1
         type: Datacenter
         tagCategory: k8s-region
       zone:
         name: us-west-1b
         type: ComputeCluster
         tagCategory: k8s-zone
       topology:
         datacenter: dc0
         computeCluster: cluster2
         datastore: ds-c2
         networks:
         - net3
      ---
      apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
      kind: VSphereFailureDomain
      metadata:
       name: us-west-1c
      spec:
       region:
         name: us-west-1
         type: Datacenter
         tagCategory: k8s-region
       zone:
         name: us-west-1c
         type: ComputeCluster
         tagCategory: k8s-zone
       topology:
         datacenter: dc0
         computeCluster: cluster3
         datastore: ds-c3
         networks:
         - net4
      ---
      apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
      kind: VSphereDeploymentZone
      metadata:
       name: us-west-1a
      spec:
       server: VSPHERE_SERVER
       failureDomain: us-west-1a
       placementConstraint:
         resourcePool: pool1
         folder: foo
      ---
      apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
      kind: VSphereDeploymentZone
      metadata:
       name: us-west-1b
      spec:
       server: VSPHERE_SERVER
       failureDomain: us-west-1b
       placementConstraint:
         resourcePool: pool2
         folder: bar
      ---
      apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
      kind: VSphereDeploymentZone
      metadata:
       name: us-west-1c
      spec:
       server: VSPHERE_SERVER
       failureDomain: us-west-1c
       placementConstraint:
         resourcePool: pool3
         folder: baz
    

    여기서 VSPHERE_SERVER는 vCenter Server의 IP 주소 또는 FQDN입니다.

    서로 다른 vSphere 클러스터에 이름이 동일한 리소스 풀이 있는 경우 VSphereDeploymentZone 개체의 spec.placementConstraint.resourcePool을 이름뿐만 아니라 전체 리소스 경로로 설정합니다.

  • 호스트 그룹 AZ:

    단일 vSphere 클러스터의 3개 호스트 그룹에 워크로드 클러스터 노드를 분산하는 방법의 예입니다. 다음 코드는 3개의 AZ(rack1, rack2, rack3)에 필요한 개체를 정의합니다. 각각은 지역 room1로 정의된 동일한 vSphere 클러스터 내의 호스트 랙을 나타냅니다.

      apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
      kind: VSphereFailureDomain
      metadata:
       name: rack1
      spec:
       region:
         name: room1
         type: ComputeCluster
         tagCategory: k8s-region
       zone:
         name: rack1
         type: HostGroup
         tagCategory: k8s-zone
       topology:
         datacenter: dc0
         computeCluster: cluster1
         hosts:
           vmGroupName: rack1-vm-group
           hostGroupName: rack1
         datastore: ds-r1
         networks:
         - net1
      ---
      apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
      kind: VSphereFailureDomain
      metadata:
       name: rack2
      spec:
       region:
         name: room1
         type: ComputeCluster
         tagCategory: k8s-region
       zone:
         name: rack2
         type: HostGroup
         tagCategory: k8s-zone
       topology:
         datacenter: dc0
         computeCluster: cluster1
         hosts:
           vmGroupName: rack2-vm-group
           hostGroupName: rack2
         datastore: ds-r2
         networks:
         - net2
      ---
      apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
      kind: VSphereFailureDomain
      metadata:
       name: rack3
      spec:
       region:
         name: room1
         type: ComputeCluster
         tagCategory: k8s-region
       zone:
         name: rack3
         type: HostGroup
         tagCategory: k8s-zone
       topology:
         datacenter: dc0
         computeCluster: cluster1
         hosts:
           vmGroupName: rack3-vm-group
           hostGroupName: rack3
         datastore: ds-c3
         networks:
         - net3
      ---
      apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
      kind: VSphereDeploymentZone
      metadata:
       name: rack1
      spec:
       server: VSPHERE_SERVER
       failureDomain: rack1
       placementConstraint:
         resourcePool: pool1
         folder: foo
      ---
      apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
      kind: VSphereDeploymentZone
      metadata:
       name: rack2
      spec:
       server: VSPHERE_SERVER
       failureDomain: rack2
       placementConstraint:
         resourcePool: pool2
         folder: bar
      ---
      apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
      kind: VSphereDeploymentZone
      metadata:
       name: rack3
      spec:
       server: VSPHERE_SERVER
       failureDomain: rack3
       placementConstraint:
         resourcePool: pool3
       folder: baz
    

    여기서 VSPHERE_SERVER는 vCenter Server의 IP 주소 또는 FQDN입니다.

클러스터를 배포하기 위한 다음 단계는 가용성 영역에 분산된 노드가 있는 워크로드 클러스터 배포를 참조하십시오.

클러스터 배포

vSphere에서 지역 및 AZ 준비Kubernetes에서 FailureDomainDeployment Zone 개체 생성의 단계를 수행한 후 해당 노드가 여러 AZ에 분산된 워크로드 클러스터를 배포할 수 있습니다.

다음 단계에서는 vsphere-zones.yamlFailureDomainDeployment Zone 개체 정의가 포함된 파일로 사용합니다.

  1. 독립형 관리 클러스터가 있는 vSphere 구성 파일에 따라 배포하려는 워크로드 클러스터에 대한 클러스터 구성 파일을 생성합니다.

  2. 여러 가용성 영역 구성에 따라 클러스터 구성 파일을 확인하거나 수정하여 AZ 개체 정의와 일치하도록 VSPHERE_REGION, VSPHERE_ZONE, VSPHERE_AZ_0 및 기타 구성 변수를 설정합니다.

    • AZ에 대한 클러스터 구성 변수는 독립형 관리 클러스터 및 워크로드 클러스터에서 동일한 방식으로 작동합니다.
    • 워크로드 클러스터를 vSphere 배포할 때 지정해야 하는 전체 옵션 목록은 구성 파일 변수 참조를 참조하십시오.
  3. (선택 사항) 클러스터 생성 프로세스가 구성에 지정된 vSphere 영역과 지역이 모두 존재하고 일관되고 동일한 수준으로 정의되었는지 확인하지 못하게 하려면 로컬 환경에서 SKIP_MULTI_AZ_VERIFY"true"로 설정합니다.

    export SKIP_MULTI_AZ_VERIFY="true"
    

    클러스터 구성 파일에서는 이 변수를 설정할 수 없습니다.

  4. tanzu cluster create를 실행하여 워크로드 클러스터를 생성합니다. 자세한 내용은 워크로드 클러스터 생성을 참조하십시오.

    • 별도로 AZ 개체를 생성하려면 tanzu login을 사용하여 관리 클러스터에 로그인하고 다음을 실행한 후 tanzu cluster create를 실행합니다.

      tanzu mc az set -f vsphere-zones.yaml
      

      또는 kubectl apply -f vsphere-zones.yaml을 실행할 수 있습니다.

    • 플랫 클러스터 구성 파일과 함께 AZ 개체 정의를 사용하고 AZ 및 클러스터 개체를 함께 생성하려면 vsphere-zones.yaml 파일을 tanzu cluster create--az-file 옵션으로 전달합니다.

      tanzu mc create --file cluster-config-file.yaml --az-file vsphere-zones.yaml
      
    • AZ 개체 정의를 클러스터 매니페스트에 결합하려면 클래스 기반 클러스터 생성에 설명된 2단계 프로세스의 1단계에 따라 클러스터 매니페스트를 생성하고, 매니페스트에 vsphere-zones.yaml 컨텐츠를 추가한 다음, 2단계에 설명된 대로 tanzu cluster create를 실행합니다.

    • 클러스터 생성 프로세스 중에 해당 VM 및 기타 리소스가 vCenter 표시되는 것을 볼 수 있습니다.

    • VM 그룹을 생성하기 위해 vCenter 더미 VM을 생성한 경우 클러스터가 실행되면 VM 그룹에서 VM을 삭제하거나 제거할 수 있습니다.

여러 또는 다른 가용성 영역을 사용하도록 기존 클러스터 업데이트

이미 배포된 관리 또는 워크로드 클러스터를 업데이트하여 제어부 또는 Worker 노드를 여러 AZ(가용성 영역)에서 실행하거나 노드가 실행되는 AZ를 변경할 수 있습니다.

AZ를 클러스터의 제어부 또는 Worker 노드 전체에 할당하거나 기본 시스템 배포를 위한 AZ를 설정하여 시스템 배포 집합에 AZ와 함께 vSphere 시스템 설정을 사용자 지정할 수 있습니다.

기존 워크로드 클러스터의 AZ를 업데이트한 후에는 AZ 변경에 대한 CPI 및 CSI 업데이트에 설명된 대로 변경 내용을 반영하도록 CSI(컨테이너 스토리지 인터페이스) 및 CPI(클라우드 제공자 인터페이스)를 업데이트해야 합니다.

다음 섹션에서는 다양한 시나리오별로 기존 클러스터 AZ 구성을 업데이트하는 방법을 설명합니다.

제어부 노드용 AZ 추가

제어부 노드가 단일 AZ에서 실행되어 제어부가 여러 AZ에서 실행되도록 기존 클러스터를 확장하려면 다음을 수행합니다.

  1. 새 AZ 각각에 대해 VSphereFailureDomainVSphereDeploymentZone 개체를 정의하는 구성 파일을 준비합니다. 아래의 예인 vsphere-3-zones.yaml은 지역 rack1과 함께 rack2, rack3, room1을 정의합니다

    apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
    kind:VSphereFailureDomain
    metadata:
     name:rack
    spec:
     region:
     name: room1
     type: ComputeCluster
     tagCategory: k8s-region
     zone:
     name:rack
     type: HostGroup
     tagCategory: k8s-zone
     topology:
     datacenter: dc0
     computeCluster: cluster0
     hosts:
     vmGroupName:rack-vm-group
     hostGroupName:rack
     datastore: ds1
     networks:
     - "VM Network"
    ---
    apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
    kind:VSphereFailureDomain
    metadata:
     name:rack
    spec:
     region:
     name: room1
     type: ComputeCluster
     tagCategory: k8s-region
     zone:
     name: rack2
     type: HostGroup
     tagCategory: k8s-zone
     topology:
     datacenter: dc0
     computeCluster: cluster0
     hosts:
     vmGroupName: rack2-vm-group
     hostGroupName: rack2
     datastore: ds2
     networks:
     - "VM Network"
    ---
    apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
    kind: VSphereFailureDomain
    metadata:
     name: rack3
    spec:
     region:
     name: room1
     type: ComputeCluster
     tagCategory: k8s-region
     zone:
     name: rack3:
     type: HostGroup
     tagCategory: k8s-zone
     topology:
     datacenter: dc0
     computeCluster: cluster0
     hosts:
     vmGroupName: rack3-vm-group
     hostGroupName: rack3
     datastore: ds3
     networks:
     - "VM Network"
    ---
    apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
    kind: VSphereDeploymentZone
    metadata:
     name: rack1
    spec:
     server: VSPHERE_SERVER
     failureDomain: rack1
     placementConstraint:
     resourcePool: rp0
     folder: folder0
    ---
    apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
    kind: VSphereDeploymentZone
    metadata:
     name: rack2
    spec:
     server: VSPHERE_SERVER
     failureDomain: rack2
     placementConstraint:
     resourcePool: rp0
     folder: folder0
    ---
    apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
    kind: VSphereDeploymentZone
    metadata:
     name: rack3
    spec:
     server: VSPHERE_SERVER
     failureDomain: rack3
     placementConstraint:
     resourcePool: rp0
     folder: folder0
    

    여기서 VSPHERE_SERVER는 vCenter Server의 IP 주소 또는 FQDN입니다.

    참고:

    • vSphere 제품 설명서의 vSphere 태그에 설명된 대로 태그가 생성되었는지, 그리고 vCenter Server 인벤토리의 리소스가 올바르게 지정되었는지 확인합니다.
    • VSphereDeploymentZone에서 spec.placementConstraint.resourcePool을 설정해야 합니다. 클러스터에 사용자가 생성한 리소스 풀이 없는 경우 값을 클러스터의 기본 리소스 풀 값 즉 /dc0/host/cluster1/Resources로 설정합니다.
    • VSphereFailureDomain 개체의 경우 spec.region.autoConfigurespec.zone.autoConfigure는 더 이상 지원되지 않습니다.
  2. vSphereFailureDomainVSphereDeploymentZone 개체를 생성합니다. 예를 들면 다음과 같습니다.

    tanzu mc az set -f vsphere-3-zones.yaml
    
  3. 대상 클러스터의 KubeAdmControlPlane을 가져옵니다. 이 예에서 대상은 관리 클러스터 tkg-mgmt-vc이지만 워크로드 클러스터일 수도 있습니다.

    kubectl get kcp --selector cluster.x-k8s.io/cluster-name=tkg-mgmt-vc -n tkg-system -o=name
    
    kubeadmcontrolplane.controlplane.cluster.x-k8s.io/tkg-mgmt-vc-cpkxj
    
  4. 클러스터 AZ 선택기를 업데이트합니다. 예: controlPlaneZoneMatchingLabels: {"environment": "staging", "region": "room1"}:

    kubectl get cluster tkg-mgmt-vc -n tkg-system -o json | jq '.spec.topology.variables |= map(if .name == "controlPlaneZoneMatchingLabels" then .value = {"environment": "staging", "region": "room1"} else . end)'| kubectl apply -f -
    
    cluster.cluster.x-k8s.io/tkg-mgmt-vc replaced
    
  5. 클러스터의 장애 도메인이 예상대로 업데이트되었는지 확인합니다.

    kubectl get cluster tkg-mgmt-vc -n tkg-system -o json | jq -r '.status.failureDomains | to_entries[].key'
    
  6. KubeAdmControlPlanerolloutAfter 패치를 적용하여 제어부 노드의 업데이트를 트리거합니다.

    kubectl patch kcp tkg-mgmt-vc-cpkxj -n tkg-system --type merge -p "{\"spec\":{\"rolloutAfter\":\"$(date +'%Y-%m-%dT%TZ')\"}}"
    
  7. vCenter 노드의 호스트 및 데이터스토어를 확인하거나 kubectl get node 또는 govc vm.info 명령을 실행하여 제어부 노드가 새 AZ로 이동했는지 확인합니다.

    • kubectl get node NODE-NAME -o=jsonpath='{.metadata.labels.node.cluster.x-k8s.io/esxi-host}' --context tkg-mgmt-vc-admin@tkg-mgmt-vc
    • govc vm.info -json NODE-NAME | jq -r '.VirtualMachines[].Config.Hardware.Device[] | select(.DeviceInfo.Label == "Hard disk 1") | .Backing.FileName'

선택기 레이블을 사용하여 새 제어부 AZ 지정

선택기 레이블이 있는 AZ를 선택하는 것은 metadata.name이 아닌 metadata.labelsVSphereDeploymentZone을 지정하는 것을 의미합니다. 이렇게 하면 AZ를 개별적으로 나열하지 않고 지정된 지역 및 환경의 모든 AZ에서 실행되도록 클러스터의 제어부 노드를 구성할 수 있습니다. "region=us-west-1,environment=staging". 또한 제어부 노드의 AZ 이름을 변경하지 않고도 클러스터 제어부의 AZ를 업데이트할 수 있습니다.

선택기 레이블을 사용하여 기존 클러스터의 제어부 노드에 대한 새 AZ를 지정하려면:

  1. 새 AZ 각각에 대해 VSphereFailureDomainVSphereDeploymentZone 개체를 정의하는 구성 파일을 준비합니다. 아래 예인 vsphere-labeled-zones.yaml은 선택기 레이블 메타데이터를 사용하여 AZ rack4을 정의합니다.

    apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
    kind: VSphereFailureDomain
    metadata:
      name: rack4
    spec:
      region:
       name: room1
       type: ComputeCluster
       tagCategory: k8s-region
      zone:
       name: rack4
       type: HostGroup
       tagCategory: k8s-zone
      topology:
       datacenter: dc0
       computeCluster: cluster0
       hosts:
         vmGroupName: rack4-vm-group
         hostGroupName: rack4
       datastore: vsanDatastore
       networks:
       - "VM Network"
    ---
    apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
    kind: VSphereDeploymentZone
    metadata:
     name: rack4
     labels:
       environment: staging
       region: room1
    spec:
     server: VSPHERE_SERVER
     failureDomain: rack4
     placementConstraint:
       resourcePool: rp0
       folder: folder0
    
  2. VSphereFailureDomainVSphereDeploymentZone 개체를 생성합니다. 예를 들면 다음과 같습니다.

    tanzu mc az set -f vsphere-labeled-zones.yaml
    
  3. AZ 선택기 레이블로 클러스터를 업데이트합니다. 이 예에서는 관리 클러스터 tkg-mgmt-vc에 AZ 선택기 controlPlaneZoneMatchingLabels: {"environment": "staging", "region": "room1"}을 사용하지만 워크로드 클러스터일 수도 있습니다.

    kubectl get cluster tkg-mgmt-vc -n tkg-system -o json | \
    jq '.spec.topology.variables |= \
    map(if .name == "controlPlaneZoneMatchingLabels" \
    then .value = {"environment": "staging", "region": "room1"} \
    else . end)'| kubectl apply -f -
    
    cluster.cluster.x-k8s.io/tkg-mgmt-vc replaced
    
  4. 클러스터 상태를 확인하여 장애 도메인이 예상대로 업데이트되었는지 확인합니다.

    kubectl get cluster tkg-mgmt-vc -n tkg-system -o json | jq -r '.status.failureDomains | to_entries[].key'
    
  5. KubeAdmControlPlanerolloutAfter 패치를 적용하여 제어부 노드의 업데이트를 트리거합니다.

    kubectl patch kcp tkg-mgmt-vc-cpkxj -n tkg-system --type merge -p "{\"spec\":{\"rolloutAfter\":\"$(date +'%Y-%m-%dT%TZ')\"}}"
    
  6. vCenter 노드의 호스트 및 데이터스토어를 확인하거나 kubectl get node 또는 govc vm.info 명령을 실행하여 controlPlaneZoneMatchingLabels의 선택기에서 선택한 새 AZ로 제어부 노드가 이동되었는지 확인합니다. 이 예에서 새 AZ는 rack4입니다.

    • kubectl get node NODE-NAME -o=jsonpath='{.metadata.labels.node.cluster.x-k8s.io/esxi-host}' --context tkg-mgmt-vc-admin@tkg-mgmt-vc
    • govc vm.info -json NODE-NAME | jq -r '.VirtualMachines[].Config.Hardware.Device[] | select(.DeviceInfo.Label == "Hard disk 1") | .Backing.FileName'

시스템 배포 AZ 변경

기존 클러스터에서 AZ 구성을 변경하려면 노드의 기본 MachineDeployment 구성을 새 AZ 값으로 패치합니다.

예를 들어 클러스터 구성 파일이 rack1VSPHERE_AZ_0으로 설정하고 해당 작업자 노드를 rack2로 이동하려는 경우:

  1. 클러스터에 사용되는 현재 AZ를 쿼리합니다. 이 예에서는 워크로드 클러스터 tkg-wc를 사용하지만 관리 클러스터일 수도 있습니다.

    kubectl get cluster tkg-wc -o json \| jq -r '.spec.topology.workers.machineDeployments\[0\].failureDomain'
    
  2. 사용 가능한 모든 AZ를 나열합니다.

    kubectl get vspheredeploymentzones -o=jsonpath='{range .items[?(@.status.ready == true)]}{.metadata.name}{"\n"}{end}'
    
    rack1
    rack2
    
  3. tkg-wc 클러스터의 spec.toplogy.workers.machineDeployments 구성에 패치를 적용하여 해당 영역 VSphereFailureDomainrack2로 설정합니다. 이 예에서는 tkg-wc를 단일 노드, dev를 계획 클러스터라고 가정합니다. prod 계획 클러스터의 경우 클러스터의 세 MachineDeployment 개체 구성 모두에 패치를 적용해야 합니다.

    kubectl patch cluster tkg-wc --type=json -p='[{"op": "replace", "path": "/spec/topology/workers/machineDeployments/0/failureDomain", "value": "rack2"}]'
    
    cluster.cluster.x-k8s.io/tkg-wc patched
    
  4. 클러스터가 VSphereFailureDomain rack2로 업데이트되었는지 확인합니다.

    kubectl get cluster tkg-wc -o=jsonpath='{.spec.topology.workers.machineDeployments[?(@.name=="md-0")].failureDomain}'
    
    rack2
    
  5. Worker 노드가 이제 VSphereFailureDomain rack2에서 배포되었는지 확인합니다.

시스템 배포를 위한 AZ 추가

TKG 클러스터에서 사용할 새 AZ를 구성한 다음 기존 클러스터에서 사용하려면 다음을 수행합니다.

  1. 새 AZ 각각에 대해 VSphereFailureDomainVSphereDeploymentZone 개체를 정의하는 구성 파일을 준비합니다. 위의 제어부 노드용 AZ 추가에 있는 vsphere-3-zones.yaml 예를 사용합니다. 이것은 지역 room1으로 rack1, rack2, rack3를 정의합니다.

  2. VSphereFailureDomainVSphereDeploymentZone 개체를 생성합니다.

    tanzu mc az set -f vsphere-3-zones.yaml
    

    또는 kubectl apply -f vsphere-3-zones.yaml을 실행할 수 있습니다.

  3. 클러스터 tkg-wcVSphereFailureDomain rack1, rack2, rack3 패치를 적용합니다. 이 예에서 tkg-wc는 3개의 MachineDeployment 구성이 있는 prod 계획 클러스터 계획입니다. dev 계획 클러스터를 사용하면 클러스터의 spec.toplogy.workers.machineDeployments에서 MachineDeployment 하나만 업데이트하면 됩니다.

    kubectl patch cluster tkg-wc --type=json -p='[  \
    {"op": "replace", "path": "/spec/topology/workers/machineDeployments/0/failureDomain", "value": "rack1"}, \
    {"op": "replace", "path": "/spec/topology/workers/machineDeployments/1/failureDomain", "value": "rack2"}, \
    {"op": "replace", "path": "/spec/topology/workers/machineDeployments/2/failureDomain", "value": "rack3"}]'
    
  4. 클러스터가 새 AZ로 업데이트되었는지 확인합니다.

    kubectl get cluster tkg-wc -o=jsonpath='{range .spec.topology.workers.machineDeployments[*]}{"Name: "}{.name}{"\tFailure Domain: "}{.failureDomain}{"\n"}{end}'
    
  5. Worker 노드가 이제 VSphereFailureDomain rack1, rack2, rack3에 배포되었는지 확인합니다.

AZ 및 새 시스템 배포 추가

TKG 클러스터에서 사용할 새 AZ와 새 MachineDeployment 개체를 모두 구성한 다음 기존 클러스터에서 사용합니다.

  1. 새 AZ 각각에 대해 VSphereFailureDomainVSphereDeploymentZone 개체를 정의하는 구성 파일을 준비합니다. 아래 예인 vsphere-1-zone.yaml은 지역 room1으로 새 AZ rack2을 정의합니다.

    apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
    kind: VSphereFailureDomain
    metadata:
     name: rack2
    spec:
     region:
       name: room1
       type: ComputeCluster
       tagCategory: k8s-region
     zone:
       name: rack2
       type: HostGroup
       tagCategory: k8s-zone
     topology:
       datacenter: dc0
       computeCluster: cluster0
       hosts:
         vmGroupName: rack2-vm-grou
         hostGroupName: rack2
         datastore: ds-r2
       networks:
       - "VM Network"
    ---
    apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
    kind: VSphereDeploymentZone
    metadata:
     name: rack2
    spec:
     server: VSPHERE_SERVER
     failureDomain: rack2
     placementConstraint:
       resourcePool: rp0
       folder: folder0
    
  2. VSphereFailureDomainVSphereDeploymentZone 개체를 생성합니다.

    tanzu mc az set -f vsphere-zones.yaml
    

    또는 kubectl apply -f vsphere-1-zone.yaml을 실행할 수 있습니다.

  3. 새 시스템 배포용 구성 파일을 준비합니다. 아래 예인 md-1.yamlaz 속성이 rack2로 설정된 새 시스템 배포 md-1을 정의합니다.

    name: md-1
    replicas: 1
    az: rack2
    nodeMachineType: t3.large
    workerClass: tkg-worker
    tkrResolver: os-name=ubuntu,os-arch=amd64
    
  4. Tanzu CLI를 사용하여 새 노드 풀을 생성합니다. 이 예에서는 워크로드 클러스터 tkg-wc를 사용하지만 관리 클러스터일 수도 있습니다.

    tanzu cluster node-pool set wl-antrea -f md-1.yaml
    
    Cluster update for node pool 'md-1' completed successfully
    
  5. 새로 생성된 노드 풀에서 시스템 배포 이름을 가져옵니다.

    kubectl get machinedeployments -l
    topology.cluster.x-k8s.io/deployment-name=md-1
    -o=jsonpath='{.items[*].metadata.name}'
    
    wl-antrea-md-1-pd9vj
    
  6. 시스템 배포가 VSphereFailureDomain rack2로 업데이트되었는지 확인합니다.

    kubectl get machinedeployments wl-antrea-md-1-pd9vj -o json | \
    jq -r '.spec.template.spec.failureDomain'
    
    rack2
    
  7. md-1 Worker 노드가 rack2에서 배포되었는지 확인합니다.

AZ 변경에 대한 CPI 및 CSI 업데이트

위 섹션에 설명된 대로 워크로드 클러스터의 AZ 구성을 변경한 후에는 해당 CPI 및 CSI 추가 기능 구성을 업데이트한 다음 변경 내용을 반영하도록 추가 기능을 다시 생성해야 합니다. 다음 절차는 수행하는 방법입니다.

제한 사항:

  • 기존 클러스터에 여러 AZ를 사용하도록 설정하거나 기존 클러스터의 Worker 노드 또는 제어부 노드를 다른 AZ로 이동하기 전에 새 클러스터 노드가 클러스터의 원래 PV(영구 볼륨)에 액세스할 수 있는지 확인해야 합니다.
  • VsphereFailureDomain의 서로 다른 영역 및 지역의 모든 tagCategory 설정이 일치해야 합니다.
  • vSphere CSI에 여러 AZ를 사용하도록 설정하기 전에 multi-az kcp/worker를 사용하도록 설정해야 합니다.

AZ 변경 후 CPI 업데이트

AZ 변경을 반영하도록 클러스터의 CPI 추가 기능 구성을 업데이트한 다음 해당 패키지 설치 관리자를 삭제하여 변경 내용이 포함된 추가 기능을 다시 생성하려면 다음을 수행합니다.

  1. cb 참조를 사용하여 클러스터의 vsphereCPIConfig 이름을 검색합니다. 예를 들어, 이름이 wl인 워크로드 클러스터:

    kubectl -n default get cb wl -o json \| jq -r '.spec.cpi.valuesFrom.providerRef.name'
    
  2. 클러스터의 vsphereCPIConfig 규격을 편집하여 해당 regionzone을 vSphere 및 tagCategory 규격의 AZ 영역 및 지역에 대해 설정한 vsphereFailuredomain 필드로 설정합니다. 예:

    apiVersion: cpi.tanzu.vmware.com/v1alpha1
    kind: VSphereCPIConfig
    metadata:
      name: wl
      namespace: default
    spec:
      vsphereCPI:
      mode: vsphereCPI
      region: k8s-zone
      tlsCipherSuites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
      vmNetwork:
        excludeExternalSubnetCidr: 10.215.10.79/32
        excludeInternalSubnetCidr: 10.215.10.79/32
      zone: k8s-zone
    
  3. 변경 내용을 적용하고 Reconcile succeeded를 기다립니다.

  4. CPI 패키지 설치 관리자(pkgi)가 다시 설치되었는지 확인합니다.

    kubectl -n tkg-system get wl-vsphere-cpi pkgi --context wl-admin@wl
    

AZ 변경 후 CSI 업데이트

AZ 변경을 반영하도록 클러스터의 CSI 추가 기능 구성을 업데이트한 다음 csinodetopology 및 해당 패키지 설치 관리자를 삭제하여 변경 내용이 포함된 추가 기능을 다시 생성하려면 다음을 수행합니다.

  1. cb 참조를 사용하여 클러스터의 vsphereCPIConfig 이름을 검색합니다. 예를 들어, 이름이 wl인 워크로드 클러스터:

    kubectl -n default get cb wl  -o json  |jq  -r '.spec.csi.valuesFrom.providerRef.name')
    
  2. 클러스터의 vsphereCSIConfig 규격을 편집하여 해당 regionzone을 vSphere 및 tagCategory 규격의 AZ 영역 및 지역에 대해 설정한 vsphereFailuredomain 필드로 설정합니다. 예:

    apiVersion: csi.tanzu.vmware.com/v1alpha1
    kind: VSphereCSIConfig
    metadata:
      name: wl
      namespace: default
    spec:
      vsphereCSI:
        config:
          datacenter: /dc0
          httpProxy: ""
          httpsProxy: ""
          insecureFlag: true
          noProxy: ""
      region: k8s-region
      tlsThumbprint: ""
      useTopologyCategories: true
      zone: k8s-zone
      mode: vsphereCSI
    
  3. 변경 내용을 적용합니다.

  4. csinodecsiNodeTopology 개체를 삭제하여 다시 생성합니다. csinodetopology는 자동으로 업데이트되지 않습니다.

    kubectl -n delete csinode --all --context wl-admin@wl
    kubectl -n delete csinodetopology --all --context wl-admin@wl
    
  5. 클러스터의 vsphere-csi 패키지 설치 관리자를 삭제하고 Reconcile succeeded를 기다립니다.

    kubectl delete pkgi -n tkg-system wl-vsphere-csi --context wl-admin@wl
    
  6. 모든 csinodes 개체에 topologyKeys 매개 변수가 포함되어 있는지 확인합니다. 예를 들면 다음과 같습니다.

    kubectl get csinodes -o jsonpath='{range .items[*]}{.metadata.name} {.spec}{"\n"}{end}'
    
    k8s-control-1 {"drivers":[{"name":"csi.vsphere.vmware.com","nodeID":"k8s-control-1","topologyKeys":["topology.csi.vmware.com/k8s-region","topology.csi.vmware.com/k8s-zone"]}]}
    k8s-control-2 {"drivers":[{"name":"csi.vsphere.vmware.com","nodeID":"k8s-control-2","topologyKeys":["topology.csi.vmware.com/k8s-region","topology.csi.vmware.com/k8s-zone"]}]}
    k8s-control-3 {"drivers":[{"name":"csi.vsphere.vmware.com","nodeID":"k8s-control-3","topologyKeys":["topology.csi.vmware.com/k8s-region","topology.csi.vmware.com/k8s-zone"]}]}
    k8s-node-1 {"drivers":[{"name":"csi.vsphere.vmware.com","nodeID":"k8s-node-1","topologyKeys":["topology.csi.vmware.com/k8s-region","topology.csi.vmware.com/k8s-zone"]}]}
    k8s-node-2 {"drivers":[{"name":"csi.vsphere.vmware.com","nodeID":"k8s-node-2","topologyKeys":["topology.csi.vmware.com/k8s-region","topology.csi.vmware.com/k8s-zone"]}]}
    k8s-node-3 {"drivers":[{"name":"csi.vsphere.vmware.com","nodeID":"k8s-node-3","topologyKeys":["topology.csi.vmware.com/k8s-region","topology.csi.vmware.com/k8s-zone"]}]}
    k8s-node-4 {"drivers":[{"name":"csi.vsphere.vmware.com","nodeID":"k8s-node-4","topologyKeys":["topology.csi.vmware.com/k8s-region","topology.csi.vmware.com/k8s-zone"]}]}
    k8s-node-5 {"drivers":[{"name":"csi.vsphere.vmware.com","nodeID":"k8s-node-5","topologyKeys":["topology.csi.vmware.com/k8s-region","topology.csi.vmware.com/k8s-zone"]}]}
    k8s-node-6 {"drivers":[{"name":"csi.vsphere.vmware.com","nodeID":"k8s-node-6","topologyKeys":["topology.csi.vmware.com/k8s-region","topology.csi.vmware.com/k8s-zone"]}]}
    
  7. 모든 노드의 토폴로지 레이블이 올바른 AZ 지역 및 영역을 반영하는지 확인합니다. 예를 들면 다음과 같습니다.

    kubectl get nodes --show-labels
    NAME            STATUS   ROLES                  AGE  VERSION   LABELS
    k8s-control-1   Ready    control-plane          1d   v1.21.1   topology.csi.vmware.com/k8s-region=region-1,topology.csi.vmware.com/k8s-zone=zone-A
    k8s-control-2   Ready    control-plane          1d   v1.21.1   topology.csi.vmware.com/k8s-region=region-1,topology.csi.vmware.com/k8s-zone=zone-B
    k8s-control-3   Ready    control-plane          1d   v1.21.1   topology.csi.vmware.com/k8s-region=region-1,topology.csi.vmware.com/k8s-zone=zone-C
    k8s-node-1      Ready    <none>                 1d   v1.21.1   topology.csi.vmware.com/k8s-region=region-1,topology.csi.vmware.com/k8s-zone=zone-A
    k8s-node-2      Ready    <none>                 1d   v1.21.1   topology.csi.vmware.com/k8s-region=region-1,topology.csi.vmware.com/k8s-zone=zone-B
    k8s-node-3      Ready    <none>                 1d   v1.21.1   topology.csi.vmware.com/k8s-region=region-1,topology.csi.vmware.com/k8s-zone=zone-B
    k8s-node-4      Ready    <none>                 1d   v1.21.1   topology.csi.vmware.com/k8s-region=region-1,topology.csi.vmware.com/k8s-zone=zone-C
    k8s-node-5      Ready    <none>                 1d   v1.21.1   topology.csi.vmware.com/k8s-region=region-2,topology.csi.vmware.com/k8s-zone=zone-D
    k8s-node-6      Ready    <none>                 1d   v1.21.1   topology.csi.vmware.com/k8s-region=region-2,topology.csi.vmware.com/k8s-zone=zone-D
    

가용성 영역 나열

tanzu mc az list 명령을 사용하여 독립형 관리 클러스터에 정의되거나 워크로드 클러스터에서 사용되는 AZ를 나열합니다.

  • 관리 클러스터 및 해당 워크로드 클러스터에서 현재 사용 중인 가용성 영역을 표시하려면:

    tanzu management-cluster available-zone list
    
  • 관리 클러스터에 정의되어 워크로드 클러스터 노드에 사용할 수 있는 모든 가용성 영역을 나열하려면 다음을 수행합니다.

    tanzu management-cluster available-zone list -a
    
  • 워크로드 클러스터 CLUSTER-NAME에서 현재 사용 중인 가용성 영역에 대해 다음을 수행합니다.

    tanzu management-cluster available-zone list -c CLUSTER-NAME:
    

tanzu mc az 명령은 tanzu management-cluster available-zone에서 별칭으로 지정됩니다.

출력 예:

AZNAME   ZONENAME  ZONETYPE    REGIONNAME REGIONTYPE DATASTORE   NETWORK   OWNERCLUSTER STATUS  
us-west-1a us-west-1a ComputeCluster us-west-1  Datacenter sharedVmfs-0 VM Network az-1     ready  
us-west-1b us-west-1b ComputeCluster us-west-1  Datacenter sharedVmfs-0 VM Network az-1     ready  
us-west-1c us-west-1c ComputeCluster us-west-1  Datacenter sharedVmfs-0 VM Network az-1     ready  

출력에 다음이 표시됩니다.

  • AZNAME, ZONENAME: AZ 이름
  • ZONETYPE: AZ, ComputeCluster 또는 HostGroup
  • REGIONNAME: AZ가 포함된 지역의 이름
  • REGIONTYPE: 지역으로 지정된 vSphere 개체, Datacenter 또는 ComputeCluster
  • DATASTORE: 지역에서 VM을 호스팅하는 데이터스토어
  • NETWORK: 지역에서 VM을 제공하는 네트워크
  • OWNERCLUSTER: AZ에서 실행되는 TKG 클러스터 또는 클러스터
  • STATUS: 현재 AZ 상태

tanzu mc az 명령 그룹은 tanzu management-cluster available-zone에서 별칭으로 지정됩니다.

가용성 영역 삭제

tanzu mc az delete 명령을 사용하여 사용되지 않은 AZ를 삭제합니다. 예를 들면 다음과 같습니다.

tanzu mc az delete AZNAME

여기서 AZNAMEtanzu mc az list에 나열된 AZ의 이름입니다.

AZ에 대해 OWNERCLUSTER가 나열되지 않은 tanzu mc az list에 의해 표시된 것처럼, 현재 TKG 클러스터 노드를 호스팅하지 않는 경우에만 AZ를 삭제할 수 있습니다.

check-circle-line exclamation-circle-line close-line
Scroll to top icon