๐Ÿ›ณ DevOps/Cloud Infra

AWS EKS ํ™˜๊ฒฝ๊ตฌ์ถ• ์‹ค์Šต

DevPoong 2023. 6. 29. 15:02

 

1. yum update ๋ฐ aws ๋ฒ„์ „ ํ™•์ธ

ec2-user ๊ณ„์ •์œผ๋กœ ์ ‘์†(sudo su - ec2-user)

sudo yum update -y  ๋ช…๋ น์„ ํ†ตํ•ด yum์„ ์—…๋ฐ์ดํŠธ ํ•ด์ค€๋‹ค.

aws --version์„ ํ†ตํ•ด 1.18 ๋ฒ„์ „ ์ด์ƒ์ธ์ง€ ํ™•์ธํ•œ๋‹ค. => ๊ทธ๋ž˜์•ผ kubectl ๋ช…๋ น์ด ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ


2. EC2 Role ์ƒ์„ฑ ํ›„ Bastion EC2(NAT ์ธ์Šคํ„ด์Šค)์— ๋ถ€์—ฌ

Role ์ƒ์„ฑ์ด ์™„๋ฃŒ๋˜๋ฉด ์ด์ œ EC2์— ๋“ค์–ด๊ฐ€์„œ IAM ์—ญํ• ์„ ์ˆ˜์ •ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.


3. Kubectl ์„ค์น˜

https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/install-kubectl.html

 

kubectl ์„ค์น˜ ๋˜๋Š” ์—…๋ฐ์ดํŠธ - Amazon EKS

Amazon EKS ํด๋Ÿฌ์Šคํ„ฐ ์ œ์–ด ์˜์—ญ๊ณผ ๋งˆ์ด๋„ˆ ๋ฒ„์ „์ด ํ•˜๋‚˜ ๋‹ค๋ฅธ kubectl ๋ฒ„์ „์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด 1.26 kubectl ํด๋ผ์ด์–ธํŠธ๋Š” Kubernetes 1.25, 1.26, 1.27 ํด๋Ÿฌ์Šคํ„ฐ์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

docs.aws.amazon.com

์œ„ ์‚ฌ์ดํŠธ์—์„œ ์„ค์น˜ ๋ช…๋ น์–ด๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ ๋‹ค์šด๋กœ๋“œํ•˜๋ฉด ๋ฃจํŠธ์— kubectl์ด ์„ค์น˜๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๋‹ค์Œ์—๋Š” kubectl์— ์‹คํ–‰๊ถŒํ•œ์„ ์ค˜์•ผํ•˜๋ฏ€๋กœ chmod +x ./kubectl ๋ช…๋ น์„ ์ž…๋ ฅํ•œ๋‹ค

๊ทธ ๋‹ค์Œ์—๋Š” ํ™˜๊ฒฝ๋ณ€์ˆ˜์— kubectl์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด ์•„๋ž˜ ๋ช…๋ น์„ ์ž…๋ ฅํ•œ๋‹ค.

sudo mv ./kubectl /usr/local/bin/kubectl

kubectl ๋ช…๋ น์ด ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

4. eksctl ์„ค์น˜

AWS EKS๋ผ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— eks๋ฅผ ๊ด€๋ฆฌํ•ด์ฃผ๋Š” ๋ช…๋ น์–ด ๋„๊ตฌ์ธ eksctl์„ ์„ค์น˜

curl --silent --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp

๋™์ผํ•˜๊ฒŒ ์•„๋ž˜ ๋ช…๋ น์œผ๋กœ ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ๋“ฑ๋กํ•œ๋‹ค.

sudo mv /tmp/eksctl /usr/local/bin

5. ๋…ธ๋“œ ๊ทธ๋ฃน ์ƒ์„ฑ ๋ฐ ssh ํ‚ค ์ƒ์„ฑ

๋…ธ๋“œ ๊ทธ๋ฃน ์ƒ์„ฑ์„ eksctl ๋ช…๋ น์„ ํ†ตํ•ด ํ•˜๋ฉด ๋˜๋Š”๋ฐ EC2 ์ธ์Šคํ„ด์Šค๊ฐ€ ๋…ธ๋“œ(Worker Node)์ด๋‹ค.

์ด EC2 ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๋Š” ํ•ญ์ƒ ssh ํ‚ค๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

