[AWS EKS] Windows에서 EKS 클러스터 배포 및 Network 실습 환경 구성

주영·2025년 2월 14일
0

이 글은 CloudNet@팀의 AWS EKS Workshop Study(AEWS) 3기 스터디 내용을 바탕으로 작성되었습니다.
AEWS는 CloudNet@의 '가시다'님께서 진행하는 스터디로, EKS를 학습하는 과정입니다.
EKS를 깊이 있게 이해할 기회를 주시고, 소중한 지식을 나눠주시는 가시다님께 다시 한번 감사드립니다.
이 글이 EKS를 학습하는 분들께 도움이 되길 바랍니다.

이번 포스팅에서는 Windows 환경에서 WSL2(Ubuntu 24.04)를 활용하여 AWS EKS 클러스터를 배포하고 운영하는 과정을 정리했습니다.
실습 목표는 2개의 VPC를 구성하고 EKS 클러스터를 배포하는 것입니다.

1. 최종 아키텍처 구성

목표 구성도

  • 2개의 VPC 생성 (EKS 배포용, 운영용 VPC 분리)
  • EKS 제어부 및 데이터부 배포
    • 제어부(Control Plane): AWS에서 관리
    • 데이터부(Worker Node): 관리형 노드 그룹(MNG, Managed Node Group) 활용
  • AL2023 기반의 노드 (Amazon Linux 2023, Fedora 기반, dnf 패키지 관리자 사용)
  • 운영서버(EC2) 배포
  • 내부 통신을 위한 VPC Peering 설정

🔹 네트워크 구성

  1. myeks-vpc (EKS 배포용)
  2. operator-vpc (운영서버 및 기타 인프라)
    • AZ1을 사용하여 퍼블릭/프라이빗 서브넷 배치
  3. VPC Peering
    • 내부 통신을 위해 myeks-vpc와 operator-vpc 간 VPC Peering 설정

2. Windows 환경 설정 (WSL2 + Ubuntu 24.04)

EKS 클러스터를 배포하기 위해 Windows 환경에서 WSL2(Windows Subsystem for Linux 2)를 활용한 Ubuntu 24.04 환경을 구축합니다.
WSL2의 아키텍처

2.1 WSL2 활성화 (PowerShell 관리자 권한 실행)

# 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 재부팅 필수

2.2 WSL2에 Ubuntu 24.04 배포판 설치

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>".

📌 출력:

2.3 기본 시스템 정보 확인

hostnamectl
whoami
id
pwd

📌 출력:

2.4 필수 패키지 설치 및 네트워크 확인

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

📌 출력:

2.5 설치된 배포판 확인

# 빠져나오기
exit

# 설치된 배포판 확인
wsl -l -v

📌 출력:

✅ WSL2 Ubuntu 환경 준비 완료

3. AWS CLI 및 Kubernetes CLI 툴 설치

EKS를 배포하려면 awscli, eksctl, kubectl 등 주요 도구를 설치해야 합니다.

3.1 AWS CLI 설치

# Ubuntu 재진입
wsl

sudo snap install aws-cli --classic
aws --version

📌 출력:

3.2 eksctl 설치 (EKS 클러스터 관리)

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

📌 출력:

3.3 kubectl 설치 (Kubernetes CLI)

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

📌 출력:

3.4 kubectl 단축 및 자동 완성 설정

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

📌 출력:

3.5 Helm 설치 (Kubernetes 패키지 관리)

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

📌 출력:

3.6 kubectl 플러그인 및 보조 도구 설치

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

📌 출력:

3.7 kube-ps1 설치 (프롬프트에서 K8S 컨텍스트 표시)

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

📌 출력:

3.8 kubecolor 설치 (kubectl 출력 색상 추가)

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

📌 출력:

✅ 필수 툴 설치 완료

4. AWS Configure 자격 증명 설정

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 자격 설정 완료

5. VSCode 연동 (WSL 내부 파일 편집)

WSL 환경에서 Visual Studio Code로 파일을 편집하려면 다음 명령어를 사용합니다.

code .

📌 출력:

✅ VSCode 연동 완료

