[AEWS] #1์ฃผ์ฐจ EKS ํด๋Ÿฌ์Šคํ„ฐ ๋ฐฐํฌ ์‹ค์Šต, ์—”๋“œํฌ์ธํŠธ ์•ก์„ธ์Šค ์„ค์ • (1)

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)

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 ์„œ๋ฒ„์˜ ์‹œํ๋ฆฌํ‹ฐ ๊ทธ๋ฃน ์ธ๋ฐ”์šด๋“œ ๋ฃฐ์— ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค.