이 글은 CloudNet@팀의 AWS EKS Workshop Study(AEWS) 3기 스터디 내용을 바탕으로 작성되었습니다.
AEWS는 CloudNet@의 '가시다'님께서 진행하는 스터디로, EKS를 학습하는 과정입니다.
EKS를 깊이 있게 이해할 기회를 주시고, 소중한 지식을 나눠주시는 가시다님께 다시 한번 감사드립니다.
이 글이 EKS를 학습하는 분들께 도움이 되길 바랍니다.
이번 포스팅에서는 Windows 환경에서 WSL2(Ubuntu 24.04)를 활용하여 AWS EKS 클러스터를 배포하고 운영하는 과정을 정리했습니다.
실습 목표는 2개의 VPC를 구성하고 EKS 클러스터를 배포하는 것입니다.
✅ 목표 구성도

🔹 네트워크 구성
EKS 클러스터를 배포하기 위해 Windows 환경에서 WSL2(Windows Subsystem for Linux 2)를 활용한 Ubuntu 24.04 환경을 구축합니다.

# DISM(배포 이미지 서비스 및 관리) 명령어로 Windows Subsystem for Linux(WSL) 기능 활성화
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
# DISM 명령어로 Virtual Machine Platform 기능 활성화
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
# WSL 설치 (기본값은 WSL2)
wsl --install
# WSL2를 기본 버전으로 설정
wsl --set-default-version 2
# WSL 업데이트
wsl --update
📌 출력:


✅ Windows 재부팅 필수
Powershell을 관리자 권한으로 실행합니다.
# 설치 가능한 배포판 확인
wsl --list --online
# Ubuntu 24.04 설치
wsl --install Ubuntu-24.04
📌 출력:

설치가 완료되면, 새로운 UNIX 계정을 생성합니다.
Enter new UNIX username: <사용자 이름 입력>
New password: <비밀번호 입력>
Retype new password: <비밀번호 재입력>
passwd: password updated successfully
Installation successful!
To run a command as administrator (user "root"), use "sudo <command>".
📌 출력:

hostnamectl
whoami
id
pwd
📌 출력:

sudo apt update
sudo apt install -y jq htop curl wget ca-certificates net-tools
ifconfig eth0
ping -c 1 8.8.8.8
📌 출력:



# 빠져나오기
exit
# 설치된 배포판 확인
wsl -l -v
📌 출력:

✅ WSL2 Ubuntu 환경 준비 완료
EKS를 배포하려면 awscli, eksctl, kubectl 등 주요 도구를 설치해야 합니다.
# Ubuntu 재진입
wsl
sudo snap install aws-cli --classic
aws --version
📌 출력:

curl -sL "https://github.com/eksctl-io/eksctl/releases/latest/download/eksctl_Linux_amd64.tar.gz" | tar xz -C ./
sudo mv ./eksctl /usr/local/bin
eksctl version
📌 출력:

curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/1.31.2/2024-11-15/bin/linux/amd64/kubectl
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
kubectl version --client=true
📌 출력:

echo 'source <(kubectl completion bash)' >> ~/.bashrc
echo 'alias k=kubectl' >> ~/.bashrc
echo 'complete -F __start_kubectl k' >> ~/.bashrc
📌 출력:

curl -s https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash
helm version
📌 출력:

krew 툴 및 플러그인을 설치합니다.
curl -sL "https://github.com/kubernetes-sigs/krew/releases/download/v0.4.4/krew-linux_amd64.tar.gz" | tar xz -C ./
./krew-linux_amd64 install krew
export PATH="$HOME/.krew/bin:$PATH"
echo 'export PATH="$HOME/.krew/bin:$PATH"' >> ~/.bashrc
kubectl krew version
# 유용한 kubectl 플러그인 설치
kubectl krew install ctx ns neat get-all df-pv stern
kubectl krew list
📌 출력:



git clone https://github.com/jonmosco/kube-ps1.git $HOME/kube-ps1
cat <<"EOT" >> ~/.bashrc
source $HOME/kube-ps1/kube-ps1.sh
KUBE_PS1_SYMBOL_ENABLE=false
function get_cluster_short() {
echo "$1" | cut -d . -f1
}
KUBE_PS1_CLUSTER_FUNCTION=get_cluster_short
KUBE_PS1_SUFFIX=') '
PS1='$(kube_ps1)'$PS1
EOT
📌 출력:

curl -sL "https://github.com/kubecolor/kubecolor/releases/download/v0.5.0/kubecolor_0.5.0_linux_amd64.tar.gz" | tar xz -C ./
sudo mv ./kubecolor /usr/local/bin
kubecolor -h
📌 출력:

