출처: 인프런, Ongja_CloudNet@, ⌜CloudNet@와 함께하는 Amazon EKS 기본 강의⌟
다양한 옵션을 정의해야 하지만 eksctl 명령만으로도 손쉽게 클러스터를 생성하거나 삭제가 가능하다.
myeks-host에서 eksctl create cluster 형태의 명령어 수행 시 EKS 클러스터를 생성하는 작업을 진행한다.
옵션에 따라 다르지만, 명령어 한번에 EKS 클러스터 생성과 노드 그룹까지 생성할 수도 있다.
eksctl create cluster 명령으로 EKS 클러스터를 생성하기 위한 IAM 역할을 만든 뒤 Control Plane을 구성하며 Kubeconfig 정보를 업데이트 한다.
EKS 노드 그룹 생성을 위한 IAM 역할을 만들어 노드 그룹 구성까지 한 번에 진행할 수 있다.
eksctl이 EKS 클러스터 생성을 위한 다양한 자원을 동적으로 만들 수 있는 이유는 CloudFormation을 활용하기 때문이다.
요청에 의해 CloudFormation 스택을 생성하고 스택에 정의된 자원을 동적으로 생성하게 된다.
즉, EKS 클러스터 IAM 역할과 노드 IAM 역할이 생성되고 EKS 클러스터를 구성하는 Control Plane과 노드 그룹이 동적으로 생성된다.
myeks-host에 kubeconfig 정보를 동적으로 업데이트하여 kubectl 명령도 수행할 수 있게 처리된다.
curl -sL "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_Linux_amd64.tar.gz" | tar xz -C /tmp
sudo mv /tmp/eksctl /usr/local/bin
eksctl version
curl -sL "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_Linux_amd64.tar.gz" | tar xz -C /tmp
최신 버전의 eksctl 압축 파일을 GitHub에서 다운로드하고, 바로 /tmp 디렉터리에 압축을 푸는 작업을 수행한다.
curl
파일을 다운로드할 때 사용하는 명령어.
-s
출력 메시지를 숨기고 조용히(silent) 다운로드하는 옵션.
-L
URL이 리다이렉트될 경우, 최종 위치까지 따라가서 다운로드하도록 하는 옵션.
| (파이프 연산자)
이 연산자는 앞의 curl 명령어의 출력을 다음 명령어인 tar로 전달하는 역할을 한다. 즉, 다운로드된 압축 파일을 tar로 직접 전달한다.
tar
압축 파일을 다루는 명령어로, 파일의 압축을 풀거나 묶을 때 사용한다.
xz
tar의 옵션으로, x는 압축을 푼다는 의미(Extract), z는 gzip 형식의 압축을 해제한다는 뜻이다.
-C /tmp
압축을 풀 때 결과 파일을 /tmp 디렉터리에 저장하라는 의미다. /tmp는 임시 디렉터리로, 사용자가 임시로 파일을 보관할 때 자주 쓰는 위치다.
sudo mv /tmp/eksctl /usr/local/bin
eksctl 바이너리를 시스템이 실행 가능한 경로에 옮기는 명령어이다.
/usr/local/bin은 리눅스 시스템에서 실행 파일들을 저장하는 디렉터리 중 하나로, 사용자가 명령어를 입력할 때 자동으로 검색되는 경로다. 해당 경로에 파일을 옮겨야 명령어를 어디서든 쉽게 실행할 수 있다.
일반 사용자 권한으로는 파일을 옮길 수 없기 때문에, sudo를 사용해서 관리자 권한으로 파일을 이동해야 한다.
echo $AWS_DEFAULT_REGION
echo $CLUSTER_NAME
echo $VPCID
echo $PubSubnet1
echo $PubSubnet2
// eksctl 명령어 확인
eksctl
// eksctl create 명령어
eksctl create
// eksctl create cluster or nodegroup 명령어 (--help)
eksctl create cluster -h
eksctl create nodegroup -h
// 지원하는 Kubernetes 버전 정보
eksctl create cluster -h | grep version
EKS 클러스터 기본 생성 확인 명령어
eksctl create cluster \
--name $CLUSTER_NAME \
--region=$AWS_DEFAULT_REGION \
--dry-run | yh
--dry-run 명령어를 통해 실제 클러스터를 생성하지 않고, 생성할 때 사용될 설정을 yh를 통해 YAML 형식으로 출력하여 확인할 수 있다.
노드 그룹을 제외한 EKS 클러스터 생성 확인 명령어
eksctl create cluster \
--name $CLUSTER_NAME \
--region=$AWS_DEFAULT_REGION \
--without-nodegroup \
--dry-run | yh
환경 변수로 지정된 클러스터 이름과 리전 정보를 사용하여 노드 그룹 없이 EKS 클러스터를 생성할 준비를 하고, 실제로 생성하지 않고 어떤 작업이 수행될지를 확인하는 명령어이다.(--dry-run 옵션 사용시 실제 자원을 생성하지 않고 생성될 자원을 출력한다.)
노드 그룹을 제외하고 가용 영역 2a, 2c에 EKS 클러스터 생성 확인 명령어
eksctl create cluster \
--name $CLUSTER_NAME \
--region=$AWS_DEFAULT_REGION \
--without-nodegroup \
--zones=ap-northeast-2a,ap-northeast-2c \
--dry-run | yh
노드 그룹을 포함하여 EKS 클러스터 생성 확인 명령어
eksctl create cluster \
--name $CLUSTER_NAME \
--region=$AWS_DEFAULT_REGION \
--nodegroup-name=$CLUSTER_NAME-nodegroup \
--node-type=t3.medium \
--node-volume-size=30 \
--zones=ap-northeast-2a,ap-northeast-2c \
--vpc-cidr=172.20.0.0/16 \
--ssh-access \
--dry-run | yh
서울 리전의 특정 가용 영역(ap-northeast-2a 및 ap-northeast-2c)에 t3.medium 인스턴스 타입과 30GB 볼륨을 갖춘 노드 그룹이 포함된 EKS 클러스터를 생성하는 명령어이다.
eksctl create cluster \
--name $CLUSTER_NAME \
--region=$AWS_DEFAULT_REGION \
--nodegroup-name=$CLUSTER_NAME-nodegroup \
--node-type=t3.medium \
--node-volume-size=30 \
--vpc-public-subnets "$PubSubnet1,$PubSubnet2" \
--version 1.26 \
--ssh-access \
--external-dns-access \
--dry-run | yh
클러스터 이름과 리전을 지정하고, t3.medium 인스턴스 타입의 노드 그룹을 생성하며, 각 노드에 30GB의 볼륨을 할당한다.
클러스터는 지정된 퍼블릭 서브넷($PubSubnet1, $PubSubnet2)에서 배포되며, Kubernetes 버전 1.26을 사용한다.
또한, SSH 접근과 외부 DNS 접근을 허용하도록 설정합니다. --dry-run 옵션을 사용해 실제 클러스터 생성 없이 설정 내용을 미리 확인하며, 이 설정 결과를 YAML 형식으로 yq를 통해 가독성 있게 출력한다.
eksctl create cluster \
--name $CLUSTER_NAME \
--region=$AWS_DEFAULT_REGION \
--nodegroup-name=$CLUSTER_NAME-nodegroup \
--node-type=t3.medium \
--node-volume-size=30 \
--vpc-public-subnets "$PubSubnet1,$PubSubnet2" \
--version 1.26 \
--ssh-access \
--external-dns-access \
--verbose 4
verbose 옵션은 eksctl 명령어에서 실행 중에 출력되는 로그의 상세 수준을 제어하는 데 사용된다.
--verbose 0: 거의 로그를 출력하지 않으며, 기본적인 오류와 중요한 메시지만 표시된다.
--verbose 1: 일반적인 정보 메시지가 포함되며, 일반적인 사용에 적합하다.
--verbose 2: 추가적인 디버그 정보가 출력된다.
--verbose 3: 더 상세한 디버그 정보와 더 많은 내부 처리 과정을 볼 수 있다.
--verbose 4: 가장 상세한 로그가 출력되며, 명령어의 내부 동작을 모두 볼 수 있다. 모든 HTTP 요청, API 호출, 내부 상태 등이 포함된다.
출처: 인프런, Ongja_CloudNet@, ⌜CloudNet@와 함께하는 Amazon EKS 기본 강의⌟
EKS 클러스터 IAM과 EKS 노드 IAM이 연결되어 자격 증명을 수행한다.
AWS 관리형 VPC에 Control Plane 자원이 생성되고, myeks-VPC에 워커 노드가 구성된다.
eksctl 명령으로 서브넷은 서로 다른 가용 영역의 퍼블릭 서브넷 2개만 지정되었다.
워커 노드는 2개의 가용 영역에 퍼블릭 서브넷에만 구성되고, 이에 따라 Control Plane은 2개의 가용 영역에서만 생성된다.
클러스터 엔드포인트 액세스는 별도로 설정하지 않아 기본 값인 퍼블릭으로 구성된다.
이에 따라 myeks-host는 인터넷을 통해 API 서버와 통신할 수 있다.
API 서버와 워커 노드 간의 통신을 위해 EKS-owned ENI가 구성된다.