이 글은 CloudNet@팀의 AWS EKS Workshop Study(AEWS) 3기 스터디 내용을 바탕으로 작성되었습니다.
AEWS는 CloudNet@의 '가시다'님께서 진행하는 스터디로, EKS를 학습하는 과정입니다.
EKS를 깊이 있게 이해할 기회를 주시고, 소중한 지식을 나눠주시는 가시다님께 다시 한번 감사드립니다.
이 글이 EKS를 학습하는 분들께 도움이 되길 바랍니다.
📌 특징:
🔗 관련 자료
📌 주요 도구 비교:
| 도구 | 특징 |
|---|---|
| AWS CloudFormation | AWS 네이티브 IaC 도구, YAML/JSON으로 인프라 관리 |
| AWS CDK | TypeScript, Python, Java 등으로 인프라를 코드화 |
| Terraform | 멀티 클라우드 지원, HashiCorp에서 제공하는 강력한 IaC 도구 |
🔗 관련 자료: Terraform을 활용한 EKS 배포

EKS를 배포하기 위한 VPC, 서브넷, 작업용 EC2 등을 배포합니다. EKS 클러스터를 배포하기 전 수행해야 할 필수 작업입니다.




→ VPC, InternetGateway, 서브넷(Public, Private 각 2개씩), 보안그룹, EC2 1개(bastion)가 생성됩니다.
✅ AWS CLI를 사용하여 배포할 경우
// yaml 파일 다운로드 $ curl -O https://s3.ap-northeast-2.amazonaws.com/cloudformation.cloudneta.net/K8S/myeks-1week.yaml // 배포 $ aws cloudformation deploy --template-file ~/Downloads/myeks-1week.yaml --stack-name mykops --parameter-overrides KeyName=<My SSH Keyname> SgIngressSshCidr=<My Home Public IP Address>/32 --region <리전> 예시) $ aws cloudformation deploy --template-file ~/Downloads/myeks-1week.yaml \ --stack-name myeks --parameter-overrides KeyName=kp-gasida SgIngressSshCidr=$(curl -s ipinfo.io/ip)/32 --region ap-northeast-2
🔹 EC2 인스턴스의 퍼블릭 IP 확인


aws cloudformation describe-stacks --stack-name myeks \
--query 'Stacks[*].Outputs[*].OutputValue' --output text📌 출력:
🔹 SSH 접속
ssh root@3.35.137.31
또는 AWS CLI를 활용하여 자동으로 접속
ssh root@$(aws cloudformation describe-stacks --stack-name myeks \
--query 'Stacks[*].Outputs[0].OutputValue' --output text)
📌 출력:

SSH로 EC2에 접속한 후, 기본적인 환경이 올바르게 설정되었는지 확인합니다.
🔹 Cloud-Init 실행 로그 확인 (옵션)
CloudFormation을 통해 배포된 EC2에서는 cloud-init이 실행되며, 초기 설정을 수행합니다.
tail -f /var/log/cloud-init-output.log

이 로그를 통해 설치 과정에서 발생한 오류를 확인할 수 있습니다.
🔹 현재 사용자 확인
whoami
📌 출력:

🔹 필수 도구 및 SSH 키 파일 확인
배포 환경에서 필요한 kubectl, eksctl, aws-cli, SSH 키 파일이 정상적으로 설치되었는지 확인합니다.
kubectl version --client=true -o yaml
eksctl version
aws --version
ls /root/.ssh/id_rsa*
📌 출력:

🔹 도커 엔진 설치 확인
docker info
설치가 되어 있어야 EKS 노드 구성이 정상적으로 진행됩니다.
📌 출력:

EKS 리소스를 배포하고 관리하려면 IAM 사용자 권한을 올바르게 설정해야 합니다.
🔹 현재 IAM 권한으로 EC2 인스턴스 정보 조회
IAM 자격 증명이 설정되지 않은 상태에서 EC2 인스턴스 정보를 조회하려고 하면 실패합니다.
aws ec2 describe-instances
📌 권한이 없으면 아래와 같은 에러가 발생:
An error occurred (UnauthorizedOperation) when calling the DescribeInstances operation:
You are not authorized to perform this operation.

🔹 IAM User 자격 구성
EKS 배포를 위해 administrator 권한을 가진 IAM User의 자격 증명을 설정해야 합니다. 액세스 키가 없으면 생성합니다.
aws configure
📌 출력:

액세스 키 생성 방법
- 웹 콘솔 > IAM > 액세스 관리 > 사용자 > 보안 자격 증명 > 액세스 키 > 액세스 키 만들기
🔹 IAM 설정 적용 확인
aws ec2 describe-instances
정상적으로 출력되면 IAM 자격 증명 설정 완료
📌 출력:

EKS는 VPC 내부에 배포되므로, 적절한 VPC 및 서브넷 설정이 필요합니다.
다음 명령어를 사용하여 EKS 배포할 VPC 및 서브넷 정보를 확인합니다.
🔹 EKS 배포할 VPC 정보 확인
aws ec2 describe-vpcs --filters "Name=tag:Name,Values=$CLUSTER_NAME-VPC" | jq
📌 출력:

🔹 VPC ID를 환경 변수로 저장
export VPCID=$(aws ec2 describe-vpcs --filters "Name=tag:Name,Values=$CLUSTER_NAME-VPC" | jq -r .Vpcs[].VpcId)
echo "export VPCID=$VPCID" >> /etc/profile
echo $VPCID
📌 출력:

🔹 VPC 내 Subnet 정보 확인
aws ec2 describe-subnets --filters "Name=vpc-id,Values=$VPCID" --output json | jq
aws ec2 describe-subnets --filters "Name=vpc-id,Values=$VPCID" --output yaml
📌 출력:


🔹 퍼블릭 서브넷 ID 확인
aws ec2 describe-subnets --filters Name=tag:Name,Values="$CLUSTER_NAME-PublicSubnet1" --query "Subnets[0].[SubnetId]" --output text
aws ec2 describe-subnets --filters Name=tag:Name,Values="$CLUSTER_NAME-PublicSubnet2" --query "Subnets[0].[SubnetId]" --output text
🔹 퍼블릭 서브넷 ID를 환경 변수로 저장
export PubSubnet1=$(aws ec2 describe-subnets --filters Name=tag:Name,Values="$CLUSTER_NAME-PublicSubnet1" --query "Subnets[0].[SubnetId]" --output text)
export PubSubnet2=$(aws ec2 describe-subnets --filters Name=tag:Name,Values="$CLUSTER_NAME-PublicSubnet2" --query "Subnets[0].[SubnetId]" --output text)
echo "export PubSubnet1=$PubSubnet1" >> /etc/profile
echo "export PubSubnet2=$PubSubnet2" >> /etc/profile
echo $PubSubnet1
echo $PubSubnet2
📌 출력:

EKS는 네트워크, 스토리지, 보안, 모니터링 등을 지원하는 Add-on을 제공하며, Kubernetes 버전에 따라 지원 가능한 Add-on 버전이 다릅니다.
따라서 EKS를 운영할 때는 최신 Kubernetes 버전보다는 두세 버전 아래 단계의 안정적인 Kubernetes 버전을 선택하는 것이 권장됩니다.
📌 이유:
🔹 특정 Kubernetes 버전에서 사용 가능한 Add-on 확인
aws eks describe-addon-versions --kubernetes-version 1.32 --query 'addons[].{MarketplaceProductUrl: marketplaceInformation.productUrl, Name: addonName, Owner: owner Publisher: publisher, Type: type}' --output table
aws eks describe-addon-versions --kubernetes-version 1.31 --query 'addons[].{MarketplaceProductUrl: marketplaceInformation.productUrl, Name: addonName, Owner: owner Publisher: publisher, Type: type}' --output table
aws eks describe-addon-versions --kubernetes-version 1.30 --query 'addons[].{MarketplaceProductUrl: marketplaceInformation.productUrl, Name: addonName, Owner: owner Publisher: publisher, Type: type}' --output table
aws eks describe-addon-versions --kubernetes-version 1.29 --query 'addons[].{MarketplaceProductUrl: marketplaceInformation.productUrl, Name: addonName, Owner: owner Publisher: publisher, Type: type}' --output table
📌 출력:

🔹 특정 Kubernetes 버전에서 사용 가능한 Add-on 개수 비교
EKS에서 제공하는 Kubernetes 버전별 Add-on 지원 개수를 비교하여 최신 버전과 안정적인 버전 간 차이를 확인해 보겠습니다.
aws eks describe-addon-versions --kubernetes-version 1.32 --query 'addons[].{MarketplaceProductUrl: marketplaceInformation.productUrl, Name: addonName, Owner: owner Publisher: publisher, Type: type}' --output text | wc -l
aws eks describe-addon-versions --kubernetes-version 1.31 --query 'addons[].{MarketplaceProductUrl: marketplaceInformation.productUrl, Name: addonName, Owner: owner Publisher: publisher, Type: type}' --output text | wc -l
aws eks describe-addon-versions --kubernetes-version 1.30 --query 'addons[].{MarketplaceProductUrl: marketplaceInformation.productUrl, Name: addonName, Owner: owner Publisher: publisher, Type: type}' --output text | wc -l
aws eks describe-addon-versions --kubernetes-version 1.29 --query 'addons[].{MarketplaceProductUrl: marketplaceInformation.productUrl, Name: addonName, Owner: owner Publisher: publisher, Type: type}' --output text | wc -l
aws eks describe-addon-versions --kubernetes-version 1.28 --query 'addons[].{MarketplaceProductUrl: marketplaceInformation.productUrl, Name: addonName, Owner: owner Publisher: publisher, Type: type}' --output text | wc -l
aws eks describe-addon-versions --kubernetes-version 1.27 --query 'addons[].{MarketplaceProductUrl: marketplaceInformation.productUrl, Name: addonName, Owner: owner Publisher: publisher, Type: type}' --output text | wc -l
📌 출력:

✔ EKS에서 안정적인 Kubernetes 버전 선택 기준
🔹 특정 Add-on의 전체 버전 정보 및 기본 설치 버전 확인
ADDON=vpc-cni
aws eks describe-addon-versions \
--addon-name $ADDON \
--kubernetes-version 1.31 \
--query "addons[].addonVersions[].[addonVersion, compatibilities[].defaultVersion]" \
--output text
📌 출력:
True = 기본 설치 버전

🔹 특정 Add-on의 버전별 호환 EKS 버전 확인
ADDON_NAME=aws-ebs-csi-driver
aws eks describe-addon-versions --addon-name $ADDON_NAME | jq -r '
.addons[] |
.addonVersions[] |
select(.architecture[] | index("amd64")) |
[.addonVersion, (.compatibilities[] | .clusterVersion), (.compatibilities[] | .defaultVersion)] |
@tsv'
📌 출력:

AWS eksctl은 EKS 클러스터를 쉽게 생성하고 관리할 수 있도록 돕는 명령줄 도구입니다.
Dry-Run 모드를 활용하여 실제 클러스터를 배포하지 않고 설정을 미리 확인하는 방법을 정리했습니다.
Dry-Run 기능을 활용하면 EKS 클러스터의 설정을 사전에 검토하고, 원하는 배포 구성을 조정한 후 실제 배포를 진행할 수 있습니다.
🔹 eksctl 기본 도움말 확인
eksctl
eksctl create
eksctl create cluster --help
eksctl create nodegroup --help
이 명령어를 실행하면 eksctl의 기본 사용법과 클러스터 및 노드 그룹 생성 옵션을 확인할 수 있습니다.
📌 출력:




🔹 지원되는 스키마(Schema) 확인
eksctl utils schema 명령어를 사용하면, eksctl에서 지원하는 클러스터 및 노드 그룹 설정을 JSON 형식으로 출력할 수 있습니다.
eksctl utils schema | jq
📌 출력:

Dry-Run 모드를 사용하면 클러스터를 실제로 배포하지 않고, 어떤 설정이 적용될지를 확인할 수 있습니다.
아래는 다양한 클러스터 배포 시나리오에 대한 Dry-Run 예제입니다.
2.1. 기본 EKS 클러스터 생성 (노드 그룹 없이)
eksctl create cluster --name myeks --region=ap-northeast-2 --without-nodegroup --dry-run | yh
📌 출력:

📌 설명:
2.2. 특정 가용 영역을 지정하여 EKS 클러스터 생성
--zones 옵션
eksctl create cluster --name myeks --region=ap-northeast-2 --without-nodegroup --zones=ap-northeast-2a,ap-northeast-2c --dry-run | yh
📌 출력:

📌 설명:
2.3. 관리형 노드 그룹이 포함된 EKS 클러스터 배포
--nodegroup-name, --node-type, --node-volume-size, --vpc-cidr 옵션
eksctl create cluster --name myeks --region=ap-northeast-2 --nodegroup-name=mynodegroup --node-type=t3.medium --node-volume-size=30 \
--zones=ap-northeast-2a,ap-northeast-2c --vpc-cidr=172.20.0.0/16 --dry-run | yh
📌 출력:

📌 설명:
2.4. Ubuntu 기반 관리형 노드 그룹 포함 + SSH 접속 허용
--ssh-access, --node-ami-family 옵션
eksctl create cluster --name myeks --region=ap-northeast-2 \
--nodegroup-name=mynodegroup --node-type=t3.medium --node-volume-size=30 \
--zones=ap-northeast-2a,ap-northeast-2c --vpc-cidr=172.20.0.0/16 \
--ssh-access --node-ami-family Ubuntu2004 --dry-run | yh
📌 출력:

📌 설명:
✔ 실제 리소스를 배포하지 않고도 YAML 설정을 미리 확인 가능
✔ EKS 클러스터 설정이 올바른지 점검 후 배포 가능
✔ 배포 전 가용 영역, VPC CIDR, 노드 그룹 설정을 검토하여 오류 방지
eksctl을 활용하여 EKS 클러스터 및 관리형 노드 그룹을 배포하는 과정을 정리했습니다.
EKS 클러스터를 배포하기 전에 환경 변수가 올바르게 설정되었는지 확인합니다.
echo $AWS_DEFAULT_REGION
echo $CLUSTER_NAME
echo $VPCID
echo $PubSubnet1,$PubSubnet2
📌 설명:
📌 출력:

배포 중 EC2 인스턴스 상태를 모니터링하려면 아래 명령어를 실행하여 실시간으로 확인할 수 있습니다.
🔹 실시간 EC2 인스턴스 상태 모니터링
while true; do aws ec2 describe-instances --query "Reservations[*].Instances[*].{PublicIPAdd:PublicIpAddress,PrivateIPAdd:PrivateIpAddress,InstanceName:Tags[?Key=='Name']|[0].Value,Status:State.Name}" \
--filters Name=instance-state-name,Values=running --output text ; echo "------------------------------" ; sleep 1; done
aws ec2 describe-instances --query "Reservations[*].Instances[*].{PublicIPAdd:PublicIpAddress,PrivateIPAdd:PrivateIpAddress,InstanceName:Tags[?Key=='Name']|[0].Value,Status:State.Name}" --filters Name=instance-state-name,Values=running --output table
📌 설명:
📌 출력:

배포 전에 Dry-Run 모드를 사용하여 설정을 미리 확인합니다.
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.31 --ssh-access --external-dns-access --dry-run
📌 출력(일부 발췌):

📌 설명:
EKS 클러스터 및 관리형 노드 그룹을 실제 배포합니다.
배포에는 약 15분 정도 소요됩니다.
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.31 --ssh-access --external-dns-access --verbose 4
📌 설명:
📌 출력 (일부 발췌):



📌 설명:
배포가 완료되면 AWS 콘솔에서 EKS 클러스터 및 관련 리소스를 확인합니다.
1️⃣ AWS CloudFormation 확인
eksctl은 내부적으로 AWS CloudFormation을 사용하여 클러스터를 배포합니다.
AWS 콘솔에서 CloudFormation 스택을 확인하여 생성된 리소스를 확인할 수 있습니다.


2️⃣ AWS EKS 콘솔에서 클러스터 확인
AWS 콘솔 → EKS 서비스 페이지에서 생성된 클러스터 상태 확인

3️⃣ AWS EC2 콘솔에서 노드 확인
EKS 클러스터의 노드 그룹에 포함된 EC2 인스턴스를 확인할 수 있습니다.

4️⃣ AWS EC2 Auto Scaling Group(ASG) 확인
관리형 노드 그룹은 Auto Scaling Group(ASG)를 통해 자동으로 인스턴스를 관리합니다.
AWS 콘솔에서 EC2 → Auto Scaling Groups에서 확인 가능


EKS 클러스터를 배포한 후에는 클러스터의 상태를 점검하고, 노드 및 네트워크 구성, 파드 정보를 확인하는 작업이 필요합니다.
이 글에서는 kubectl과 AWS CLI를 활용하여 EKS 클러스터의 주요 정보를 확인하는 방법을 정리했습니다.
🔹 Krew 플러그인 목록 확인
Krew는 kubectl 플러그인을 관리할 수 있는 패키지 관리자입니다.
Krew 플러그인을 활용하면 EKS 클러스터를 더욱 효율적으로 관리할 수 있습니다.
kubectl krew list
📌 출력:

🔹 네임스페이스 및 컨텍스트 정보 확인
kubectl ctx # 현재 사용 중인 컨텍스트 확인
kubectl ns # 현재 사용 중인 네임스페이스 확인
kubectl ns default # 기본 네임스페이스로 변경
📌 출력:

🔹 클러스터의 모든 리소스 확인
kubectl get-all # 모든 네임스페이스에서 실행 중인 리소스 확인
📌 출력:

🔹 EKS 클러스터 정보 확인
kubectl cluster-info
📌 출력:

🔹 AWS CLI를 활용한 클러스터 정보 확인
eksctl get cluster
aws eks describe-cluster --name $CLUSTER_NAME | jq
// 클러스터의 엔드포인트만 출력하려면
aws eks describe-cluster --name $CLUSTER_NAME | jq -r .cluster.endpoint
📌 출력:


🔹 클러스터 API 엔드포인트의 IP 주소 확인
APIDNS=$(aws eks describe-cluster --name $CLUSTER_NAME | jq -r .cluster.endpoint | cut -d '/' -f 3)
dig +short $APIDNS
📌 이 도메인이 어떤 IP를 사용하는지 확인하여, AWS에서 관리하는 리소스인지 검토할 수 있음.
📌 출력:

🔹 EKS API 서버에 직접 요청 (버전 확인)
curl -k -s $(aws eks describe-cluster --name $CLUSTER_NAME | jq -r .cluster.endpoint)/version | jq
📌 클러스터 API 서버가 정상적으로 응답하는지 확인 가능
📌 출력:

도메인 or 출력되는 ip 주소로 https://{IP}/version 외부에서도 접속 가능

🔹 현재 EKS 클러스터의 노드 그룹 정보 확인
eksctl get nodegroup --cluster $CLUSTER_NAME --name $CLUSTER_NAME-nodegroup
aws eks describe-nodegroup --cluster-name $CLUSTER_NAME --nodegroup-name $CLUSTER_NAME-nodegroup | jq
📌 출력:

🔹 클러스터의 노드 정보 확인 (노드 타입, 가용 영역 확인)
kubectl get node --label-columns=node.kubernetes.io/instance-type,eks.amazonaws.com/capacityType,topology.kubernetes.io/zone
📌 노드의 인스턴스 타입, 가용 영역, Capacity Type (On-Demand, Spot 등) 확인 가능
📌 출력:

🔹 모든 노드 정보 요약 출력
kubectl get node
kubectl get node -o wide
📌 출력:

🔹 클러스터 인증 로그 확인 (상세 로그 포함)
kubectl get node -v=6
📌 출력:

🔹 kubeconfig 파일 직접 확인
cat /root/.kube/config
kubectl config view
kubectl ctx # 현재 컨텍스트 확인
📌 출력:


🔹 EKS 인증 토큰 생성 (AWS CLI)
aws eks get-token --cluster-name $CLUSTER_NAME --region $AWS_DEFAULT_REGION
📌 EKS는 IAM을 활용한 인증을 사용하므로, aws eks get-token 명령어로 인증 토큰을 생성하여 API 요청 가능
🔹 특정/모든 네임스페이스의 파드 확인
kubectl get pod -n kube-system
kubectl get pod -n kube-system -o wide
kubectl get pod -A
📌 출력:

🔹 노드/파드 리소스 사용량 확인
kubectl top node # 노드 리소스 사용량 확인
kubectl top pod -A # 모든 파드의 리소스 사용량 확인
📌 출력:

🔹 특정/모든 네임스페이스의 모든 리소스 확인
kubectl get-all -n kube-system
kubectl get-all
📌 출력 (일부 발췌):


클러스터 내 모든 파드에서 사용 중인 컨테이너 이미지 목록을 조회합니다.
kubectl get pods --all-namespaces -o jsonpath="{.items[*].spec.containers[*].image}" | tr -s '[[:space:]]' '\n' | sort | uniq -c
📌 현재 클러스터에서 사용 중인 컨테이너 이미지를 확인하고, 보안 및 버전 점검 가능
📌 출력:
