모험가

AEWS 1주차 - EKS 배포 본문

쿠버네티스/AEWS

AEWS 1주차 - EKS 배포

라리음 2025. 2. 4. 16:45
본 글은 가시다님이 진행하시는 AEWS(AWS EKS Workshop Study)를 참여하여 정리한 글입니다. 
모르는 부분이 많아서 틀린 내용이 있다면 말씀 부탁드리겠습니다!

 

 

 

EKS 배포

 

EKS 배포에는 3가지 방식을 일반적으로 사용합니다.

 

1) AWS 콘솔 사용

2) eksctl 사용

3) IaC 사용

 

 

 

각 배포의 장단점

 

1. AWS 콘솔 사용

장점

  • 직관적인 UI로 쉽게 설정 가능
  • 빠르게 클러스터 생성 가능
  • 초보자도 접근하기 쉬움

단점

  • 자동화 및 재사용성이 부족
  • 설정 과정이 수동이므로 실수 가능성 높음
  • 변경 이력 관리가 어려움

2. eksctl 사용 (AWS 공식 CLI 툴)

장점

  • YAML 설정 파일을 이용해 비교적 간편하게 클러스터 배포 가능
  • CLI 명령 한 줄로 클러스터를 빠르게 생성 가능
  • 기본적인 클러스터 설정을 자동화

단점

  • 복잡한 구성에는 한계가 있음
  • IaC(예: Terraform)보다 변경 관리가 어려울 수 있음
  • AWS CLI 및 IAM 설정이 필요함

3. IaC(Infrastructure as Code) 사용 (Terraform, CloudFormation 등)

장점

  • 버전 관리가 가능하여 변경 이력 추적이 쉬움
  • 코드로 인프라를 정의하므로 자동화, 재현성, 유지보수 용이
  • 큰 규모의 클러스터 운영에 적합

단점

  • 초기 설정이 상대적으로 복잡함
  • Terraform, CloudFormation 등에 대한 학습 필요
  • 클러스터 변경 시 관리 방식이 까다로울 수 있음

 

 

저는 2) eksctl 사용 방법을 사용해서 배포하겠습니다.

 

 

 

 

 


사전 구성

 

 

1. 기본 인프라 구성

 

 

 

 

기본 인프라는 서울 리전에 위와 같이 구성하였습니다.

 

 

 

 

2. Administrator 권한을 지닌 IAM User (Credential 필요)

 

 

생성 방법

더보기

1. IAM 서비스 검색

 

 

 

2. 사용자 생성 클릭

 

 

 

3. 정보 기입 후 다음 클릭

 

 

4.  직접 정책 연결 -> AdministratorAccess 선택 후 다음

 

 

5. 사용자 생성

 

 

6. 엑세스 키 생성을 위해 만든 사용자 클릭

 

 

 

7. 보안 자격 증명 -> 엑세스 키 만들기 클릭

 

 

 

8. CLI 사례로 선택 후 다음 -> 2단계 생략

 

 

9. 3단계 에서 [.csv 파일 다운로드]로 로컬에 다운로드 후 완료

 

 

 

myeks-host에 쓰일 자격 증명을 생성하였습니다.

 

현재 Administrator 권한의 IAM User을 생성하였기 때문에 엑세스 키가 유출되지 않도록 정말 조심해주세요!!

* 특히 github에 하드 코딩으로 올릴시 바로 위험에 처합니다.

 

만약 유출될 시 즉각 폐기하고 새로운 키를 발급 받으시길 권장드립니다.

 

 

 

 

 


EKS 배포

 

1. 목표 구성도

 

 

편의상 myeks-host를 Bastion이라고 표현하겠습니다.

 

 

 


Bastion에 접속 및 필요 패키지 다운로드

 

 

Bastion 접속

ssh -i <Key> ec2-user@<Bastion 공인 IP>

 

저희는 실습이기때문에 root 사용자로 진행하겠습니다.

sudo su

 

 

저는 편리하기 위해 eksctl 및 기본 패키지들을 Bastion을 생성하면서 설치하였습니다.

이용했던 UserData 내용입니다.

더보기

