새소식

AWS/EKS

[EKS Study 1주차] EKS 설치 - eksctl

  • -

CloudNet@ 팀의 가시다님께서 Leading 하시는 AEWS Study 내용 요약

해당 EKS Study 는 AWS 에서 제공하는 'EKS Workshop v2' 를 기반으로 진행 중입니다.

 

  • EKS Workshop v2
 

EKS Workshop | EKS Workshop

Amazon Web Services workshop for Elastic Kubernetes Service

www.eksworkshop.com

 

이번 글에서는 eksctl 을 사용하여 실제 EKS 를 구성하는 방법에 대해 알아보겠습니다.

 

 

1. EKS 배포를 위한 VPC 환경 만들기

EKS 를 배포하기 위한 VPC 는 CloudNet@ 팀에서 만든 CloudFormation Template 을 사용했습니다.

 

1.1. VPC Architecture

  • 생성 리소스
  1. VPC (1ea)
  2. Public Subnet (2ea)
  3. Private Subnet (2ea)
  4. Bastion Host (1ea) - EKS 관리용

 

VPC 배포가 잘 되었다면, 최근 새로 생긴 VPC Resource Map 을 통해 다음과 같은 네트워크 구성도를 확인할 수 있습니다.

 

구성도를 보면 알 수 있지만 NAT G/W 가 존재하지 않는데, 이는 실습 환경에서는 최소한의 비용만 소비하기 위함입니다.
실제 환경에서는 반드시 NAT G/W 를 사용하여 모든 AWS 리소스는 가급적 Private 망으로 배포하는 것이 필요합니다.



1.2. CloudFormation 실행 - AWS Console

AWS Console 에서 CloudFormation 을 배포하는 방법입니다.

 

 

a. CloudFormation Stack 생성

  • Template URL

https://s3.ap-northeast-2.amazonaws.com/cloudformation.cloudneta.net/K8S/myeks-1week.yaml

 

b. Stack 세부 정보 입력

  • Bastion 접속을 위한 KeyPair 이름과 Bastion 보안 그룹의 Inbound Cidr 를 설정

만약, 본인 컴퓨터의 Public IP 를 모를 경우, 아래 사이트에서 확인할 수 있습니다.

 

Check your IP address | MyIP.com

For inquiries or feedback please get in touch at:

www.myip.com

 

이후 Stack 을 배포하면 다음과 같은 화면이 나옵니다.

 

CloudFormation Event

  • 현재 CloudFormation 의 진행 상황을 알 수 있으며, Stack 생성에 실패할 시 원인 파악도 가능합니다.

 

CloudFormation Resource

  • 해당 CloudFormation Stack 을 통해 생성한 AWS 리소스 내역을 확인할 수 있습니다.

 

CloudFormation Output

  • CloudFormation Template 에서 Output 설정을 한 리소스 정보를 확인할 수 있습니다.
  • 현재 Template 에서는 Bastion 의 Public IP 를 출력하도록 설정되어 있습니다.

 

Stack 배포가 성공적으로 완료되었다면, Bastion Host 에 SSH 접속을 시도합니다.

ssh ec2-user@<BASTION_IP> -i <KEY_PAIR>

 

1.3. CloudFormation 실행 - CLI

AWS CLI 를 통해 CloudFormation 을 배포하실 수 있습니다.

 

a. Bastion Key 생성

# Bastion Key 생성
export BASTION_KEY_NAME=kimalarm_key

aws ec2 create-key-pair \
    --key-name ${BASTION_KEY_NAME} \
    --output text \
    --query 'KeyMaterial' > ${BASTION_KEY_NAME}.pem

# Key Pair 권한 설정
chmod 400 ./${BASTION_KEY_NAME}.pem

 

b. CloudFormation Template 다운로드

curl -O https://s3.ap-northeast-2.amazonaws.com/cloudformation.cloudneta.net/K8S/myeks-1week.yaml

 

c. CloudFormation 배포

# CloudFormation 배포
aws cloudformation deploy \
    --template-file ./myeks-1week.yaml \
    --stack-name myeks \
    --parameter-overrides KeyName=${BASTION_KEY_NAME} SgIngressSshCidr=$(curl -s ipinfo.io/ip)/32 \
    --region ap-northeast-2

 

d. Bastion IP 확인 및 SSH 접속

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

 

ssh -i ./${BASTION_KEY_NAME}.pem ec2-user@$(aws cloudformation describe-stacks --stack-name myeks --query 'Stacks[*].Outputs[0].OutputValue' --output text)



2. EKS Install - eksctl

  • EKSCTL ??

EKSCTL 은 AWS EKS 를 생성할 수 있는 방법 중 가장 간단한 방법입니다.
자체 cli 명령어를 가지고 AWS Managed EKS 를 생성할 수 있으며, 생성할 EKS 구성을 YAML 파일로 관리할 수도 있습니다.

 

  • EKSCTL Docs
 

Introduction - eksctl

Introduction Getting started Basic cluster creation To create a basic cluster, but with a different name, run: eksctl create cluster --name=cluster-1 --nodes=4 EKS supports versions 1.22, 1.23, 1.24, 1.25 (default) and 1.26. With eksctl you can deploy any

eksctl.io

 

사전에 접속한 Bastion Host 에서 eksctl 명령어를 실행하겠습니다.