6. CloudFormation 템플릿 다운로드 및 배포

CloudFormation을 이용하면 EKS를 위한 인프라를 YAML 파일을 통해 자동으로 구축할 수 있습니다.
배포 과정은 다음과 같습니다.

6.1 CloudFormation 템플릿(YAML) 다운로드

# YAML 템플릿 다운로드
curl -O https://s3.ap-northeast-2.amazonaws.com/cloudformation.cloudneta.net/K8S/myeks-2week.yaml

다운로드한 myeks-2week.yaml 파일은 EKS를 위한 VPC, 서브넷, 보안 그룹, 운영 서버(EC2) 등을 정의하고 있습니다.

📌 출력:

6.2 CloudFormation 스택 배포

이제 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

🔹 명령어 설명

  • --template-file myeks-2week.yaml → 사용할 CloudFormation 템플릿 지정
  • --stack-name myeks → 스택 이름 지정
  • --parameter-overrides → 템플릿 내 변수 값 설정
    • KeyName= → EC2에 접근할 SSH 키 이름 지정
    • SgIngressSshCidr=$(curl -s ipinfo.io/ip)/32 → 현재 내 IP에서 SSH 접속을 허용
  • --region ap-northeast-2 → 배포할 리전 설정 (서울 리전)

📌 출력:

✅ 배포가 완료되면, AWS 리소스가 자동으로 생성됨
(배포에 몇 분이 소요될 수 있음)

7. 운영 서버(EC2) 접속

CloudFormation 스택이 정상적으로 배포되었는지 확인하고, 운영 서버(EC2)에 SSH로 접속한다.

7.1 배포된 운영 서버의 Public IP 확인

aws cloudformation describe-stacks --stack-name myeks \
    --query 'Stacks[*].Outputs[*].OutputValue' --output text

출력 예시

3.35.137.31

위의 IP가 운영 서버 EC2의 Public IP이다.
📌 출력:

7.2 운영 서버 EC2에 SSH 접속

# 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에 정상적으로 접속되었는지 확인

8. 배포된 리소스 정보 확인

CloudFormation을 사용하여 배포된 주요 리소스를 확인합니다.

8.1 운영 서버 EC2 확인

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 확인 가능

8.2 VPC 및 서브넷 확인

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에 속한 퍼블릭 및 프라이빗 서브넷 정보 확인 가능

8.3 VPC Peering 설정 확인

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 설정이 정상적으로 생성되었는지 확인 가능

8.4 라우팅 테이블 설정 확인

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 및 서브넷에 대한 라우팅 설정 확인 가능

9. eksctl을 이용한 EKS 클러스터 배포

이번 단계에서는 eksctl을 사용하여 EKS 클러스터를 구축하는 과정을 설명합니다.
eksctl은 EKS 클러스터를 간편하게 배포할 수 있도록 도와주는 CLI 도구로, 여러 설정을 자동으로 구성해 줍니다.

9.1 EKS 클러스터 배포를 위한 YAML 파일 작성

EKS 클러스터 배포를 위해 VPC 및 서브넷 정보를 확인하고, 필요한 변수를 설정합니다.

1. 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 파일을 수정하여 최종적으로 클러스터를 배포합니다.

📌 출력:

9.2 EKS 클러스터 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

✅ 자신의 환경에 맞게 수정한 후 배포합니다.

📌 출력:

9.3 EKS 클러스터 배포

작성한 myeks.yaml 파일을 이용하여 EKS 클러스터를 배포합니다.

1. Kubeconfig 설정

export KUBECONFIG=$HOME/kubeconfig
# 또는 각자 편한 위치 지정
export KUBECONFIG=~/Downloads/kubeconfig

2. 클러스터 배포 실행

eksctl create cluster -f myeks.yaml --verbose 4

✅ 배포는 몇 분 정도 소요될 수 있습니다.

📌 출력:

9.4 관리 편의성 설정

