본문 바로가기
  • lakescript
스터디 이야기/AWS EKS

[AEWS] 1-2. Amazon EKS Cluster 배포

by lakescript 2024. 3. 5.

AWS  Resource 설정

이 글에선 작성되어 있지 않지만 이 포스팅을 원활히 이해하기 위해서는 VPC와 Subnet4개(public 2개, private 2개), 작업용 EC2 1대( 자신의 IP만 허용되는 보안그룹)을 먼저 생성해주셔야 합니다. 이 포스팅은 EKS Cluster에 대한 내용임으로 해당 리소스 생성에 대한 실습은 작성하지 않았습니다. 

 

위 사진을 토대로 구성될 AWS Resource들을 살펴 보겠습니다.

EKS Control Plane은 AWS에서 직접 관리를 해주기 때문에 신경쓰지 않으셔도 됩니다.

다만, WorkerNode(Data Plane)는 직접 관리를 해주어야 하기 때문에 이를 위해 Customer VPC를 192.168.0.0/16 으로 생성합니다. 그 후 PublicSubnet 2개(192.168.1.0/24, 192.168.2.0/24), PrivateSubnet 2개(192.168.3.0/24,192.168.4.0/24)를 생성합니다. 이때, Public Subnet에 Worker Node를 배포하는데 같은 subnet에 작업용 EC2를 생성하여 내 IP에서만 작업용 EC2에 접근할 수 있도록 보안그룹을 설정합니다. (즉, 작업용 EC2에는 현재 내 IP가 보안그룹에 설정되어 있어야 합니다.) 그리고 무엇보다 EKS Cluster를 배포하고 관련 Resource를 설정하기 위해 Administrator 권한의 IAM 유저를 만들어 주셔야 합니다.

필요한 AWS Resource

- VPC: 192.168.0.0/16 
- Subnet 
  - PublicSubnet 2개(192.168.1.0/24, 192.168.2.0/24) 
  - PrivateSubnet 2개(192.168.3.0/24,192.168.4.0/24) 
- EC2
  - SG : 현재 내 IP
 - IAM
  - policy : Administrator (원활한 진행을 위해..)

 

작업용 EC2에 설치되면 좋은 Package

더보기
# Install Packages
yum -y install tree jq git htop

# Install kubectl & helm
curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/1.28.5/2024-01-04/bin/linux/amd64/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

# 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
           
# 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

# 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

 

작업용 EC2에 접근하여 배포한 AWS Resource 설정 확인

VPC 확인 및 환경 변수 설정

aws ec2 describe-vpcs --filters "Name=tag:Name,Values=$CLUSTER_NAME-VPC" | jq

VPC ID 확인 후 원활한 EKS Cluster 배포 명령어를 위해 환경 변수로 지정해줍니다. 

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

환경변수로 설정된 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

 

 

Public Subnet 확인 및 환경 변수 설정

aws ec2 describe-subnets --filters Name=tag:Name,Values="$CLUSTER_NAME-PublicSubnet1" --query "Subnets[0].[SubnetId]" --output text

 

Public Subnet ID 확인 후 원활한 EKS Cluster 배포 명령어를 위해 환경 변수로 지정해줍니다.

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 , $PubSubnet2

 

 


 

 

 

eksctl로 EKS Cluster 배포하기

eksctl

더보기

 

eksctl은 Amazon EKS (Elastic Kubernetes Service) 클러스터를 쉽게 생성, 관리, 삭제할 수 있도록 설계된 명령줄 도구입니다. 

eksctl을 사용하면 몇 분 안에 완전 관리형 Kubernetes 클러스터를 AWS에 배포할 수 있고, 나아가 클러스터 생성, 스케일링, 업그레이드 및 삭제와 같은 작업을 간단한 명령어로 수행할 수 있는데, AWS CloudFormation을 사용하여 관련 AWS Resource들을 프로비저닝합니다.

EKS를 배포하기 위해선 AWS managed Console, eksctl, IaC(CDK, CloudFormation, Terraform등)의 방법이 존재합니다.

 

eksctl의 기본 사용법 및 명령어는 이 링크를 참고해주세요.

 

AWS Resource 환경변수 등록 확인

echo $AWS_DEFAULT_REGION
echo $CLUSTER_NAME
echo $VPCID
echo $PubSubnet1,$PubSubnet2

 

 

 