hostnamectl --static set-hostname "${ClusterBaseName}-host"
            # Config convenience
            echo 'alias vi=vim' >> /etc/profile
            echo "sudo su -" >> /home/ec2-user/.bashrc
            sed -i "s/UTC/Asia\/Seoul/g" /etc/sysconfig/clock
            ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime

            # Install Packages
            yum -y install tree jq git htop

            # Install YAML Highlighter
            wget https://github.com/andreazorzetto/yh/releases/download/v0.4.0/yh-linux-amd64.zip
            unzip yh-linux-amd64.zip
            mv yh /usr/local/bin/

            # Install kubectl & helm
            cd /root
            curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/1.31.2/2024-11-15/bin/linux/amd64/kubectl
            install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
            curl -s https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash

            # Install eksctl
            curl -sL "https://github.com/eksctl-io/eksctl/releases/latest/download/eksctl_Linux_amd64.tar.gz" | tar xz -C /tmp
            mv /tmp/eksctl /usr/local/bin

            # Install aws cli v2
            curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
            unzip awscliv2.zip >/dev/null 2>&1
            ./aws/install
            complete -C '/usr/local/bin/aws_completer' aws
            echo 'export AWS_PAGER=""' >>/etc/profile
            export AWS_DEFAULT_REGION=${AWS::Region}
            echo "export AWS_DEFAULT_REGION=$AWS_DEFAULT_REGION" >> /etc/profile

            # Install krew
            curl -L https://github.com/kubernetes-sigs/krew/releases/download/v0.4.4/krew-linux_amd64.tar.gz -o /root/krew-linux_amd64.tar.gz
            tar zxvf krew-linux_amd64.tar.gz
            ./krew-linux_amd64 install krew
            export PATH="$PATH:/root/.krew/bin"
            echo 'export PATH="$PATH:/root/.krew/bin"' >> /etc/profile

            # Install kube-ps1
            echo 'source <(kubectl completion bash)' >> /etc/profile
            echo 'alias k=kubectl' >> /etc/profile
            echo 'complete -F __start_kubectl k' >> /etc/profile

            git clone https://github.com/jonmosco/kube-ps1.git /root/kube-ps1
            cat <<"EOT" >> /root/.bash_profile
            source /root/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

            # CLUSTER_NAME
            export CLUSTER_NAME=${ClusterBaseName}
            echo "export CLUSTER_NAME=$CLUSTER_NAME" >> /etc/profile

            # Create SSH Keypair
            ssh-keygen -t rsa -N "" -f /root/.ssh/id_rsa

            # Install krew plugin
            kubectl krew install ctx ns get-all neat # ktop df-pv mtail tree

            # Install Docker
            amazon-linux-extras install docker -y
            systemctl start docker && systemctl enable docker

            # Install Kubecolor
            wget https://github.com/kubecolor/kubecolor/releases/download/v0.5.0/kubecolor_0.5.0_linux_amd64.tar.gz
            tar -zxvf kubecolor_0.5.0_linux_amd64.tar.gz
            mv kubecolor /usr/local/bin/

 

EKS 배포를 위해서는 aws-cli와 kubectl와 eksctl은 설치가 필수이며

나머지는 선택이지만 저는 이후 실습을 위해 설치하였습니다.

 

 

 


IAM User 자격 증명 설정 및 VPC 확인 및 변수 지정

 

 

위에서 만든 IAM User 자격 증명 기입

# IAM User 자격 구성 : 실습 편리를 위해 administrator 권한을 가진 IAM User 의 자격 증명 입력
aws configure
AWS Access Key ID [None]: JLWI2...
AWS Secret Access Key [None]: BE1IW...
Default region name [None]: ap-northeast-2
Default output format [None]: json

 

 

EKS 배포할 VPC가 정확한지 확인 후 변수 지정

# VPC 변수 지정
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

# Subnet 변수 지정
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

 

 

 


eksctl로 클러스터 배포

 

 

eks 명령어 실행

# 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

 

옵션 설명

--name : 클러스터 이름
--region : 리전
--nodegroup-name : 노드그룹 이름
--node-type : 노드의 인스턴스 타입
--node-volume : EBS볼륨 사이즈
--vpc-public-subnets : 서브넷 지정
--version : EKS 클러스터 버전 지정
--ssh-access : SSH 접속 허용
--external-dns-access : 퍼블릭 엑세스 지정
--verbose : 수행시 발생하는 상세한 정보들을 표준 출력으로 자세히 내보낼 것인가

 

 

 

출력 화면

 

 

 

eksctl 명령을 하면 cloudformation 스택이 생성되며 해당 작업들을 수행합니다.

* 클러스터 생성 -> 노드 그룹 생성 순으로 스택들이 생성됩니다.

 

 

 

ControlPlane이 Ready가 되면 NodeGroup 생성 스택이 실행됩니다

노드그룹 스택 생성 시작
클러스터 및 노드 그룹 생성 완료

 

 

 

배포 확인 (노드 확인)

kubectl get nodes

 

 

 

 

또한 콘솔에서도 만들어진 EKS 클러스터를 확인할 수 있습니다.