커스텀 사용자 클러스터 만들기

이 주제에서는 AWS용 Anthos 클러스터(GKE on AWS)사용자 클러스터의 구성을 맞춤설정하는 방법을 설명합니다.

다음과 같은 이유로 커스텀 사용자 클러스터를 만들고자 합니다.

  • 스테이징 또는 테스트 환경을 위한 다른 클러스터 만들기
  • 머신 유형이 다른 노드 풀 추가
  • 특정 AWS 가용성 영역(AZ)에서 클러스터 만들기

시작하기 전에

AWS용 Anthos 클러스터를 사용하기 전에 다음 작업을 수행했는지 확인합니다.

  • 관리 서비스를 설치합니다.

  • terraform output example_cluster를 사용하지 않고 클러스터를 만들려면 제어 영역에 비공개 AWS 서브넷이 있어야 합니다. 각 서브넷은 동일한 AWS 리전에서 다른 AZ에 속해야 합니다. 경로 테이블은 비공개 서브넷 간의 트래픽을 허용하도록 구성해야 하며 각 서브넷에는 NAT 게이트웨이에 대한 액세스 권한이 있어야 합니다.

  • AWS Virtual Private Cloud(VPC) ID를 가지고 있어야 합니다. VPC ID는 vpc-012345678abcde와 같습니다. AWS 콘솔에서 VPC ID를 찾을 수 있습니다.

AWS용 Anthos 클러스터 리소스에 연결하려면 다음 단계를 수행하세요. 기존 AWS VPC가 있거나 VPC에 직접 연결되어 있는지 또는 관리 서비스를 만들 때 전용 VPC를 만들었는지 선택합니다.

기존 VPC

기존 VPC에 직접 또는 VPN으로 연결된 경우 이 주제의 명령어에서 env HTTP_PROXY=http://localhost:8118 줄을 생략합니다.

전용 VPC

전용 VPC에서 관리 서비스를 만들면 AWS용 Anthos 클러스터 공개 서브넷에 배스천 호스트가 포함됩니다.

관리 서비스에 연결하려면 다음 단계를 수행하세요.

  1. AWS용 Anthos 클러스터 구성이 있는 디렉터리로 변경합니다. 이 디렉터리는 관리 서비스를 설치할 때 생성됩니다.

    cd anthos-aws

  2. bastion-tunnel.sh 스크립트를 실행하여 터널을 엽니다. 터널이 localhost:8118로 연결됩니다.

    배스천 호스트에 대한 터널을 열려면 다음 명령어를 실행합니다.

    ./bastion-tunnel.sh -N
    

    SSH 터널의 메시지가 이 창에 표시됩니다. 연결을 종료할 준비가 되면 Control+C를 사용하거나 창을 닫아 프로세스를 중지합니다.

  3. 새 터미널을 열고 anthos-aws 디렉터리로 변경합니다.

    cd anthos-aws
  4. kubectl을 사용하여 클러스터에 연결할 수 있는지 확인합니다.

    env HTTPS_PROXY=http://localhost:8118 \
    kubectl cluster-info
    

    출력에는 관리 서비스 API 서버의 URL이 포함됩니다.

제어 영역 인스턴스 크기 선택

AWS용 Anthos 클러스터는 크기 조절 제어 영역 인스턴스를 지원하지 않습니다. 사용자 클러스터를 만들기 전에 제어 영역의 인스턴스 크기를 선택합니다. 제어 영역 크기는 클러스터의 노드 수에 따라 다릅니다. 다음 표에는 다양한 클러스터 크기에 권장되는 제어 영역 인스턴스 크기가 나와 있습니다.

클러스터 크기(노드) 제어 영역 인스턴스 유형
1~10 m5.large
11~100 m5.xlarge
101~200 m5.2xlarge

커스텀 구성으로 새 클러스터 만들기

terraform output example_cluster를 사용하여 관리자 클러스터당 하나의 사용자 클러스터에 대한 구성을 만들 수 있습니다. 추가 클러스터를 만들려면 커스텀 구성을 적용해야 합니다.

