[EKS Study 1주차] EKS 설치 - eksctl
- -
CloudNet@ 팀의 가시다님께서 Leading 하시는 AEWS Study 내용 요약
해당 EKS Study 는 AWS 에서 제공하는 'EKS Workshop v2' 를 기반으로 진행 중입니다.
- EKS Workshop v2
이번 글에서는 eksctl 을 사용하여 실제 EKS 를 구성하는 방법에 대해 알아보겠습니다.
1. EKS 배포를 위한 VPC 환경 만들기
EKS 를 배포하기 위한 VPC 는 CloudNet@ 팀에서 만든 CloudFormation Template
을 사용했습니다.
1.1. VPC Architecture
- 생성 리소스
- VPC (1ea)
- Public Subnet (2ea)
- Private Subnet (2ea)
- 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 를 모를 경우, 아래 사이트에서 확인할 수 있습니다.
이후 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
사전에 접속한 Bastion Host 에서 eksctl 명령어를 실행하겠습니다.
참고로 CloudFormation 으로 배포한 Bastion 에는 user-data
를 통해 다음과 같은 Tool 이 설치되어 있습니다.
- 리눅스 활용 도구
- tree , jq , git , htop , lynx , yh
- k8s 활용 도구
- kubectl & helm
- eksctl
- aws-cli v2
- docker
- 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 의 통신 방법에 대해 간략하게 알아보았습니다.
'AWS > EKS' 카테고리의 다른 글
[EKS Study 1주차] EKS API 서버 Endpoint (0) | 2023.05.06 |
---|---|
[EKS Study 1주차] EKS Cluster Yaml 배포 - eksctl (0) | 2023.05.04 |
[EKS Study 1주차] EKS 소개 (0) | 2023.04.30 |
[PKOS Study 5주차] k8s Security - RBAC (0) | 2023.04.07 |
[PKOS Study 5주차] k8s Security - polaris (0) | 2023.04.07 |