25๋ ๋ AWS EKS Hands-on Study ์คํฐ๋ ์ ๋ฆฌ ๋ด์ฉ์ ๋๋ค.
EKS๋?
AWS์์ ์ ๊ณตํ๋ ๊ด๋ฆฌํ ์ฟ ๋ฒ๋คํฐ์ค ์๋น์ค์ด๋ค.
EKS๋ ์ปจํธ๋กค ํ๋ ์ธ์ AWS๊ฐ ๊ด๋ฆฌํ๊ณ ์ฌ์ฉ์๊ฐ ์์ปค ๋ ธ๋๋ฅผ ์ด์ํ๋ ํํ์ด๋ค.
์ปจํ ์ด๋์ ์๊ฐ ์ฆ๊ฐํ ์๋ก ์ด์์์ ๋ถ๋ด๋ ์ปค์ง๋๋ฐ, AWS๊ฐ ์ ๊ณตํ๋ ์ฟ ๋ฒ๋คํฐ์ค ๊ด๋ฆฌํ ์๋น์ค์ ์ด์ ์ ํ์ฉํ ์ ์์ด ์ด์ ๋ณต์ก์ฑ์ ์ค์ด๊ณ ์์ ์ ์ธ ์ธํ๋ผ ํ๊ฒฝ์ ์ ์งํ ์ ์๋ค.
- ์ปจํธ๋กค ํ๋ ์ธ : ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ์ ํต์ฌ ์ปดํฌ๋ํธ (api server, ์ค์ผ์ค๋ฌ, etcd, ์ปจํธ๋กค ๊ด๋ฆฌ)
- ๋ฐ์ดํฐ ํ๋ ์ธ : ์ค์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์คํ๋๋ ์์ปค ๋ ธ๋์ ํ๋
EKS ๋ฐฐํฌ ์ค์ต
CloudFormation
cloudformation์ AWS์์ json, yaml ํ์์ผ๋ก ์ธํ๋ผ ๋ฆฌ์์ค ๋ฐฐํฌ ๋ฐ ๊ด๋ฆฌํ๋ IaC ์๋น์ค์ด๋ค. ์ด๋ฅผ ํ์ฉํ์ฌ์ EKS๋ฅผ ๊ตฌ์ถํ๋๋ฐ ํ์ํ ๊ธฐ๋ณธ์ ์ธ ์ธํ๋ผ๋ฅผ ์ฝ๋๋ก ์๋ํํ์ฌ EKS๊ฐ ๋์ํ ์ ์๋ ํ๊ฒฝ์ ์ค๋นํ๋ค.
๋ฐฐํฌ๋ ์คํฐ๋๋ฅผ ์ํด ๋ฏธ๋ฆฌ ์ค๋นํด์ฃผ์ ํ ํ๋ฆฟ(myeks-1week.yaml)์ ํ์ฉํ์ฌ ๊ตฌ์ฑํ์์ผ๋ฉฐ ๋ด๋ถ ๊ตฌ์ฑ์ ์๋์ ๊ฐ๋ค.
myeks-1week.yaml
๋ฆฌ์์ค
- eks vpc 192.168.0.0/16
- AZ1
- 192.168.1.0/24 (ํผ๋ธ๋ฆญ ์๋ธ๋ท1)
- 192.168.3.0/24 (ํ๋ผ์ด๋น ์๋ธ๋ท1)
- AZ2
- 192.168.2.0/24 (ํผ๋ธ๋ฆญ ์๋ธ๋ท2)
- 192.168.4.0/24 (ํ๋ผ์ด๋น ์๋ธ๋ท2)
- AZ1
EKS ํด๋ฌ์คํฐ๋ฅผ ์์ฑํ๊ณ ๊ด๋ฆฌํ๊ธฐ ์ํ ๋๊ตฌ ์ค์น
linux ํจํค์ง
- tree
- jq
- git
- htop
- yh (YAML Highlighter)
- aws cli v2
- docker
์ฟ ๋ฒ๋คํฐ์ค
- kubectl (Kubernetes CLI)
- helm (Helm ํจํค์ง ๋งค๋์ )
- eksctl (EKS ํด๋ฌ์คํฐ ๊ด๋ฆฌ ๋๊ตฌ)
- krew (kubectl ํ๋ฌ๊ทธ์ธ ๋งค๋์ )
- ํ๋ฌ๊ทธ์ธ
- ctx
- ns
- get-all
- neat
- ํ๋ฌ๊ทธ์ธ
- kube-ps1 (์ฟ ๋ฒ๋คํฐ์ค ํ๊ฒฝ ์ค์ )
- kubecolor
์์ ์ ์ฝ์ ํน์ cli๋ก ๊ฐ๋ฅํ๊ณ ์คํ ์์ฑ > ์คํ ์ธ๋ถ ์ ๋ณด ์ง์ > ์คํ ์ต์ ๊ตฌ์ฑ > ๊ฒํ ๋ฐ ์์ฑ 4๋จ๊ณ๋ก ์ด๋ฃจ์ด์ง๋ค.
์๋ ํ๋ผ๋ฏธํฐ ๊ฐ์ ๋ณธ์ธ์ด ์ค์ ํ ๊ฐ์ ๋ฃ์ด์ ๊ตฌ์ฑ์ ์งํํ๋ค.
์ปค์คํ ํ๋ผ๋ฏธํฐ
- ClusterBaseName : EKS ํด๋ฌ์คํฐ ์ด๋ฆ
- KeyName : EC2 ํคํ์ด (๋ฏธ๋ฆฌ ์์ฑํด์ผํจ)
- SgIngressSshCidr : ๋ณธ์ธ์ด ์ฌ์ฉํ๋ PC ip
EC2 ์ค์
# ํด๋ผ์ฐ๋ํฌ๋ฉ์ด์
๋ฐฐํฌ
aws cloudformation deploy --template-file ~/myeks-1week.yaml \
--stack-name myeks --parameter-overrides KeyName=[Ec2 ํคํ์ด] \
SgIngressSshCidr=$(curl -s ipinfo.io/ip)/32 --region ap-northeast-2
# EC2 ip
aws cloudformation describe-stacks --stack-name [ClusterBaseName] \
--query 'Stacks[*].Outputs[*].OutputValue' --output text
# EC2 ์ ์ ํ IAM User ํค ๋ฃ๊ธฐ
aws configure
CloudFormation ์คํ ๋ฐฐํฌ ์ดํ์ ์์ฑ๋ ec2์ ip๋ฅผ ํ์ธํ๊ณ ssh๋ก ์ ์ํ๋ค.
์ด ec2 ์ธ์คํด์ค ์์์ eksctl ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ eks ํด๋ฌ์คํฐ๋ฅผ ์ ์ดํ๊ณ ๊ด๋ฆฌํ ์ ์๊ฒ ๋๋ค.
์์ฑ๋ ec2์์ aws IAM User์ ์๊ฒฉ ์ฆ๋ช ์ ์ ๋ ฅํ์ฌ ์ค์ต ํ๊ฒฝ ๊ตฌ์ฑํ๋ฉด cli ํ๊ฒฝ์์ ์ค๋น ์์ ์ด ๋๋๊ฒ ๋๋ค!
# EKS๋ฅผ ๋ฐฐํฌํ vpc ์ถ๋ ฅ
aws ec2 describe-vpcs --filters "Name=tag:Name,Values=$CLUSTER_NAME-VPC" | jq -r .Vpcs[].VpcId
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
# EKS ๋ฐฐํฌํ VPC์ ์ํ ๋ชจ๋ Subnet ์ ๋ณด ํ์ธ
aws ec2 describe-subnets --filters "Name=vpc-id,Values=$VPCID" --output yaml
EKS๋ฅผ ๋ฐฐํฌํ VPC๋ฅผ ํ์ธํด์ผ ํ๋๋ฐ ์ฝ์์์ 192.168.0.0/16 ipv4 ์ธ vpc์ id๋ฅผ ์ฐพ์๋ ๋๊ณ ์ ๋ช ๋ น์ด๋ฅผ ํตํด ๋ด๊ฐ ์์ฑํ ํด๋ฌ์คํฐ ์ด๋ฆ์ vpc๋ฅผ ์ฐพ์ ์ ์๋ค.
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)
๊ทธ๋ฆฌ๊ณ EKS ํด๋ฌ์คํฐ์์ ์ฌ์ฉํ ํผ๋ธ๋ฆญ ์๋ธ๋ท ID๋ฅผ ํ์ธํ๋ค.
์ง๊ธ๊น์ง EKS ๋ฐฐํฌํ๊ธฐ ์ํด ์ค๋น๋ ์ธํ๋ผ ๋ฆฌ์์ค ๊ตฌ์กฐ์ด๋ค.
eksctl์ ํ์ฉํ์ฌ eks ๋ฐฐํฌ
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
์ ๋ช ๋ น์ด๋ eksctl ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ํด๋ฌ์คํฐ๋ฅผ ์์ฑํ๊ณ eks ๋ ธ๋ ๊ทธ๋ฃน์ ํผ๋ธ๋ฆญ ์๋ธ๋ท์ ํ์ฉํ์ฌ ๋ฐฐํฌํ๋ ๋ช ๋ น์ด์ด๋ค.
์คํฐ๋์์๋ ์ด 4๊ฐ์ง ์์๋ฅผ ์ฃผ์ จ๋๋ฐ ๊ทธ์ค eks ํด๋ฌ์คํฐ ์์ฑํ๊ณ ๊ด๋ฆฌํ ๋ ธ๋ ๊ทธ๋ฃน์ ๋ฐฐํฌํ๋ eksctl ๋ช ๋ น์ด๋ก ๋ฐฐํฌํ์๋ค.
ํด๋ฌ์คํฐ ์๋ํฌ์ธํธ
์ฌ๊ธฐ์ API ์๋ฒ ์๋ํฌ์ธํธ์ ๊ฒฝ์ฐ ์ฒ์์ ํผ๋ธ๋ฆญ์ผ๋ก ์ค์ ๋๋๋ฐ ์ด๋ ์๋ํฌ์ธํธ ์ก์ธ์ค ๊ด๋ฆฌ > ํผ๋ธ๋ฆญ ๋ฐ ํ๋ผ์ด๋น์ผ๋ก ์์ ํ์ฌ ๋์ pc์์๋ง ์ ๊ทผํ ์ ์๊ฒ ์์ ํ๋ค.
์๋ํฌ์ธํธ ์ก์ธ์ค๋ ์ฟ ๋ฒ๋คํฐ์ค API ์๋ฒ์ ๋ํ ์ ๊ทผ ๋ฐฉ์์ ๋ํ๋ด๋ ๊ฒ์ผ๋ก 3๊ฐ์ง ์ต์ ์ด ์กด์ฌํ๋ฉฐ ์๋ํฌ์ธํธ์ ํธ๋ํฝ์ ์๋์ ๊ฐ๋ค.
- ํผ๋ธ๋ฆญ : ์ธ๋ถ ์ธํฐ๋ท์ ํตํด AWS VPC์ ์๋ API ์๋ฒ์ ์์ฒญ์ ๋ณด๋
- ์ฌ์ฉ์๊ฐ ์ธ๋ถ๋ง์์ kubectl ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๋ฉด AWS VPC ๋ด api server(ํผ๋ธ๋ฆญ ์๋ํฌ์ธํธ)๋ก ์์ฒญ์ ๋ณด๋ธ๋ค.
- api server๋ eni๋ฅผ ํตํด custom vpc์ ์๋ kubelet์ผ๋ก ๋ช ๋ น์ ์์ฒญํ๋ค.
- ์ดํ kubelet์ด ์ฌ์ฉ์๊ฐ ์์ฒญํ ์์ ์ ์ํํ๊ณ ์์ปค ๋ ธ๋์ ์ํ๋ฅผ ์ธํฐ๋ท ๊ฒ์ดํธ์จ์ด๋ฅผ ํตํด api server๋ก ์ ์กํ๋ค.
- โ
ํผ๋ธ๋ฆญ + ํ๋ผ์ด๋น : ์์ปค ๋
ธ๋ ์ฃผ์๊ฐ ๋ณ๋์ ํ๋ผ์ด๋น ์กด์ผ๋ก ๊ตฌ์ฑ๋ผ์์
- ํผ๋ธ๋ฆญ๊ณผ ๋์ผํ๊ฒ api server์์ kubelet์ผ๋ก์ ํธ๋ํฝ ํ๋ฆ์ ๋์ผํ๋ค.
- kubelet์์ api server๋ก ํต์ ํ ๋ ํผ๋ธ๋ฆญ์ฒ๋ผ ์ธํฐ๋ท ๊ฒ์ดํธ์จ์ด๋ก ํธ๋ํฝ์ด ํ๋ฅด๋ ๊ฒ์ด ์๋, aws ๋ด๋ถ ํ๋ผ์ด๋น ํธ์คํ ์กด์ผ๋ก ๊ฐ์ eni๋ฅผ ํต๊ณผํ์ฌ ํธ๋ํฝ์ด ํ๋ฅธ๋ค.
- ํ๋ผ์ด๋น : ์ฌ์ฉ์๊ฐ VPC ๋ด๋ถ์์๋ง EKS api ์๋ฒ ์ ๊ทผํ์ฌ NLB ํผ๋ธ๋ฆญ ip ์๋ํฌ์ธํธ๋ก ์ ์ํ์ง ์๋๋ค.
- ์ฌ์ฉ์๊ฐ ๋ด๋ถ vpc์์ kubectl ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๋ฉด eni๋ฅผ ํตํด์ api server๋ก ์์ฒญ์ ๋ณด๋ธ๋ค.
- eni๋ฅผ ํตํด api server๋ก ์๋ต์ด ์ ๋ฌ๋๋ค.
aws ec2 authorize-security-group-ingress --group-id $CPSGID --protocol '-1' --cidr 192.168.1.100/32
EKS์ ํผ๋ธ๋ฆญ + ํ๋ผ์ด๋น ์๋ํฌ์ธํธ ์ค์ ์ ์ ์ฉํ๋ฉด VPC ๋ด๋ถ์ ์์ปค ๋ ธ๋ ๋ฐ ๊ด๋ฆฌ์ฉ EC2 ์ธ์คํด์ค๋ ์ธํฐ๋ท ๊ฒ์ดํธ์จ์ด๋ฅผ ๊ฑฐ์น์ง ์๊ณ AWS ๋ด๋ถ ๋คํธ์ํฌ(ํ๋ผ์ด๋น ํธ์คํ ์์ญ)๋ฅผ ํตํด API ์๋ฒ์ ํต์ ํ๊ฒ ๋๋ค.
VPC ๋ด๋ถ์์๋ ํ๋ผ์ด๋น ์๋ํฌ์ธํธ๋ฅผ ํตํด EKS API ์๋ฒ๋ก ํต์ ๋๋ฉฐ, ์ด๋ฅผ ์ํด ํด๋น EC2 ์ธ์คํด์ค์ ํ๋ผ์ด๋น IP๊ฐ EKS API ์๋ฒ์ ์ํ๋ฆฌํฐ ๊ทธ๋ฃน์ ์ ์ฑ ์ด ์ถ๊ฐ๋์ด์ผ ํ๋ค.
๋ฐ๋ผ์ kubectl์ ์ฌ์ฉํ์ฌ EC2์์ EKS ํด๋ฌ์คํฐ์ ์ ๊ทผํ๋ ค๋ฉด EC2์ ํ๋ผ์ด๋น IP๋ฅผ EKS API ์๋ฒ์ ์ํ๋ฆฌํฐ ๊ทธ๋ฃน ์ธ๋ฐ์ด๋ ๋ฃฐ์ ์ถ๊ฐํด์ผ ํ๋ค.
'Infra > AWS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[AEWS] # 2์ฃผ์ฐจ aws ๋ก๋๋ฐธ๋ฐ์ ์ปจํธ๋กค๋ฌ์ ์ธ๊ทธ๋ ์ค ํธ๋ํฝ ๋ถ์ (4) (0) | 2025.02.16 |
---|---|
[AEWS] # 2์ฃผ์ฐจ eks vpc cni ์ดํดํ๊ธฐ (3) (0) | 2025.02.16 |
[AEWS] # 2์ฃผ์ฐจ eks vpc cni ์ดํดํ๊ธฐ (2) (0) | 2025.02.16 |
[AEWS] # 2์ฃผ์ฐจ eks vpc cni ์ดํดํ๊ธฐ (1) (1) | 2025.02.16 |
[AEWS] #1์ฃผ์ฐจ Private ECR Repo ์ด๋ฏธ์ง ์์ฑ ๋ฐ ํ๋ ๋ฐฐํฌ (2) (0) | 2025.02.09 |