이 예시에서는 AWSClusterAWSNodePool CRD에서 수동으로 클러스터를 만듭니다.

  1. AWS용 Anthos 클러스터 구성이 있는 디렉터리로 변경합니다. 이 디렉터리는 관리 서비스를 설치할 때 생성됩니다.

    cd anthos-aws

  2. anthos-aws 디렉터리에서 anthos-gke를 사용하여 컨텍스트를 관리 서비스로 전환합니다.

    cd anthos-aws
    anthos-gke aws management get-credentials

  3. 텍스트 편집기를 열고 다음 AWSCluster 정의를 custom-cluster.yaml이라는 파일에 복사합니다.

    apiVersion: multicloud.cluster.gke.io/v1
    kind: AWSCluster
    metadata:
      name: CLUSTER_NAME
    spec:
      region: AWS_REGION
      networking:
        vpcID: VPC_ID
        podAddressCIDRBlocks: POD_ADDRESS_CIDR_BLOCKS
        serviceAddressCIDRBlocks: SERVICE_ADDRESS_CIDR_BLOCKS
        ServiceLoadBalancerSubnetIDs: SERVICE_LOAD_BALANCER_SUBNETS
      controlPlane:
        version:  CLUSTER_VERSION # Latest version is 1.25.5-gke.2100
        instanceType: AWS_INSTANCE_TYPE
        keyName: SSH_KEY_NAME
        subnetIDs:
        - CONTROL_PLANE_SUBNET_IDS
        securityGroupIDs:
        - CONTROL_PLANE_SECURITY_GROUPS
        iamInstanceProfile: CONTROL_PLANE_IAM_ROLE
        rootVolume:
          sizeGiB: ROOT_VOLUME_SIZE
          volumeType: ROOT_VOLUME_TYPE # Optional
          iops: ROOT_VOLUME_IOPS # Optional
          kmsKeyARN: ROOT_VOLUME_KEY # Optional
        etcd:
          mainVolume:
            sizeGiB: ETCD_VOLUME_SIZE
            volumeType: ETCD_VOLUME_TYPE # Optional
            iops: ETCD_VOLUME_IOPS # Optional
            kmsKeyARN: ETCD_VOLUME_KEY # Optional
        databaseEncryption:
          kmsKeyARN: ARN_OF_KMS_KEY
        hub: # Optional
          membershipName: ANTHOS_CONNECT_NAME
        cloudOperations: # Optional
          projectID: YOUR_PROJECT
          location: GCP_REGION
          enableLogging: ENABLE_LOGGING
          enableMonitoring: ENABLE_MONITORING
        workloadIdentity: # Optional
          oidcDiscoveryGCSBucket: WORKLOAD_IDENTITY_BUCKET
    

    다음을 바꿉니다.

    • CLUSTER_NAME: 클러스터 이름입니다.
    • AWS_REGION: 클러스터가 실행되는 AWS 리전입니다.

    • VPC_ID: 클러스터가 실행되는 VPC의 ID입니다.

    • POD_ADDRESS_CIDR_BLOCKS: 클러스터 pod에서 사용되는 IPv4 주소 범위입니다. 현재 단일 범위만 지원됩니다. 범위는 네트워크에서 연결할 수 있는 서브넷과 겹치지 않아야 합니다. 여러 다른 AWSCluster 객체에 같은 범위를 사용하는 것이 안전합니다. 예를 들면 10.2.0.0/16입니다.

    • SERVICE_ADDRESS_CIDR_BLOCKS: 클러스터 서비스에서 사용하는 IPv4 주소의 범위로 바꿉니다. 현재 단일 범위만 지원됩니다. 범위는 네트워크에서 연결할 수 있는 서브넷과 겹치지 않아야 합니다. 여러 다른 AWSCluster 객체에 같은 범위를 사용하는 것이 안전합니다. 예를 들면 10.1.0.0/16입니다.

    • SERVICE_LOAD_BALANCER_SUBNETS: AWS용 Anthos 클러스터가 공개 또는 비공개 부하 분산기를 만들 수 있는 서브넷 ID입니다.

    • CLUSTER_VERSION: AWS용 Anthos 클러스터에서 지원하는 Kubernetes 버전입니다. 최신 버전은 1.25.5-gke.2100입니다.

    • AWS_INSTANCE_TYPE: 지원되는 EC2 인스턴스 유형입니다.

    • SSH_KEY_NAME: AWS EC2 키 쌍입니다.

    • CONTROL_PLANE_SUBNET_IDS: 제어 영역 인스턴스가 실행될 AZ의 서브넷 ID입니다.

    • CONTROL_PLANE_SECURITY_GROUPS: 관리 서비스 설치 중에 생성된 securityGroupID입니다. 제어 영역에 연결하는 데 필요한 securityGroupID를 추가하여 이를 맞춤설정할 수 있습니다.

    • CONTROL_PLANE_IAM_PROFILE: 제어 영역 복제본에 할당된 AWS EC2 인스턴스 프로필의 이름입니다.

    • ROOT_VOLUME_SIZE: 제어 영역 루트 볼륨의 크기(기비바이트)입니다.

    • EBS 볼륨 유형이 있는 ROOT_VOLUME_TYPE입니다. 예를 들면 gp3입니다.

    • 볼륨에 대해 초당 프로비저닝된 IO 작업량(IOPS)이 있는 ROOT_VOLUME_IOPS입니다. volumeTypeGP3일 때만 유효합니다. 자세한 내용은 범용 SSD 볼륨(gp3)을 참조하세요.

    • 제어 영역 인스턴스 루트 볼륨을 암호화하는 AWS KMS 키의 Amazon 리소스 이름이 있는 ROOT_VOLUME_KEY입니다.

    • ETCD_VOLUME_SIZE: etcd에서 사용하는 볼륨의 크기입니다.

    • EBS 볼륨 유형이 있는 ETCD_VOLUME_TYPE입니다. 예를 들면 gp3입니다.

    • 볼륨에 대해 초당 프로비저닝된 IO 작업량(IOPS)이 있는 ETCD_VOLUME_IOPS입니다. volumeTypegp3일 때만 유효합니다. 자세한 내용은 범용 SSD 볼륨(gp3)을 참조하세요.

    • 제어 영역 etcd 데이터 볼륨을 암호화하는 AWS KMS 키의 Amazon 리소스 이름이 있는 ETCD_VOLUME_KEY입니다.

    • ARN_OF_KMS_KEY: 클러스터 보안 비밀을 암호화하는 데 사용되는 AWS KMS 키입니다.

    • ANTHOS_CONNECT_NAME: 클러스터를 등록하는 데 사용된 Connect 멤버십 이름입니다. 멤버십 이름은 고유해야 합니다. 예를 들면 projects/YOUR_PROJECT/locations/global/memberships/CLUSTER_NAME입니다. 여기서 YOUR_PROJECT는 Google Cloud 프로젝트이고 CLUSTER_NAME는 프로젝트의 고유한 이름입니다. 이 필드는 선택사항입니다.

    • YOUR_PROJECT: 프로젝트 ID입니다.

    • GCP_REGION: 로그를 저장할 Google Cloud 리전입니다. AWS 리전과 가까운 리전을 선택합니다. 자세한 내용은 글로벌 위치 - 리전 및 영역을 참조하세요. 예를 들면 us-central1입니다.

    • ENABLE_LOGGING: true 또는 false(제어 영역 노드에서 Cloud Logging 사용 설정 여부)

    • ENABLE_MONITORING: true 또는 false(제어 영역 노드에서 Cloud Monitoring 사용 설정 여부)

    • WORKLOAD_IDENTITY_BUCKET: 워크로드 아이덴티티 검색 정보가 포함된 Cloud Storage 버킷 이름입니다. 이 필드는 선택사항입니다.

  4. 클러스터에 하나 이상의 AWSNodePool을 만듭니다. 텍스트 편집기를 열고 다음 AWSCluster 정의를 custom-nodepools.yaml이라는 파일에 복사합니다.

    apiVersion: multicloud.cluster.gke.io/v1
    kind: AWSNodePool
    metadata:
      name: NODE_POOL_NAME
    spec:
      clusterName: AWSCLUSTER_NAME
      version:  CLUSTER_VERSION # latest version is 1.25.5-gke.2100
      region: AWS_REGION
      subnetID: AWS_SUBNET_ID
      minNodeCount: MINIMUM_NODE_COUNT
      maxNodeCount: MAXIMUM_NODE_COUNT
      maxPodsPerNode: MAXIMUM_PODS_PER_NODE_COUNT
      instanceType: AWS_NODE_TYPE
      keyName: KMS_KEY_PAIR_NAME
      iamInstanceProfile: NODE_IAM_PROFILE
      proxySecretName: PROXY_SECRET_NAME
      rootVolume:
        sizeGiB: ROOT_VOLUME_SIZE
        volumeType: VOLUME_TYPE # Optional
        iops: IOPS # Optional
        kmsKeyARN: NODE_VOLUME_KEY # Optional
    

    다음을 바꿉니다.

    • NODE_POOL_NAME: AWSNodePool의 고유한 이름입니다.
    • AWSCLUSTER_NAME: AWSCluster의 이름입니다. 예를 들면 staging-cluster입니다.
    • CLUSTER_VERSION: AWS Kubernetes용 Anthos 클러스터가 지원되는 버전입니다.
    • AWS_REGION: AWSCluster와 동일한 AWS 리전입니다.
    • AWS_SUBNET_ID: AWSCluster와 동일한 리전의 AWS 서브넷입니다.
    • MINIMUM_NODE_COUNT: 노드 풀의 최소 노드 수입니다. 자세한 내용은 사용자 클러스터 확장을 참조하세요.
    • MAXIMUM_NODE_COUNT: 노드 풀의 최대 노드 수입니다.
    • MAXIMUM_PODS_PER_NODE_COUNT: AWS용 Anthos 클러스터가 노드에 할당할 수 있는 최대 pod 수입니다.
    • AWS_NODE_TYPE: AWS EC2 인스턴스 유형입니다.
    • KMS_KEY_PAIR_NAME: 각 노드 풀 작업자에 할당된 AWS KMS 키 쌍입니다.
    • NODE_IAM_PROFILE: 풀의 노드에 할당된 AWS EC2 인스턴스 프로필의 이름입니다.
    • ROOT_VOLUME_SIZE: 제어 영역 루트 볼륨의 크기(기비바이트)입니다.
    • VOLUME_TYPE: 노드의 AWS EBS 볼륨 유형입니다. 예를 들면 gp3입니다.
    • IOPS: 볼륨에 대해 초당 프로비저닝된 IO 작업량 (IOPS) 입니다. volumeTypegp3일 때만 유효합니다.
    • NODE_VOLUME_KEY: 볼륨을 암호화하는 데 사용되는 AWS KMS 키의 ARN입니다. 자세한 내용은 고객 관리 CMK를 사용하여 볼륨 암호화를 참조하세요.
  5. 관리 서비스에 매니페스트를 적용합니다.

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl apply -f custom-cluster.yaml
    env HTTPS_PROXY=http://localhost:8118 \
      kubectl apply -f custom-nodepools.yaml
    

