eksctl 로 만들어지는 가용존(az) 설정과 결과가 다를 때

0

아래 코드를 실행해서 클러스트를 만듭니다.

eksctl create cluster -y cluster.yaml 

cluster.yaml 에는 아래 처럼 설정했고

managedNodeGroups:
  - name: workers
    instanceType: t3.medium
    privateNetworking: true
    minSize: 1
    maxSize: 3
    availabilityZones: ["ap-northeast-2a", "ap-northeast-2c"]

결과 로그에 보면 저는 a, c 존을 설정했지만, a,b,d 가 만들어집니다.

2024-01-15 12:06:57 [ℹ]  eksctl version 0.167.0
2024-01-15 12:06:57 [ℹ]  using region ap-northeast-2
2024-01-15 12:06:57 [ℹ]  setting availability zones to [ap-northeast-2d ap-northeast-2a ap-northeast-2b]
2024-01-15 12:06:57 [ℹ]  subnets for ap-northeast-2d - public:192.168.0.0/19 private:192.168.96.0/19
2024-01-15 12:06:57 [ℹ]  subnets for ap-northeast-2a - public:192.168.32.0/19 private:192.168.128.0/19
2024-01-15 12:06:57 [ℹ]  subnets for ap-northeast-2b - public:192.168.64.0/19 private:192.168.160.0/19
2024-01-15 12:06:57 [ℹ]  nodegroup "workers" will use "" [AmazonLinux2/1.27]
2024-01-15 12:06:57 [ℹ]  using Kubernetes version 1.27

그래서 cluster.yaml 파이을 다음과 같이 설정했더니 원하는대로 a,c 에 subnet이 만들어지는 것을 확인할 수 있었습니다.

availabilityZones: ["ap-northeast-2a", "ap-northeast-2c"]
managedNodeGroups:
  - name: workers
    instanceType: t3.medium
    privateNetworking: true
    minSize: 1
    maxSize: 3
    availabilityZones: ["ap-northeast-2a", "ap-northeast-2c"]

제가 알기로는 두개의 yaml 파일모두 이상없이 작성이 된 거 같은데, 왜 두번째 yaml 파일 설정에서만 가용존 설정이 제대로 실행이 되었을 까요?

eksctl info 는 아래와 같습니다.

eksctl version: 0.167.0
kubectl version: v1.28.2
OS: darwin
질문됨 3달 전228회 조회
1개 답변
1
수락된 답변

안녕하세요.

eksctl 및 'ClusterConfig' kind의 yaml 파일을 사용하여 Amazon EKS 클러스터를 생성할 때, 'availabilityZones' 키에 대하여 희망하시는 가용 영역 (Availability Zone)을 정의하셨음에도 불구 실제로 생성된 EKS 클러스터가 정의하신 내용과 다른 가용 영역을 사용하도록 정의되는 상황을 경험하셨습니다.

이에 'availabilityZones' 키 및 값 (가용 영역)을 'managedNodeGroups' 키 하위에만 정의하지 않고 상위 키에도 추가하시어 다시 eksctl 을 통해 EKS 클러스터 생성을 시도하신 바, 이번에는 정의하신 대로 EKS 클러스터의 가용 영역이 생성된 것을 확인하셨으며, 이 두 결과의 차이점에 대한 확인을 요청하신 것으로 이해하였습니다.

혹시 제가 'dataengineer' 사용자님께서 질문하신 내용과 다르게 이해하였다면 댓글 등의 방법으로 알려주세요.

'dataengineer' 사용자님의 질문에 대하여 우선 간략히 답변 드리자면, 'managedNodeGroups' 키 하위에 정의하신 'availabilityZones' 키의 값은 EKS 클러스터의 관리형 노드 그룹이 사용할 가용 영역을 정의하는 내용이며, 반대로 'managedNodeGroups' 위에 따로 정의하셨던 'availabilityZones' 키의 값은 EKS 클러스터가 구동될 VPC 환경 내 서브넷이 사용할 가용 영역을 정의하게 됩니다.

이해를 돕기 위해 두 yaml 파일의 내용을 eksctl이 처리한 결과를 함께 공유드리겠습니다.

아래 'dataengineer' 사용자님이 처음 공유해주신 것과 같은 yaml 파일을 사용하는 경우 eksctl이 자동으로 생성하는 정보는 아래와 같습니다:

  1. cluster.yaml 파일 내용
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
  name: CLUSTER_NAME
  region: ap-northeast-2
  version: "EKS_VERSION"