EKS Cluster 생성하기 - 명령어로 배포 (약 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.28 --ssh-access --external-dns-access --verbose 4

 

명령어를 살펴보자면 cluster의 버전은 1.28이며

 

worker node의 instance type은 t3.medium이고, volume size : 30Gb으로 설정하고 SSH 접근을 허용합니다.

또한, 외부 DNS 접근을 허용하고 public endpoint를 사용합니다.

 

EKS Cluster 배포하기 - yaml 파일로 배포

더보기

명령어로 배포할 수도 있지만 yaml 파일로 배포할 수도 있습니다. 위의 명령어의 값들을 직접 채워주시면 되는데요. 해당 값들은 

eksctl github 을 참고하시면 됩니다.

 

아래는 제가 직접 작성하여 배포를 해본 yaml 파일입니다.

apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig

metadata:
  name: myeks
  region: ap-northeast-2
  version: "1.28"

managedNodeGroups:
- name: myeks-nodegroup
  instanceType: t3.medium
  privateNetworking: false
  ssh:
    allow: true
  volumeSize: 30

vpc:
  id: vpc-0a0e120f7c0186bbc
  manageSharedNodeSecurityGroupRules: true
  subnets:
    public:
      ap-northeast-2a:
        id: subnet-01b2f241caa7802d1
      ap-northeast-2c:
        id: subnet-0efd5a64697672d9f

verbose: 4

 

 

 

 

위의 명령어를 통해 EKS Cluster를 생성합니다. 이 과정에는 15분의 시간이 소요되고 AWS CloudFormation에서 어떤 stack들이 진행되는지 확인할 수 있으며 AWS EKS, EC2, SG이 차례대로 배포되는지 확인해볼 수 있습니다.

 

AWS CloudFofmation

 

쭉 기다리다가 log에 completed task: create cluster control plane "myeks"라는 로그가 찍히면 EKS Cluster는 생성이 완료된 것입니다. 그 후 AWS managed Console에서 AWS EKS 페이지에 접속하게 되면 아래와 같이 EKS Cluster를 확인하실 수 있습니다.

 

 

 

또, log에서 completed task: create managed nodegroup "myeks-nodegroup" 라는 부분이 보이게 되면 Worker Node인 nodegroup이 생성이 완료된 것입니다. 마찬가지로 AWS managed Console에서 AWS EC2 페이지에 접속하게 되면 아래와 같이 Worker Node들을 확인할 수 있습니다.

 

  • myeks-host : eks에 접근하기 위한 작업용 EC2
  • myeks-myeks-nodegroup-Node : EKS Cluster의 Worker Node

 

 

 

 


 

 

 

 

자, 드디어 EKS Cluster 배포는 완료되었습니다!!!

 

그럼 이제 배포된 Cluster를 가지고 좀 살펴보겠습니다.

 

 

EKS Cluster 확인

node 나 network 관련 부분은 좀 딥하기에 다음에 다루도록 하겠습니다.

 

kubectl cluster-info

 

해당 명령어로 Cluster의 정보를 조회했을 때 나오는 endpoint가 곧, API server endpoint임을 확인하실 수 있습니다.

 

dig +short ${APIDNS}

 

dig 명령어를 통해 해당 endpoint로 조회를 하면 2개의 public endpoint가 나오는 것을 확인하실 수 있습니다.

 

 

그래서 curl 명령어를 통해 해당 endpoint로 접근하면 public endpoint이기 때문에 문제 없이 접근이 되는 것을 확인할 수 있습니다.

 

그렇기에 보안을 위해서는 public endpoint 설정보다 private + public endpoint 나 private endpoint 설정을 추천드립니다. 아래의 명령어를 통해 pulbic + private endpoint로 변경이 가능합니다.

aws eks update-cluster-config --region $AWS_DEFAULT_REGION --name $CLUSTER_NAME --resources-vpc-config endpointPublicAccess=true,publicAccessCidrs="$(curl -s ipinfo.io/ip)/32",endpointPrivateAccess=true

 

 

 

 

배포되어 있는 pod들을 본다면 온프레미스 쿠버네티스의 파드 배치와 다른점이 있습니다.

바로 Control Plane에 해당하는 pod들(kube-apiserver, kube-scheduler, kube-controller-manager, etcd등) 은 없다는 것인데요. 그것은 이전 포스트에서 말했던 AWS의 책임 및 관리 영역이기 때문입니다.

 

 

EKS Cluster 삭제

eksctl delete cluster --name $CLUSTER_NAME
eksctl delete cluster -f $YAML