kubeconfig 만들기

사용자 클러스터를 시작할 때 새 사용자 클러스터의 kubeconfig 컨텍스트를 만들 수 있습니다. 컨텍스트를 사용하여 사용자 또는 관리자 클러스터에 인증합니다.

  1. anthos-gke aws clusters get-credentials를 사용하여 ~/.kube/config의 사용자 클러스터에 대한 kubeconfig를 생성합니다.

    env HTTPS_PROXY=http://localhost:8118 \
      anthos-gke aws clusters get-credentials CLUSTER_NAME
    

    CLUSTER_NAME을 클러스터 이름으로 바꿉니다. 예를 들면 cluster-0입니다.

  2. kubectl을 사용하여 새 사용자 클러스터를 인증합니다.

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl cluster-info
    

    클러스터가 준비되면 클러스터에 있는 Kubernetes 구성요소에 대한 URL이 반환됩니다.

클러스터 상태 보기

AWSCluster 또는 AWSNodePool을 적용할 때 관리 서비스가 AWS 리소스를 프로비저닝합니다.

  1. anthos-aws 디렉터리에서 anthos-gke를 사용하여 컨텍스트를 관리 서비스로 전환합니다.

    cd anthos-aws
    anthos-gke aws management get-credentials

  2. 클러스터를 나열하려면 kubectl get AWSClusters를 사용합니다.

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl get AWSClusters
    

    결과에는 각 클러스터의 이름, 상태, 사용 기간, 버전, 엔드포인트가 포함됩니다.

    예를 들어 다음 결과에는 cluster-0이라는 AWSCluster가 하나 포함되어 있습니다.

    NAME        STATE          AGE     VERSION         ENDPOINT
    cluster-0   Provisioning   2m41s   1.25.5-gke.2100   gke-xyz.elb.us-east-1.amazonaws.com
    

클러스터 이벤트 보기

사용자 클러스터에서 최근의 Kubernetes 이벤트를 보려면 kubectl get events를 사용합니다.

  1. anthos-aws 디렉터리에서 anthos-gke를 사용하여 컨텍스트를 관리 서비스로 전환합니다.

    cd anthos-aws
    anthos-gke aws management get-credentials

  2. kubectl get events를 실행합니다.

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl get events
    

출력에는 관리 서비스의 정보, 경고, 오류가 포함됩니다.

사용자 클러스터 삭제

사용자 클러스터를 삭제하려면 다음 단계를 수행하세요.

  1. anthos-aws 디렉터리에서 anthos-gke를 사용하여 컨텍스트를 관리 서비스로 전환합니다.

    cd anthos-aws
    anthos-gke aws management get-credentials

  2. kubectl delete를 사용하여 사용자 클러스터가 포함된 매니페스트를 삭제합니다.

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl delete -f CLUSTER_FILE
    

    CLUSTER_FILE을 AWScluster 및 AWSNodePool 객체가 포함된 매니페스트의 이름으로 바꿉니다. 예를 들면 cluster-0.yaml입니다.

모든 사용자 클러스터 삭제

모든 사용자 클러스터를 삭제하려면 다음 단계를 수행하세요.

  1. anthos-aws 디렉터리에서 anthos-gke를 사용하여 컨텍스트를 관리 서비스로 전환합니다.

    cd anthos-aws
    anthos-gke aws management get-credentials

  2. kubectl delete를 사용하여 관리 서비스에서 AWSNodePool 및 AWSCluster를 삭제합니다.

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl delete AWSNodePool --all
    env HTTPS_PROXY=http://localhost:8118 \
      kubectl delete AWSCluster --all
    

자세한 내용은 AWS용 Anthos 클러스터 제거를 참조하세요.

다음 단계