managedNodeGroups:
  - name: workers
    instanceType: t3.medium
    privateNetworking: true
    minSize: 1
    maxSize: 3
    availabilityZones: ["ap-northeast-2a", "ap-northeast-2c"]
  1. eksctl이 위 내용을 기반으로 자동 생성한 yaml 데이터
{
    "kind": "ClusterConfig",
    "apiVersion": "eksctl.io/v1alpha5",
    "metadata": {
        "name": "CLUSTER_NAME",
        "region": "ap-northeast-2",
        "version": "EKS_VERSION"
    },
    ...
    "vpc": {
        ...
        "subnets": {			<-- eksctl에서 자동으로 'ap-northeast-2b', 'ap-northeast-2c', 'ap-northeast-2d'를 사용하도록 정의
            "private": {
                "ap-northeast-2b": {
                    "az": "ap-northeast-2b",
                    "cidr": "192.168.96.0/19"
                },
                "ap-northeast-2c": {
                    "az": "ap-northeast-2c",
                    "cidr": "192.168.128.0/19"
                },
                "ap-northeast-2d": {
                    "az": "ap-northeast-2d",
                    "cidr": "192.168.160.0/19"
                }
            },
            "public": {
                "ap-northeast-2b": {
                    "az": "ap-northeast-2b",
                    "cidr": "192.168.0.0/19"
                },
                "ap-northeast-2c": {
                    "az": "ap-northeast-2c",
                    "cidr": "192.168.32.0/19"
                },
                "ap-northeast-2d": {
                    "az": "ap-northeast-2d",
                    "cidr": "192.168.64.0/19"
                }
            }
        },
        ...
    "managedNodeGroups": [
        {
            "name": "workers",
            "amiFamily": "AmazonLinux2",
            "instanceType": "t3.medium",
            "availabilityZones": [	<-- 'managedNodeGroups.availabilityZones' 키에 정의된 가용 영역인 'ap-northeast-2a', 'ap-northeast-2c'를 사용하도록 정의
                "ap-northeast-2a",
                "ap-northeast-2c"
            ],
            ...
    ],
    "availabilityZones": [		<-- eksctl에서 자동으로 'ap-northeast-2b', 'ap-northeast-2c', 'ap-northeast-2d'를 사용하도록 정의
        "ap-northeast-2b",
        "ap-northeast-2c",
        "ap-northeast-2d"
    ]
}

반면 'dataengineer' 사용자님이 두 번째로 공유해주신 (수정사항 반영) yaml 파일을 사용하는 경우 eksctl이 자동으로 생성하는 정보는 아래와 같습니다:

  1. cluster.yaml 파일 내용
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
  name: CLUSTER_NAME
  region: ap-northeast-2
  version: "EKS_VERSION"

availabilityZones: ["ap-northeast-2a", "ap-northeast-2c"]
managedNodeGroups:
  - name: workers
    instanceType: t3.medium
    privateNetworking: true
    minSize: 1
    maxSize: 3
    availabilityZones: ["ap-northeast-2a", "ap-northeast-2c"]
  1. eksctl이 위 내용을 기반으로 자동 생성한 yaml 데이터
{
    "kind": "ClusterConfig",
    "apiVersion": "eksctl.io/v1alpha5",
    "metadata": {
        "name": "CLUSTER_NAME",
        "region": "ap-northeast-2",
        "version": "EKS_VERSION"
    },
    ...
    "vpc": {
        ...
        "subnets": {			<-- 'ap-northeast-2a', 'ap-northeast-2c'를 사용하도록 정의
            "private": {
                "ap-northeast-2a": {
                    ...
                },
                "ap-northeast-2c": {
                    ...
                }
            },
            "public": {
                "ap-northeast-2a": {
                    ...
                },
                "ap-northeast-2c": {
                    ...
                }
            }
        },
        ...
    "managedNodeGroups": [
        {
            ...
            "availabilityZones": [	<-- 'ap-northeast-2a', 'ap-northeast-2c'를 사용하도록 정의
                "ap-northeast-2a",
                "ap-northeast-2c"
            ],
            ...
        }
    ],
    "availabilityZones": [		<-- 'ap-northeast-2a', 'ap-northeast-2c'를 사용하도록 정의
        "ap-northeast-2a",
        "ap-northeast-2c"
    ]
}

참고로, 위와 같이 eksctl이 처리한 yaml 내용은 아래와 같이 '--verbose' 플래그 (디버깅 레벨)를 조정하여 확인하실 수 있으니 희망하시는 경우 참고하시길 바랍니다.

$ eksctl create cluster -f cluster.yaml --verbose 5

이상 'dataengineer' 사용자님께서 질문주신 내용에 대하여 제가 답해드린 내용이 도움이 되기를 바랍니다.

감사합니다.

profile picture
전문가
답변함 3달 전
  • 그러면 결국 managedNodeGroup은 제가 정의 한 가용영역에 생성되는 것이 맞겠네요. 답변 감사합니다.

    managedNodeGroup 위에 az 값은 클러스터 내에서 사용할 수 있는 가용영역의 전체 범위를 정하는 것이다. 제가 이해한게 맞을까요?

    실례가 안된다면, EKS 에서 관리하는 Control Plane 은 어느 영역에서 생성이 되는지 여쭈어 봐도 될까요? 컨트롤 플레인 자체는 AWS가 자동으로 여러 가용 영역에 걸쳐 배포하고 관리한다고 저는 이해하고있고, 이를 따로 정할수는 없다고 알고있습니다.

  • 안녕하세요, 'dataengineer' 사용자님. 사용자님께서 이해하신 사실이 맞습니다.

    다시 한번 간단히 말씀드리면,

    1. 'managedNodeGroup' 키 하위의 'availabilityZones' 값은 말 그대로 관리형 노드 그룹 (해당 노드 그룹에 의해 생성될 워커 노드들)의 AZ를 정의하며,
    2. 'managedNodeGroup' 키와 같은 레벨의 독립적인 'availabilityZones' 값은 EKS 클러스터가 배포될 VPC의 AZ를 정의합니다.

    이어서 EKS 클러스터의 CP (Control Plane)에 관한 내용은 AWS의 정책에 의해 자세히 답변드리기가 어렵습니다만, 사용자님의 EKS 클러스터에서 사용하도록 정의된 AZ를 모두 불편함 없이 활용하실 수 있도록 AWS에서 자동으로 관리되고 있음을 알려드립니다.

로그인하지 않았습니다. 로그인해야 답변을 게시할 수 있습니다.

좋은 답변은 질문에 명확하게 답하고 건설적인 피드백을 제공하며 질문자의 전문적인 성장을 장려합니다.

질문 답변하기에 대한 가이드라인