참고로 CloudFormation 으로 배포한 Bastion 에는 user-data 를 통해 다음과 같은 Tool 이 설치되어 있습니다.

 

  • 리눅스 활용 도구
  1. tree , jq , git , htop , lynx , yh

 

  • k8s 활용 도구
  1. kubectl & helm
  2. eksctl
  3. aws-cli v2
  4. docker
  5. krew & kube-ps1

 

2.1. EKS 배포를 위한 VPC, Subnet 지정

유저데이터를 통해 eksctl 은 설치되었지만, 현재 eksctl 을 통해 EKS 를 생성할 권한은 부여되지 않은 상태입니다.

실습 편의를 위해 IAM administrator 권한을 부여해줍니다.

aws configure

 

a. VPC & Subnet 지정

EKS 배포를 위해서는 VPC ID와 Subnet ID가 필요합니다.

 

VPC ID 와 Subnet ID 를 변수로 선언해줍니다.

  • 편의를 위해 Public Subnet 에 EKS 를 배포할 예정입니다.
# 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

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

 

b. VPC & Subnet 변수 확인

echo $VPCID
echo $PubSubnet1
echo $PubSubnet2

 

2.2. eksctl 사용

eksctl create cluster 명령어를 통해 EKS 를 배포할 수 있습니다.

 

a. eksctl dry-run

dry-run을 통해 실제 배포는 하지 않고, 배포될 EKS yaml 파일을 확인할 수 있습니다.

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.24 \
    --ssh-access \
    --external-dns-access \
    --dry-run | yh

 

 

b. EKS 배포

dry-run 옵션을 삭제하고 실제 배포를 해봅니다.

약 16분 정도 소요

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.24 \
    --ssh-access \
    --external-dns-access \
    --verbose 4

 

 

  • eksctl 명령어를 실행하면 CloudFormation Stack 이 생성되는 것을 확인할 수 있습니다.

EKS Cluster

 

EKS NodeGroup

 

c. EKS 배포 확인

배포가 완료되면 자동으로 k8s Context 가 등록되어 kubectl 명령어를 입력할 수 있습니다.

kubectl get pods -A

 

 

3. EKS 정보 확인

3.1. EKS endpoint 확인

EKS 의 Control Plane 은 AWS 에서 관리해줍니다.

 

우리가 EKS 와 통신하기 위해 kubectl 명령어를 입력하면 Control Plane 의 API 서버와 통신하게 되는데,
이 때 EKS Endpoint 를 사용하게 됩니다.

 

a. EKS Endpoint 확인

aws eks describe-cluster --name $CLUSTER_NAME | jq -r .cluster.endpoint

 

 

해당 정보는 AWS EKS 콘솔에서도 확인 가능합니다.

 

EKS Endpoint 가 퍼블릭으로 설정되어 있기 때문에 웹을 통해 관련 정보를 확인할 수 있습니다.

  • 때문에, 실제 환경에서는 Private Endpoint 를 사용할 것을 권장합니다.

 

b. EKS Endpoint IP 확인

dig +short BEC35E27D767A537CB7C2CF79CE2F0AE.gr7.ap-northeast-2.eks.amazonaws.com

 

해당 IP 는 AWS Managed Control Plane 앞의 ALB IP 입니다.

  • 그림은 NLB 이지만, 현재 내부는 ALB 로 구성되어 있다고 합니다.

 

3.2. Node 통신 확인

a. Node 확인

  • 현재 실행 중인 EC2 인스턴스 확인
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

 

 

  • 편의를 위해 Worker Node 의 Private IP 를 변수로 선언
N1=192.168.1.117
N2=192.168.2.135

echo $N1
echo $N2

 

b. Node 와 Control Plane 통신 확인

 

Kubelet & Kube-Proxy 통신

  • Worker Node 가 통신하는 방법을 알기 위해 Peer Network 를 확인해봅니다.
ssh -i ~/.ssh/id_rsa ec2-user@$N1 sudo ss -tnp

 

  • 앞에서 확인했던 EKS Endpoint 의 IP 와 통신하고 있는 것을 알 수 있습니다.

 

kubectl 을 통한 통신

  • kubectl 을 통해 Worker Node 에 접속한 후, 다른 터미널에서 Worker Node의 네트워크를 확인합니다.
kubectl exec daemonsets/aws-node -it -n kube-system -c aws-node -- bash

 

ssh -i ~/.ssh/id_rsa ec2-user@$N1 sudo ss -tnp
ssh -i ~/.ssh/id_rsa ec2-user@$N2 sudo ss -tnp

 

 

해당 IP 를 AWS 콘솔의 네트워크 인터페이스 화면에서 확인해봅니다.

  • 소유자ID는 내 계정의 ID 인데, 요청자ID 는 다른 것을 확인할 수 있습니다.

 

요청자 ID는 EKS Control Plane이 배포된 AWS Managed Account 의 ID임을 확인할 수 있습니다.

 

 

4. EKS 제거

eksctl 을 사용하여 EKS 를 삭제해봅니다.

 

a. EKS 제거

eksctl delete cluster --name $CLUSTER_NAME

 

b. VPC 환경 제거

aws cloudformation delete-stack --stack-name myeks

 

 


 

이번 글에서는 eksctl 을 통한 EKS 배포를 실시 했고,

EKS 의 Control Plane 과 Worker Node 의 통신 방법에 대해 간략하게 알아보았습니다.

Contents

포스팅 주소를 복사했습니다