ec2-user ๊ณ„์ •์œผ๋กœ ์ ‘์†ํ–ˆ์„ ๋•Œ๋Š” ๋ฃจํŠธ ํด๋”์— ์•„๋ž˜์™€ ๊ฐ™์ด .ssh ์ˆจ๊น€ํŒŒ์ผ์ด ์กด์žฌํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ๊ณ„์ •์œผ๋กœ ์ ‘์†ํ–ˆ์„ ๋•Œ๋Š” ๋”ฐ๋กœ ์„ค์ •์ด ๋˜์–ด ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ec2-user ๊ณ„์ •์œผ๋กœ ์ ‘์†ํ•ด์•ผ ํ•œ๋‹ค.

๋งŒ์•ฝ ๋‹ค๋ฅธ ๊ณ„์ •์œผ๋กœ ์ ‘์†ํ–ˆ๋‹ค๋ฉด mkdir .ssh ๋ช…๋ น์œผ๋กœ ํด๋”๋ฅผ ์ƒ์„ฑํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

ssh-keygen

์œ„ ๋ช…๋ น์„ ํ†ตํ•ด ssh key๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

.ssh ํด๋”๋‚ด์—๋Š” ์œ„์™€ ๊ฐ™์ด ์›Œ์ปค๋…ธ๋“œ์˜ ssh key๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.

 

์ด์ œ ์•„๋ž˜์™€ ๊ฐ™์ด ์ƒ์„ฑ๋œ ๊ณต๊ฐœํ‚ค๋ฅผ ์‚ฌ์šฉ์ค‘์ธ EC2 Region์œผ๋กœ ์—…๋กœ๋“œํ•œ๋‹ค.

๋‚˜์˜ ๊ฒฝ์šฐ ์œ„ ๋ช…๋ น์„ ์ฒ˜์Œ ์‹คํ–‰ํ–ˆ์„ ๋•Œ region์„ ์„ค์ •ํ•ด๋‹ฌ๋ผ๊ณ  ๋–ด๋‹ค.

aws configure ๋ช…๋ น์„ ์ž…๋ ฅํ•˜๊ณ  Default Region name์— ํ˜„์žฌ ๋ฆฌ์ „์ธ ap-northeast-2๋ฅผ ์ž…๋ ฅํ•˜๋‹ˆ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ–ˆ๋‹ค.

์™„๋ฃŒ๋˜๋ฉด ์œ„์™€ ๊ฐ™์ด EC2 ํ‚ค ํŽ˜์–ด์— ๋“ค์–ด๊ฐ€๋ฉด ๋‚ด๊ฐ€ ์—…๋กœ๋“œํ•œ ํ‚ค๊ฐ€ ๋‚˜ํƒ€๋‚˜๊ฒŒ ๋œ๋‹ค.

 

5. eksctl ๋ช…๋ น์–ด ์ด์šฉํ•˜์—ฌ eks cluster์™€ workerNode ์ƒ์„ฑ

 

eksctl create cluster --name mission-cluster --version 1.26 --region ap-northeast-2 --nodegroup-name mission-wn --node-type t3.medium --nodes 1 --nodes-min 1 --nodes-max 1 --ssh-access --ssh-public-key workernode-key --managed
  • --name: eks cluster ์ด๋ฆ„
  • --version: eks cluster ๋ฒ„์ „
  • --region:  ์ง€์—ญ ์„ค์ •
  • --nodegroup-name: Node group ์ด๋ฆ„
  • --node-type: Node type
  • --ssh-public-key: worker node ์ ‘์†์— ์‚ฌ์šฉํ•  key

์œ„ ๋ช…๋ น์„ ์ž…๋ ฅํ•˜๊ณ  ๋‚˜๋ฉด 20๋ถ„์ •๋„ ํ›„์— ์ž‘์—…์ด ์™„๋ฃŒ๋œ๋‹ค.

์•„๋ž˜ ๋ช…๋ น์„ ํ†ตํ•ด ๋…ธ๋“œ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

kubectl get node

 

6. Deployment ์ƒ์„ฑ (with Nginx) ๋ฐ ๋ฐฐํฌ

nginx-deployment.yaml, nginx-service.yaml 2๊ฐœ์˜ ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์ค€๋‹ค.