✅ 필수 툴 설치 완료
AWS CLI를 사용하려면 IAM 자격 증명 설정이 필요합니다.
# IAM 자격 구성 없이 기본 정보 확인
aws ec2 describe-instances
# AWS Configure 설정
aws configure
AWS Access Key ID [None]: AKIA5...
AWS Secret Access Key [None]: CVNa2...
Default region name [None]: ap-northeast-2
Default output format [None]: json
# 적용 확인
aws ec2 describe-instances
📌 출력:

✅ AWS CLI 자격 설정 완료
WSL 환경에서 Visual Studio Code로 파일을 편집하려면 다음 명령어를 사용합니다.
code .
📌 출력:


✅ VSCode 연동 완료
CloudFormation을 이용하면 EKS를 위한 인프라를 YAML 파일을 통해 자동으로 구축할 수 있습니다.
배포 과정은 다음과 같습니다.
# YAML 템플릿 다운로드
curl -O https://s3.ap-northeast-2.amazonaws.com/cloudformation.cloudneta.net/K8S/myeks-2week.yaml
다운로드한 myeks-2week.yaml 파일은 EKS를 위한 VPC, 서브넷, 보안 그룹, 운영 서버(EC2) 등을 정의하고 있습니다.
📌 출력:

이제 aws cloudformation deploy 명령어를 사용하여 스택을 배포한다.
# 배포 명령어
aws cloudformation deploy --template-file myeks-2week.yaml \
--stack-name myeks \
--parameter-overrides KeyName=<My SSH Keyname> \
SgIngressSshCidr=$(curl -s ipinfo.io/ip)/32 \
--region ap-northeast-2
🔹 명령어 설명
📌 출력:

✅ 배포가 완료되면, AWS 리소스가 자동으로 생성됨
(배포에 몇 분이 소요될 수 있음)
CloudFormation 스택이 정상적으로 배포되었는지 확인하고, 운영 서버(EC2)에 SSH로 접속한다.
aws cloudformation describe-stacks --stack-name myeks \
--query 'Stacks[*].Outputs[*].OutputValue' --output text
출력 예시
3.35.137.31
위의 IP가 운영 서버 EC2의 Public IP이다.
📌 출력:

# SSH 키파일이 있는 경우
ssh -i <ssh 키파일> ec2-user@$(aws cloudformation describe-stacks --stack-name myeks --query 'Stacks[*].Outputs[0].OutputValue' --output text)
# IP 직접 입력 시
ssh -i <ssh 키파일> ec2-user@3.35.137.31
📌 출력:

# 에러
Permissions 0644 for 'my-key.pem' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "my-key.pem": bad permissions
ec2-user@43.201.70.223: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
# 조치
chmod 400 my-key.pem

🔹 SSH 접속 후 확인할 내용
# 현재 호스트네임 확인
hostname
# 네트워크 설정 확인
ifconfig -a
# 기본적인 시스템 정보 확인
uptime
df -hT /
📌 출력:

✅ 운영 서버 EC2에 정상적으로 접속되었는지 확인
CloudFormation을 사용하여 배포된 주요 리소스를 확인합니다.
aws ec2 describe-instances --filters "Name=tag:aws:cloudformation:stack-name,Values=myeks" \
--query "Reservations[*].Instances[*].{InstanceID:InstanceId,PublicIP:PublicIpAddress,PrivateIP:PrivateIpAddress,State:State.Name}" \
--output table
📌 출력:

✅ EC2 인스턴스의 상태 및 Public/Private IP 확인 가능
aws ec2 describe-vpcs --filters "Name=tag:aws:cloudformation:stack-name,Values=myeks" \
--query "Vpcs[*].{VPC_ID:VpcId,CIDR: CidrBlock}" \
--output table
📌 출력:

✅ EKS 배포용 VPC와 운영 서버용 VPC 정보 확인 가능
aws ec2 describe-subnets --filters "Name=tag:aws:cloudformation:stack-name,Values=myeks" \
--query "Subnets[*].{Subnet_ID:SubnetId, AZ: AvailabilityZone, CIDR: CidrBlock}" \
--output table
📌 출력:

✅ 각 VPC에 속한 퍼블릭 및 프라이빗 서브넷 정보 확인 가능
aws ec2 describe-vpc-peering-connections --filters "Name=tag:aws:cloudformation:stack-name,Values=myeks" \
--query "VpcPeeringConnections[*].{VPC_Peering_ID:VpcPeeringConnectionId, Status: Status.Code}" \
--output table
📌 출력:

✅ VPC 간 내부 통신을 위한 Peering 설정이 정상적으로 생성되었는지 확인 가능
aws ec2 describe-route-tables --filters "Name=tag:aws:cloudformation:stack-name,Values=myeks" \
--query "RouteTables[*].{RouteTable_ID:RouteTableId, Routes: Routes[*].DestinationCidrBlock}" \
--output table
📌 출력:

✅ 각 VPC 및 서브넷에 대한 라우팅 설정 확인 가능
이번 단계에서는 eksctl을 사용하여 EKS 클러스터를 구축하는 과정을 설명합니다.
eksctl은 EKS 클러스터를 간편하게 배포할 수 있도록 도와주는 CLI 도구로, 여러 설정을 자동으로 구성해 줍니다.
EKS 클러스터 배포를 위해 VPC 및 서브넷 정보를 확인하고, 필요한 변수를 설정합니다.
아래 명령어를 실행하여 VPC ID와 서브넷 ID를 확인합니다.
export CLUSTER_NAME=myeks
# VPC ID 확인 및 변수 지정
export VPCID=$(aws ec2 describe-vpcs --filters "Name=tag:Name,Values=$CLUSTER_NAME-VPC" --query 'Vpcs[*].VpcId' --output text)
echo $VPCID
# 퍼블릭 서브넷 ID 확인 및 변수 설정
export PubSubnet1=$(aws ec2 describe-subnets --filters Name=tag:Name,Values="$CLUSTER_NAME-Vpc1PublicSubnet1" --query "Subnets[0].[SubnetId]" --output text)
export PubSubnet2=$(aws ec2 describe-subnets --filters Name=tag:Name,Values="$CLUSTER_NAME-Vpc1PublicSubnet2" --query "Subnets[0].[SubnetId]" --output text)
export PubSubnet3=$(aws ec2 describe-subnets --filters Name=tag:Name,Values="$CLUSTER_NAME-Vpc1PublicSubnet3" --query "Subnets[0].[SubnetId]" --output text)
echo $PubSubnet1 $PubSubnet2 $PubSubnet3
eksctl을 이용하여 YAML 파일을 자동 생성합니다.
아래 명령어를 실행하면, myeks.yaml 파일이 생성됩니다.
eksctl create cluster --name $CLUSTER_NAME --region=ap-northeast-2 \
--nodegroup-name=ng1 --node-type=t3.medium --nodes 3 \
--node-volume-size=30 --vpc-public-subnets "$PubSubnet1","$PubSubnet2","$PubSubnet3" \
--version 1.31 --with-oidc --external-dns-access --full-ecr-access --alb-ingress-access \
--node-ami-family AmazonLinux2023 --ssh-access --dry-run > myeks.yaml
✅ 위 명령어는 dry-run 옵션이 적용된 상태로 실행되므로, 실제 배포가 진행되지는 않습니다.
✅ 생성된 myeks.yaml 파일을 수정하여 최종적으로 클러스터를 배포합니다.
📌 출력:

myeks.yaml을 편집하여 EKS 클러스터의 설정을 추가 및 수정합니다.
아래는 수정해야 할 주요 부분입니다.
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
name: myeks
region: ap-northeast-2
version: "1.31"
kubernetesNetworkConfig:
ipFamily: IPv4
iam:
vpcResourceControllerPolicy: true
withOIDC: true
accessConfig:
authenticationMode: API_AND_CONFIG_MAP
vpc:
autoAllocateIPv6: false
cidr: 192.168.0.0/16
clusterEndpoints:
privateAccess: true # if you only want to allow private access to the cluster
publicAccess: true # if you want to allow public access to the cluster
id: vpc-0ab40d2acbda845d8 # 각자 환경 정보로 수정
manageSharedNodeSecurityGroupRules: true # if you want to manage the rules of the shared node security group
nat:
gateway: Disable
subnets:
public:
ap-northeast-2a:
az: ap-northeast-2a
cidr: 192.168.1.0/24
id: subnet-014dc12ab7042f604 # 각자 환경 정보로 수정
ap-northeast-2b:
az: ap-northeast-2b
cidr: 192.168.2.0/24
id: subnet-01ba554d3b16a15a7 # 각자 환경 정보로 수정
ap-northeast-2c:
az: ap-northeast-2c
cidr: 192.168.3.0/24
id: subnet-0868f7093cbb17c34 # 각자 환경 정보로 수정
addons:
- name: vpc-cni # no version is specified so it deploys the default version
version: latest # auto discovers the latest available
attachPolicyARNs: # attach IAM policies to the add-on's service account
- arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy
configurationValues: |-
enableNetworkPolicy: "true"
- name: kube-proxy
version: latest
- name: coredns
version: latest
- name: metrics-server
version: latest
privateCluster:
enabled: false
skipEndpointCreation: false
managedNodeGroups:
- amiFamily: AmazonLinux2023
desiredCapacity: 3
disableIMDSv1: true
disablePodIMDS: false
iam:
withAddonPolicies:
albIngress: false # Disable ALB Ingress Controller
appMesh: false
appMeshPreview: false
autoScaler: false
awsLoadBalancerController: true # Enable AWS Load Balancer Controller
certManager: true # Enable cert-manager
cloudWatch: false
ebs: false
efs: false
externalDNS: true # Enable ExternalDNS
fsx: false
imageBuilder: true
xRay: false
instanceSelector: {}
instanceType: t3.medium
preBootstrapCommands:
# install additional packages
- "dnf install nvme-cli links tree tcpdump sysstat ipvsadm ipset bind-utils htop -y"
# disable hyperthreading
- "for n in $(cat /sys/devices/system/cpu/cpu*/topology/thread_siblings_list | cut -s -d, -f2- | tr ',' '\n' | sort -un); do echo 0 > /sys/devices/system/cpu/cpu${n}/online; done"
labels:
alpha.eksctl.io/cluster-name: myeks
alpha.eksctl.io/nodegroup-name: ng1
maxSize: 3
minSize: 3
name: ng1
privateNetworking: false
releaseVersion: ""
securityGroups:
withLocal: null
withShared: null
ssh:
allow: true
publicKeyName: kp-gasida # 각자 환경 정보로 수정
tags:
alpha.eksctl.io/nodegroup-name: ng1
alpha.eksctl.io/nodegroup-type: managed
volumeIOPS: 3000
volumeSize: 30
volumeThroughput: 125
volumeType: gp3
✅ 자신의 환경에 맞게 수정한 후 배포합니다.
📌 출력:



작성한 myeks.yaml 파일을 이용하여 EKS 클러스터를 배포합니다.
export KUBECONFIG=$HOME/kubeconfig
# 또는 각자 편한 위치 지정
export KUBECONFIG=~/Downloads/kubeconfig
eksctl create cluster -f myeks.yaml --verbose 4
✅ 배포는 몇 분 정도 소요될 수 있습니다.
📌 출력:

EKS 클러스터 운영을 효율적으로 하기 위해 kubectl 자동 완성, krew 플러그인, kube-ps1 등의 도구를 설정합니다.
이를 통해 명령어 입력을 줄이고, 쿠버네티스 컨텍스트 및 네임스페이스 전환을 쉽게 하며, 시스템 리소스를 모니터링할 수 있는 환경을 구축합니다.
쿠버네티스 CLI(kubectl)를 사용할 때, 자동 완성 및 단축 명령어(alias) 설정을 적용하면 편리합니다.
# 자동 완성 및 alias 설정
source <(kubectl completion bash)
alias k=kubectl
complete -F __start_kubectl k
krew는 kubectl의 플러그인 관리 도구입니다.
이를 통해 유용한 플러그인을 쉽게 검색하고 설치할 수 있습니다.
공식 문서를 참고하여 설치합니다.
# Krew 설치
curl -fsSLO https://github.com/kubernetes-sigs/krew/releases/download/v0.4.4/krew-linux_amd64.tar.gz
tar zxvf krew-linux_amd64.tar.gz
./krew-linux_amd64 install krew
# 설치된 플러그인 디렉터리 확인
tree -L 3 /root/.krew/bin
📌 출력:


쿠버네티스 환경에서 여러 클러스터를 관리할 경우, 컨텍스트(Context) 전환이 자주 필요합니다.
또한, 네임스페이스(Namespace) 전환을 빠르게 할 수 있도록 kube-ctx, kube-ns 플러그인을 사용합니다.
# kube-ctx 설치
kubectl krew install ctx
# 사용 가능한 컨텍스트 목록 확인
kubectl ctx
# 특정 컨텍스트로 전환
kubectl ctx <각자 자신의 컨텍스트 이름>
📌 출력:

# kube-ns 설치
kubectl krew install ns
# 사용 가능한 네임스페이스 목록 확인
kubectl ns
# kube-system 네임스페이스로 변경
kubectl ns kube-system
# default 네임스페이스로 다시 변경
kubectl ns -
# 또는
kubectl ns default
📌 출력:

✅ 현재 선택된 컨텍스트와 네임스페이스 확인
kubectl config current-context
kubectl get ns
📌 출력:

EKS 운영을 효율적으로 하기 위해 유용한 kubectl 플러그인을 설치합니다.
# 추천 플러그인 설치
kubectl krew install df-pv get-all ktop neat oomd view-secret
# 모든 네임스페이스의 리소스 확인
kubectl get-all
kubectl get-all -n kube-system
# ktop 실행
kubectl ktop
📌 출력:

# OOM (Out of Memory) 상태 확인
kubectl oomd
📌 출력:

# PV 사용량 조회
kubectl df-pv
# 쿠버네티스 시크릿 확인 (디코딩 포함)
kubectl view-secret
✅ 플러그인 설치 후 확인
kubectl krew list
kube-ps1을 사용하면 터미널 프롬프트에서 현재 쿠버네티스 컨텍스트와 네임스페이스를 표시할 수 있습니다.
# kube-ps1 설치
git clone https://github.com/jonmosco/kube-ps1.git /root/kube-ps1
# .bash_profile에 추가
cat <<"EOT" >> /root/.bash_profile
source /root/kube-ps1/kube-ps1.sh
KUBE_PS1_SYMBOL_ENABLE=true
function get_cluster_short() {
echo "$1" | cut -d . -f1
}
KUBE_PS1_CLUSTER_FUNCTION=get_cluster_short
KUBE_PS1_SUFFIX=') '
PS1='$(kube_ps1)'$PS1
EOT
설정 적용
exit
exit
📌 출력:

✅ 터미널 프롬프트에서 현재 쿠버네티스 컨텍스트를 확인할 수 있음
# default 네임스페이스 선택
kubectl ns default





kubectl cluster-info
eksctl get cluster
📌 출력:

kubens default
kubectl ctx
cat $KUBECONFIG | grep current-context
kubectl config rename-context "<각자 자신의 IAM User>@myeks.ap-northeast-2.eksctl.io" "eksworkshop"
kubectl config rename-context "admin@myeks.ap-northeast-2.eksctl.io" "eksworkshop"
cat $KUBECONFIG | grep current-context
📌 출력:

kubectl get node --label-columns=node.kubernetes.io/instance-type,eks.amazonaws.com/capacityType,topology.kubernetes.io/zone
kubectl get node -v=6
📌 출력:

kubectl get pod -A
kubectl get pdb -n kube-system
출력 예시:
NAME MIN AVAILABLE MAX UNAVAILABLE ALLOWED DISRUPTIONS AGE
coredns N/A 1 1 28m
metrics-server N/A 1 1 28m
📌 출력:

eksctl get nodegroup --cluster $CLUSTER_NAME
aws eks describe-nodegroup --cluster-name $CLUSTER_NAME --nodegroup-name ng1 | jq
📌 출력:

eksctl get addon --cluster $CLUSTER_NAME
출력 예시:
NAME VERSION STATUS IAMROLE
coredns v1.11.4-eksbuild.2 ACTIVE
kube-proxy v1.31.3-eksbuild.2 ACTIVE
metrics-server v0.7.2-eksbuild.1 ACTIVE
vpc-cni v1.19.2-eksbuild.1 ACTIVE arn:aws:iam::911283464785:role/eksctl-myeks-addon-vpc-cni-Role1
📌 출력:


✅ 배포된 클러스터 및 노드 그룹이 정상적으로 동작하는지 확인합니다.
EKS 클러스터의 관리형 노드 그룹(Managed Node Group, EC2)에 SSH 접속하여 노드 정보를 확인하는 과정입니다.
이 단계에서는 EC2 보안 그룹 설정을 조정하여 SSH 접속을 활성화하고, 노드의 기본 정보를 확인합니다.
EC2 리스트에서 Name에 nodegroup 'ng1'이 포함된 인스턴스를 확인합니다.
인스턴스의 보안 그룹 ID를 확인합니다.

자신의 공인 IP를 보안 그룹에 추가하여 SSH 접속을 허용합니다.
# 현재 실행 중인 EC2 인스턴스 정보 확인 (Public IP, Private IP 포함)
aws ec2 describe-instances --query "Reservations[*].Instances[*].{InstanceID:InstanceId, PublicIP:PublicIpAddress, PrivateIP:PrivateIpAddress, InstanceName:Tags[?Key=='Name']|[0].Value, Status:State.Name}" --filters Name=instance-state-name,Values=running --output table
출력 예시:
-----------------------------------------------------------------
| InstanceID | PublicIP | PrivateIP | InstanceName | Status |
-----------------------------------------------------------------
| i-08abc123d4ef5 | 43.203.169.0 | 192.168.1.186 | nodegroup-ng1 | running |
| i-09fghi456j7kl | 13.125.28.29 | 192.168.2.123 | nodegroup-ng1 | running |
| i-012mno789p0qr | 13.125.255.7 | 192.168.3.174 | nodegroup-ng1 | running |
📌 출력:

# 인스턴스 Public IP 변수 지정
export N1=43.203.169.0
export N2=13.125.28.29
export N3=13.125.255.7
echo $N1, $N2, $N3
# Ping 테스트
ping -c 2 $N1
ping -c 2 $N2
📌 출력:

먼저, 관리형 노드 그룹(EC2)이 속한 보안 그룹 ID를 확인합니다.
# nodegroup-ng1이 포함된 보안 그룹 ID 확인
export MNSGID=<각자 자신의 관리형 노드 그룹(EC2) 에 보안그룹 ID>
export MNSGID=$(aws ec2 describe-security-groups --filters Name=group-name,Values="*nodegroup*" --query "SecurityGroups[*].[GroupId]" --output text)
echo $MNSGID
이제 자신의 공인 IP에서 SSH 접근을 허용하는 규칙을 추가합니다.
# 자신의 집 공인 IP에서 SSH 접속 허용
aws ec2 authorize-security-group-ingress --group-id $MNSGID --protocol '-1' --cidr $(curl -s ipinfo.io/ip)/32
운영 서버의 내부 IP에서도 접근할 수 있도록 보안 그룹 규칙 추가합니다.
# 운영 서버 내부 IP에서 접근 가능하도록 설정
aws ec2 authorize-security-group-ingress --group-id $MNSGID --protocol '-1' --cidr 172.20.1.100/32
📌 출력:

✅ AWS EC2 관리 콘솔에서 보안 그룹의 Inbound Rule을 확인하여 변경 사항이 적용되었는지 확인합니다.

# Ping 테스트
ping -c 2 $N1
ping -c 2 $N2
📌 출력:

보안 그룹 설정이 완료되었으면, SSH를 통해 EC2 인스턴스에 접속합니다.
# SSH 접속 테스트 (Public IP 사용)
ssh -i <SSH 키파일> -o StrictHostKeyChecking=no ec2-user@$N1 hostname
또는 모든 노드에 대한 SSH 접속을 자동화할 수도 있습니다.
# 여러 노드에 SSH 접속하여 hostname 확인
for i in $N1 $N2 $N3; do echo ">> node $i <<"; ssh -i <SSH 키파일> -o StrictHostKeyChecking=no ec2-user@$i hostname; echo; done
# 개별 노드에 SSH 접속 후 종료
ssh ec2-user@$N1
exit
ssh ec2-user@$N2
exit
ssh ec2-user@$N3
exit
✅ SSH 접속이 정상적으로 이루어졌다면, 관리형 노드 그룹이 정상적으로 동작하는 것입니다.
운영 서버에서 내부 IP를 사용하여 노드에 접근할 수도 있습니다.
# 내부 IP를 변수로 지정
export N1=192.168.1.186
export N2=192.168.2.123
export N3=192.168.3.174
echo $N1, $N2, $N3
# 내부 네트워크에서 ping 테스트
ping -c 2 $N1
ping -c 2 $N2
✅ 운영 서버를 통해 내부 네트워크에서 EKS 노드에 접근할 수 있도록 설정되었습니다.
SSH 대신 AWS Systems Manager Session Manager를 이용하여 EC2에 접속할 수도 있습니다.
이는 IAM 역할이 적절히 설정되어 있어야 사용 가능합니다.
# 인스턴스 ID 확인
aws ec2 describe-instances --query "Reservations[*].Instances[*].{InstanceID:InstanceId, PublicIP:PublicIpAddress, PrivateIP:PrivateIpAddress, InstanceName:Tags[?Key=='Name']|[0].Value, Status:State.Name}" --filters Name=instance-state-name,Values=running --output text
# AWS Systems Manager Session Manager를 사용하여 접속
aws ssm start-session --target i-08de73b8e3d968f24
접속 후 기본 정보를 확인합니다.
whoami
pwd
hostnamectl
exit
✅ Session Manager를 통해 SSH 없이도 EC2에 접근할 수 있습니다.

운영 서버(EC2)에서 EKS 클러스터에 접근하고 관리할 수 있도록 AWS IAM 자격 증명 및 kubectl을 설정하는 과정입니다.
이를 통해 EKS 클러스터의 노드 및 리소스를 운영 서버에서 직접 확인할 수 있습니다.
운영 서버에서 EKS에 접근하려면 AWS CLI의 IAM 자격 증명을 설정해야 합니다.
# IAM 자격 구성 설정 (Administrator 권한 IAM User 사용)
aws configure
위 명령어를 실행하면 아래와 같이 입력해야 합니다.
AWS Access Key ID [None]: AKIA5...
AWS Secret Access Key [None]: CVNa2...
Default region name [None]: ap-northeast-2
Default output format [None]: json
✅ 설정 완료 후, IAM 자격 증명이 정상적으로 적용되었는지 확인합니다.
# 현재 IAM 자격 증명 확인
aws sts get-caller-identity --query Arn
출력 예시:
"arn:aws:iam::123456789012:user/admin"
이제 위에서 출력된 user/admin 또는 본인의 IAM 사용자 이름을 기억해 둡니다.
운영 서버에서 kubectl을 사용하려면 EKS 클러스터 정보를 포함한 kubeconfig 파일을 생성해야 합니다.
# 현재 kubeconfig 파일 확인 (비어 있을 가능성 있음)
cat ~/.kube/config
# kubeconfig 파일 업데이트
aws eks update-kubeconfig --name myeks --user-alias <출력된 IAM 사용자 이름>
예제:
aws eks update-kubeconfig --name myeks --user-alias admin
✅ kubeconfig가 정상적으로 업데이트되었는지 확인합니다.
cat ~/.kube/config
✅ EKS 클러스터 정보를 확인합니다.
kubectl cluster-info
출력 예시:
Kubernetes control plane is running at https://ABCDEFG.eks.amazonaws.com
CoreDNS is running at https://ABCDEFG.eks.amazonaws.com/api/v1/namespaces/kube-system/services/kube-dns
✅ 현재 설정된 컨텍스트 및 네임스페이스를 확인합니다.
kubectl config current-context
kubectl ns default
✅ EKS 클러스터의 노드 상태 확인
kubectl get node -v6
출력 예시:
NAME STATUS ROLES AGE VERSION
ip-192-168-1-10.ap-northeast-2.compute.internal Ready <none> 10m v1.31.3
ip-192-168-2-11.ap-northeast-2.compute.internal Ready <none> 10m v1.31.3
ip-192-168-3-12.ap-northeast-2.compute.internal Ready <none> 10m v1.31.3
✅ 이제 운영 서버에서 EKS 클러스터를 정상적으로 관리할 수 있습니다.
EKS의 API 서버 엔드포인트는 기본적으로 VPC 내부에서만 접근이 가능합니다.
이를 확인하기 위해 EKS API의 DNS를 조회합니다.
# EKS API의 DNS 확인
APIDNS=$(aws eks describe-cluster --name myeks | jq -r .cluster.endpoint | cut -d '/' -f 3)
# DNS 레코드 조회
dig +short $APIDNS
📌 출력:

✅ 여기서 확인할 점
✅ 해결 방법 (Public Access 활성화)
EKS 실습을 진행할 때, 반복적으로 사용되는 변수들을 미리 설정하면 명령어 실행이 훨씬 편리해집니다.
이 단계에서는 EKS 클러스터, VPC, 서브넷, 인스턴스, 파드, 도메인 정보 등을 쉽게 활용할 수 있도록 변수를 설정하는 방법을 설명합니다.
먼저, EKS 클러스터 및 kubeconfig 경로를 설정합니다.
# kubeconfig 파일 경로 설정
export KUBECONFIG=~/Downloads/kubeconfig
# 클러스터 이름 설정
export CLUSTER_NAME=myeks
✅ 이제 kubectl을 실행할 때 별도로 kubeconfig를 지정할 필요 없이 사용 가능
EKS 클러스터가 배포된 VPC 및 서브넷 ID를 변수에 저장하여 쉽게 활용할 수 있도록 합니다.
# VPC ID 조회 및 설정
export VPCID=$(aws ec2 describe-vpcs --filters "Name=tag:Name,Values=$CLUSTER_NAME-VPC" --query 'Vpcs[*].VpcId' --output text)
echo "VPC ID: $VPCID"
# 퍼블릭 서브넷 ID 조회 및 설정
export PubSubnet1=$(aws ec2 describe-subnets --filters Name=tag:Name,Values="$CLUSTER_NAME-Vpc1PublicSubnet1" --query "Subnets[0].[SubnetId]" --output text)
export PubSubnet2=$(aws ec2 describe-subnets --filters Name=tag:Name,Values="$CLUSTER_NAME-Vpc1PublicSubnet2" --query "Subnets[0].[SubnetId]" --output text)
export PubSubnet3=$(aws ec2 describe-subnets --filters Name=tag:Name,Values="$CLUSTER_NAME-Vpc1PublicSubnet3" --query "Subnets[0].[SubnetId]" --output text)
# 출력하여 정상적으로 설정되었는지 확인
echo "Public Subnets: $PubSubnet1, $PubSubnet2, $PubSubnet3"
✅ 이제 VPC 및 서브넷 정보를 쉽게 활용 가능
EKS 클러스터에서 실행 중인 EC2 인스턴스의 공인(Public) 및 사설(Private) IP를 확인하고 변수로 저장합니다.
# 현재 실행 중인 인스턴스 정보 확인
aws ec2 describe-instances --query "Reservations[*].Instances[*].{InstanceID:InstanceId, PublicIP:PublicIpAddress, PrivateIP:PrivateIpAddress, InstanceName:Tags[?Key=='Name']|[0].Value, Status:State.Name}" --filters Name=instance-state-name,Values=running --output table
출력 예시:
-----------------------------------------------------------------
| InstanceID | PublicIP | PrivateIP | InstanceName | Status |
-----------------------------------------------------------------
| i-08abc123d4ef5 | 43.203.169.0 | 192.168.1.186 | nodegroup-ng1 | running |
| i-09fghi456j7kl | 13.125.28.29 | 192.168.2.123 | nodegroup-ng1 | running |
| i-012mno789p0qr | 13.125.255.7 | 192.168.3.174 | nodegroup-ng1 | running |
# 인스턴스 공인 IP 변수 설정
export N1=43.203.169.0
export N2=13.125.28.29
export N3=13.125.255.7
# 정상적으로 설정되었는지 확인
echo "EKS 노드 Public IPs: $N1, $N2, $N3"
✅ 이제 EKS 노드의 IP를 쉽게 참조할 수 있음
📌 출력:

# 노드의 시스템 정보 확인
for i in $N1 $N2 $N3; do echo ">> node $i <<"; ssh ec2-user@$i hostnamectl; echo; done
# 네트워크 설정 확인
for i in $N1 $N2 $N3; do echo ">> node $i <<"; ssh ec2-user@$i sudo ip -c addr; echo; done
# 라우팅 테이블 확인
for i in $N1 $N2 $N3; do echo ">> node $i <<"; ssh ec2-user@$i sudo ip -c route; echo; done
# iptables NAT 규칙 확인
for i in $N1 $N2 $N3; do echo ">> node $i <<"; ssh ec2-user@$i sudo iptables -t nat -S; echo; done
✅ 각 노드의 네트워크 및 시스템 정보를 쉽게 확인 가능
특정 애플리케이션(예: netshoot-pod)이 실행되는 파드의 이름과 IP를 변수로 설정하여 활용합니다.
# netshoot-pod의 파드 이름 변수 지정
export PODNAME1=$(kubectl get pod -l app=netshoot-pod -o jsonpath='{.items[0].metadata.name}')
export PODNAME2=$(kubectl get pod -l app=netshoot-pod -o jsonpath='{.items[1].metadata.name}')
export PODNAME3=$(kubectl get pod -l app=netshoot-pod -o jsonpath='{.items[2].metadata.name}')
# netshoot-pod의 IP 변수 지정
export PODIP1=$(kubectl get pod -l app=netshoot-pod -o jsonpath='{.items[0].status.podIP}')
export PODIP2=$(kubectl get pod -l app=netshoot-pod -o jsonpath='{.items[1].status.podIP}')
export PODIP3=$(kubectl get pod -l app=netshoot-pod -o jsonpath='{.items[2].status.podIP}')
# 출력하여 정상적으로 설정되었는지 확인
echo "Pod Names: $PODNAME1, $PODNAME2, $PODNAME3"
echo "Pod IPs: $PODIP1, $PODIP2, $PODIP3"
✅ 이제 특정 애플리케이션의 파드 및 IP를 쉽게 참조할 수 있음
EKS 클러스터에서 Route 53을 이용한 DNS 관리가 필요한 경우, 도메인 및 Hosted Zone 정보를 변수로 저장할 수 있습니다.
# 자신의 도메인 설정 (예제: gasida.link)
export MyDomain=gasida.link
# Route 53 Hosted Zone ID 가져오기
export MyDnzHostedZoneId=$(aws route53 list-hosted-zones-by-name --dns-name "${MyDomain}." --query "HostedZones[0].Id" --output text)
# 출력하여 정상적으로 설정되었는지 확인
echo "Route 53 Hosted Zone ID: $MyDnzHostedZoneId"
✅ 이제 Route 53 관련 설정을 쉽게 활용 가능
EKS에서 특정 도메인에 대한 A 레코드의 변경 사항을 실시간으로 확인할 수 있습니다.
# A 레코드 값 반복 조회 (1초 간격)
while true; do
aws route53 list-resource-record-sets --hosted-zone-id "${MyDnzHostedZoneId}" --query "ResourceRecordSets[?Type == 'A']" | jq
date
echo
sleep 1
done
✅ 도메인 및 A 레코드 변경 사항을 실시간으로 모니터링할 수 있음