EKS 클러스터 운영을 효율적으로 하기 위해 kubectl 자동 완성, krew 플러그인, kube-ps1 등의 도구를 설정합니다.
이를 통해 명령어 입력을 줄이고, 쿠버네티스 컨텍스트 및 네임스페이스 전환을 쉽게 하며, 시스템 리소스를 모니터링할 수 있는 환경을 구축합니다.

1. Kubectl 자동 완성 기능 및 alias 설정

쿠버네티스 CLI(kubectl)를 사용할 때, 자동 완성 및 단축 명령어(alias) 설정을 적용하면 편리합니다.

# 자동 완성 및 alias 설정
source <(kubectl completion bash)
alias k=kubectl
complete -F __start_kubectl k

2. kubectl 플러그인 매니저 Krew 설치

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

📌 출력:

3. kubectl 컨텍스트 및 네임스페이스 관리 (kube-ctx, kube-ns)

쿠버네티스 환경에서 여러 클러스터를 관리할 경우, 컨텍스트(Context) 전환이 자주 필요합니다.
또한, 네임스페이스(Namespace) 전환을 빠르게 할 수 있도록 kube-ctx, kube-ns 플러그인을 사용합니다.

  • kube-ctx (컨텍스트 변경)
# kube-ctx 설치
kubectl krew install ctx

# 사용 가능한 컨텍스트 목록 확인
kubectl ctx

# 특정 컨텍스트로 전환
kubectl ctx <각자 자신의 컨텍스트 이름>

📌 출력:

  • kube-ns (네임스페이스 변경)
# 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

📌 출력:

4. 기타 추천 플러그인 설치 및 사용

EKS 운영을 효율적으로 하기 위해 유용한 kubectl 플러그인을 설치합니다.

# 추천 플러그인 설치
kubectl krew install df-pv get-all ktop neat oomd view-secret
  • get-all (모든 리소스 조회)
# 모든 네임스페이스의 리소스 확인
kubectl get-all
kubectl get-all -n kube-system
  • ktop (쿠버네티스 리소스 실시간 모니터링)
# ktop 실행
kubectl ktop

📌 출력:

  • oomd (Out of Memory 디버깅)
# OOM (Out of Memory) 상태 확인
kubectl oomd

📌 출력:

  • df-pv (Persistent Volume 사용량 확인)
# PV 사용량 조회
kubectl df-pv
  • view-secret (시크릿 복호화)
# 쿠버네티스 시크릿 확인 (디코딩 포함)
kubectl view-secret

✅ 플러그인 설치 후 확인

kubectl krew list

5. kube-ps1 설정 (프롬프트에 컨텍스트 표시)

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

9.5 배포 후 기본 정보 확인

1. EKS 관리 콘솔 확인

2. EKS 클러스터 정보 확인

kubectl cluster-info
eksctl get cluster

📌 출력:

3. 기본 네임스페이스 변경

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

📌 출력:

4. 노드 정보 확인

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

📌 출력:

5. 배포된 파드 및 PDB 확인

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

📌 출력:

6. EKS 노드 그룹 확인

eksctl get nodegroup --cluster $CLUSTER_NAME
aws eks describe-nodegroup --cluster-name $CLUSTER_NAME --nodegroup-name ng1 | jq

📌 출력:

7. EKS Add-on 확인

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

📌 출력:

8. EC2 관리 콘솔 확인

✅ 배포된 클러스터 및 노드 그룹이 정상적으로 동작하는지 확인합니다.

10. 관리형 노드 그룹(EC2) 접속 및 노드 정보 확인

EKS 클러스터의 관리형 노드 그룹(Managed Node Group, EC2)에 SSH 접속하여 노드 정보를 확인하는 과정입니다.
이 단계에서는 EC2 보안 그룹 설정을 조정하여 SSH 접속을 활성화하고, 노드의 기본 정보를 확인합니다.

10.1 EC2 관리 콘솔에서 관리형 노드 그룹 확인 및 보안 그룹 설정

1. AWS EC2 관리 콘솔에서 EKS 관리형 노드 그룹에 속한 인스턴스를 찾기

EC2 리스트에서 Name에 nodegroup 'ng1'이 포함된 인스턴스를 확인합니다.
인스턴스의 보안 그룹 ID를 확인합니다.