(1) nginx-deployment.yaml : Deployment ์ƒ์„ฑ ( ๋ช‡ ๊ฐœ์˜ Pod๊ฐ€ ์–ผ๋งˆ๋งŒํผ์˜ ์ž์›์„ ์‚ฌ์šฉํ•˜๊ณ  ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๋ฐฐํฌํ• ์ง€ ์ •์˜)

cat <<EOF > ~/nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
spec:
  selector:
    matchLabels:
      run: my-nginx
  replicas: 2
  template:
    metadata:
      labels:
        run: my-nginx
    spec:
      containers:
      - name: my-nginx
        image: nginx
        ports:
        - containerPort: 80
EOF

 

(2) nginx-service.yaml : Service ์ƒ์„ฑ (Pod๋ฅผ ์™ธ๋ถ€๋กœ ๋…ธ์ถœ์‹œ์ผœ์ฃผ๋Š” ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ)

cat <<EOF > ~/nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: my-nginx
  labels:
    run: my-nginx
spec:
  ports:
  - port: 80
    protocol: TCP
  selector:
    run: my-nginx
  type: LoadBalancer
EOF

 

kubectl apply -f nginx-deployment.yaml

์œ„ ํŒŒ์ผ ๋‚ด์šฉ ๊ทธ๋Œ€๋กœ pod์™€ delpoyment๋ฅผ apply ํ•ด์ฃผ๋Š” ๋ช…๋ น

replicas ๋ฅผ 2๋กœ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— nginx 2๊ฐœ๊ฐ€ Running์ค‘์ธ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

nginx-service.yaml๋„ ๋˜‘๊ฐ™์ด applyํ•ด์ค€๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด service, deployment, pod ๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.

service์—์„œ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ ํƒ€์ž…์œผ๋กœ ์ƒ์„ฑํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— CLB ํƒ€์ž…์˜ ELB๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.

์ด์ œ EXTERNAL-IP:80 ์œผ๋กœ ์ ‘์†ํ•˜์—ฌ Nginx ์ ‘์†์„ ํ™•์ธํ•œ๋‹ค.

 

AWS ํŽ˜์ด์ง€์—์„œ๋„ Load Balancer๊ฐ€ ์ƒ์„ฑ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

์‚ญ์ œํ•ด๋ณด๊ธฐ

๋‹คํ•ด๋ดค์œผ๋ฉด ์ด์ œ ๋น„์šฉ์ด ๋” ๋ถ€๊ณผ๋˜๊ธฐ ์ „์— ์‚ญ์ œํ•ด์•ผํ•œ๋‹ค.

(1) service, deployment ์‚ญ์ œ

kubectl delete -f nginx-service.yaml
kubectl delete -f nginx-deployment.yaml

AWS ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ ํŽ˜์ด์ง€์—์„œ๋„ ์‚ญ์ œ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ

(2) EKS cluster์™€ Node group ์‚ญ์ œ

eksctl delete cluster --region ap-northeast-2 --name=mission-cluster
  • --name: eks cluster ์ด๋ฆ„

์ฝ˜์†”์— ์‚ญ์ œ ์™„๋ฃŒ ๋ฉ”์‹œ์ง€๊ฐ€ ๋–ด๋Š”์ง€ ๊ผญ ํ™•์ธํ•ด์•ผ ํ•จ.

๊ทธ ๋’ค์—๋Š” EC2 -> Autoscaling ๊ทธ๋ฃน ์—์„œ ์‚ญ์ œ๋œ ๊ฒƒ์„ ํ™•์ธ

 

์ฃผ์˜์‚ฌํ•ญ

Worker Node๋Š” EC2 ๋Œ€์‹œ๋ณด๋“œ์—์„œ ์‚ญ์ œํ•˜์—ฌ๋„ Autoscaling group์˜ desired ๊ฐ’์— ์˜ํ•ด ์žฌ์ƒ์„ฑ๋œ๋‹ค.
๋”ฐ๋ผ์„œ, eks delete cluster ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ์‚ญ์ œํ•˜๊ฑฐ๋‚˜ EC2>Autoscaling ๊ทธ๋ฃน์—์„œ Worker Node์˜ ์ธ์Šคํ„ด์Šค ์ˆ˜ min, desired, max ๊ฐ’ ๋ชจ๋‘ 0์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด ๋œ๋‹ค.