2. 해당 보안 그룹의 Inbound Rule을 수정하여 SSH 접근 허용

자신의 공인 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

📌 출력:

10.2 보안 그룹 설정 변경하여 SSH 접근 허용

먼저, 관리형 노드 그룹(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

📌 출력:

10.3 SSH를 이용한 관리형 노드 그룹(EC2) 접속

보안 그룹 설정이 완료되었으면, 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 접속이 정상적으로 이루어졌다면, 관리형 노드 그룹이 정상적으로 동작하는 것입니다.

10.4 운영 서버(EC2)에서 내부 IP를 통해 노드 접속

운영 서버에서 내부 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 노드에 접근할 수 있도록 설정되었습니다.

10.5 AWS EC2 System Manager - Session Manager를 사용한 접속

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에 접근할 수 있습니다.

11. 운영 서버(EC2)에서 EKS를 사용하도록 설정

운영 서버(EC2)에서 EKS 클러스터에 접근하고 관리할 수 있도록 AWS IAM 자격 증명 및 kubectl을 설정하는 과정입니다.
이를 통해 EKS 클러스터의 노드 및 리소스를 운영 서버에서 직접 확인할 수 있습니다.

11.1 IAM 자격 증명 설정

운영 서버에서 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 사용자 이름을 기억해 둡니다.

11.2 kubeconfig 생성 및 적용

운영 서버에서 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 클러스터를 정상적으로 관리할 수 있습니다.

11.3 EKS API DNS 확인 및 Private Hosted Zone 이해

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

📌 출력:

여기서 확인할 점

  1. Public Hosted Zone이 아닌 Private Hosted Zone에서만 조회 가능
    • EKS의 기본 설정에서는 Private Hosted Zone을 사용하여 내부 네트워크에서만 접근할 수 있도록 합니다.
  2. 운영 서버가 같은 VPC 내에 있을 경우 접근 가능
    • 운영 서버가 EKS와 동일한 VPC에 있어야 DNS 질의가 정상적으로 동작합니다.

해결 방법 (Public Access 활성화)

  • 만약 운영 서버가 EKS와 다른 VPC에 있거나 Public DNS 질의가 필요하다면,
    EKS 콘솔에서 클러스터 설정을 변경하여 Public Access를 활성화할 수 있습니다.
  • EKS 관리 콘솔 → 클러스터 → 네트워크 설정에서 Public Access 설정을 확인하고 변경할 수 있습니다.

12. 실습에서 자주 사용하는 변수 설정

EKS 실습을 진행할 때, 반복적으로 사용되는 변수들을 미리 설정하면 명령어 실행이 훨씬 편리해집니다.
이 단계에서는 EKS 클러스터, VPC, 서브넷, 인스턴스, 파드, 도메인 정보 등을 쉽게 활용할 수 있도록 변수를 설정하는 방법을 설명합니다.

12.1 기본 환경 변수 설정

먼저, EKS 클러스터 및 kubeconfig 경로를 설정합니다.

# kubeconfig 파일 경로 설정
export KUBECONFIG=~/Downloads/kubeconfig

# 클러스터 이름 설정
export CLUSTER_NAME=myeks

✅ 이제 kubectl을 실행할 때 별도로 kubeconfig를 지정할 필요 없이 사용 가능

12.2 VPC 및 서브넷 정보 변수 설정

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 및 서브넷 정보를 쉽게 활용 가능

12.3 EKS 노드 정보 변수 설정

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를 쉽게 참조할 수 있음

📌 출력:

12.4 EKS 노드 정보 확인

# 노드의 시스템 정보 확인
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

✅ 각 노드의 네트워크 및 시스템 정보를 쉽게 확인 가능

12.5 EKS 파드 정보 변수 설정

특정 애플리케이션(예: 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를 쉽게 참조할 수 있음

12.6 Route 53 도메인 변수 설정

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 관련 설정을 쉽게 활용 가능

12.7 Route 53 A 레코드 값 실시간 조회

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 레코드 변경 사항을 실시간으로 모니터링할 수 있음

0개의 댓글