๐ŸŒ[AWS] EKS๋ฅผ ์ด์šฉํ•œ ํด๋Ÿฌ์Šคํ„ฐ ๊ตฌ์ถ•

Uk-Jakeยท2024๋…„ 12์›” 7์ผ
0

AWS

๋ชฉ๋ก ๋ณด๊ธฐ
4/5
post-thumbnail

0. ๋“ค์–ด๊ฐ€๋ฉฐ

์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” AWS์—์„œ ์ œ๊ณตํ•˜๋Š” EKS (Elastic Kubernetes Service)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ตฌ์ถ• ์ˆœ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. CloudFormation์„ ์ด์šฉํ•œ VPC ์ƒ์„ฑ
  2. EKS Cluster ์ƒ์„ฑ
  3. Deployment๋ฅผ ์ด์šฉํ•œ Pod ๋ฐฐํฌ
  4. LoadBalancer๋ฅผ ์ด์šฉํ•œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์™ธ๋ถ€ ๋…ธ์ถœ

1. VPC ์ƒ์„ฑ

VPC๋ž€?

  • VPC (Virtual Private Cloud)๋Š” AWS์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ฐ€์ƒ ๋„คํŠธ์›Œํฌ๋กœ, ๊ฒฉ๋ฆฌ๋œ ๋„คํŠธ์›Œํฌ ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • Kubernetes๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Control Plane(Kubernetes API, etcd, scheduler ๋“ฑ)๊ณผ Work Plane(Pod ๋“ฑ)์ด ๋™์ผํ•œ ๋„คํŠธ์›Œํฌ์—์„œ ํ†ต์‹ ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— VPC๋ฅผ ์ƒ์„ฑํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

1. CloudFormation์„ ์ด์šฉํ•œ VPC ์ƒ์„ฑ

  1. ์Šคํƒ ์ƒ์„ฑ

  2. ํ…œํ”Œ๋ฆฟ ํŒŒ์ผ ์—…๋กœ๋“œ ํด๋ฆญ

    • ์•„๋ž˜ ๋งํฌ๋กœ ์ ‘์† ํ›„ base_resources_cfn_yaml ํŒŒ์ผ ์ €์žฅ
      ์ฒจ๋ถ€ํŒŒ์ผ

    • ์œ„ ํŒŒ์ผ ์ฒจ๋ถ€ ํ›„ ๋‹ค์Œ ๋ฒ„ํŠผ ํด๋ฆญ

  3. ์Šคํƒ ์„ธ๋ถ€ ์ •๋ณด ์ง€์ •

    • ์Šคํƒ ์ด๋ฆ„: eks-work-stack

  4. ๊ธฐ๋ณธ ์„ค์ • ํ›„ ์ƒ์„ฑ

    • ์ƒ์„ฑ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ์•ฝ 2~3๋ถ„ ํ›„ VPC ์Šคํƒ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

2. Cluster ์ƒ์„ฑ

EKS Cluster๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์€ AWS ์ฝ˜์†” ๋˜๋Š” eksctl์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณธ ํฌ์ŠคํŒ…์—์„œ๋Š” eksctl์„ ์‚ฌ์šฉํ•ด ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

1. AWS CLI ์„ค์น˜

  • ๋ฆฌ๋ˆ…์Šค(Linux)
    • ์„ค์น˜

      $ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
      $ unzip awscliv2.zip
      $ sudo ./aws/install
      
      $ aws --version
      aws-cli/2.7.9 Python/3.9.11 Linux/5.13.0-51-generic exe/x86_64.ubuntu.20 prompt/off
      
      $ rm -f awscliv2.zip
  • ์„ค์น˜๋˜์–ด ์žˆ๋Š” ์ƒํƒœ์—์„œ ์—…๋ฐ์ดํŠธ๋งŒ ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ
$ which aws
/usr/local/bin/aws

$ sudo ./aws/install --bin-dir /usr/local/bin --install-dir /usr/local/aws-cli --update
  • ์œˆ๋„์šฐ(Windows)
    1. ์•„๋ž˜ ๋งํฌ๋ฅผ ํ†ตํ•ด AWSCLIV2.msi ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ ํ›„ ์„ค์น˜

    2. CMD ์‹คํ–‰ ํ›„ ์•„๋ž˜ ๋ช…๋ น์–ด ์ž…๋ ฅ

      aws --version
      • ๋ช…๋ น์–ด ์ž…๋ ฅ์‹œ, ๋ฒ„์ „์ด ๋‚˜์˜ค๋ฉด ์„ฑ๊ณต์ ์œผ๋กœ ์„ค์น˜๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ๋งฅ(Mac)
    $ brew install awscli
    
    $ which aws
    /usr/local/bin/aws
    
    $ aws --version
    aws-cli/2.0.26 Python/3.8.3 Darwin/19.0.0 botocore/2.0.0dev30

2. AWS CLI ์ธ์ฆ

AWS CLI๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด IAM ์‚ฌ์šฉ์ž ์ธ์ฆ์„ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  1. IAM ์„œ๋น„์Šค > ์‚ฌ์šฉ์ž > ๊ถŒํ•œ ์ •์ฑ…
    • ์‚ฌ์šฉํ•˜์‹ค ์„œ๋น„์Šค์— ๋Œ€ํ•œ ๊ถŒํ•œ์„ ์ถ”๊ฐ€ํ•ด์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
    • ์•„๋ž˜ ์‚ฌ์šฉ์ž ๊ฐ™์€ ๊ฒฝ์šฐ, ์‹ค์Šต์„ ์›ํ™œํ•˜๊ฒŒ ์ง„ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด AWS์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์„œ๋น„์Šค์˜ ๊ถŒํ•œ์„ ์ถ”๊ฐ€ํ•œ ํ›„ ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค. (์‹ค๋ฌด์—์„œ๋Š” ๊ถŒ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.)

  1. ๋ณด์•ˆ ์ž๊ฒฉ ์ฆ๋ช… > ์•ก์„ธ์Šค ํ‚ค ๋งŒ๋“ค๊ธฐ

    • ์ƒ์„ฑ๋œ ํ‚ค๋ฅผ ๋ณต์‚ฌ

  1. ํ„ฐ๋ฏธ๋„์— ์•„๋ž˜ ๋ช…๋ น์–ด ์ž…๋ ฅ

    $ aws configure
    AWS Access Key ID [None] : [๋ฐœ๊ธ‰๋ฐ›์€ IAM์˜ Access Key ID]
    AWS Secret Access Key [None] : [๋ฐœ๊ธ‰๋ฐ›์€ IAM์˜ Secret Access Key]
    Default region name [None] : ap-northeast-2[์„œ์šธ ๋ฆฌ์ „]
    Default output format [None] : text / json / table

3. eksctl ์„ค์น˜

4. Cluster ์ƒ์„ฑ

  • ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด Cluster๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
eksctl create cluster 
--vpc-public-subnets VPC์˜Subnets๊ฐ’
--name ํด๋Ÿฌ์Šคํ„ฐ์ด๋ฆ„(ํ•˜๋‚˜์˜ ์ปดํ“จํ„ฐ ๋‚ด์—์„œ๋Š” ์ค‘๋ณต์ด ์•ˆ๋˜์ง€๋งŒ ๋‹ค๋ฅธ ์ปดํ“จํ„ฐ์˜ ๊ฒฝ์šฐ๋Š” ์ค‘๋ณต ๊ฐ€๋Šฅ)
--region ๋ฆฌ์ „์ด๋ฆ„
--version ๋ฒ„์ „(1.xx: ํ˜„์žฌ๋Š” 24 ๋ถ€ํ„ฐ 31๊นŒ์ง€ ์ง€์› - ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๊ด€๋ จ ๋ช…๋ น์€ kubectl ์„ ์ด์šฉํ•˜๋Š”๋ฐ AWS์—์„œ๋Š” ํ•˜๋‚˜ ์ด์ „ ๋ฒ„์ „๊นŒ์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์„ ๊ฑฐ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.)
--nodegroup-name ๋…ธ๋“œ๊ทธ๋ฃน์ด๋ฆ„(์ค‘๋ณต ๊ฐ€๋Šฅ)
--node-type ์ธ์Šคํ„ด์Šคํ•˜๋“œ์›จ์–ด์ข…๋ฅ˜(์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’์ด ์ œํ•œ์ )
--nodes ๋…ธ๋“œ์˜๊ฐœ์ˆ˜
--nodes-min  ์ตœ์†Œ ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜
--nodes-max ์ตœ๋Œ€ ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜ 
  • VPC ์ •๋ณด๋Š” ์ด์ „์— ๋งŒ๋“  VPC์˜ ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

  • CloudFormation์—์„œ ๋งŒ๋“  VPC ์Šคํƒ์˜ ์ถœ๋ ฅ ์ •๋ณด๋ฅผ ๋“ค์–ด๊ฐ€๋ฉด ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    - WorkSubnet

    1c23-421f-96a8-6b77e0a47775/55e89874-f6e3-4164-8eba-d1845493fad5/image.png)

  • ์ƒ์„ฑ ์‹œ๊ฐ„์€ ์•ฝ 5๋ถ„ ์ •๋„ ์†Œ์š”๋ฉ๋‹ˆ๋‹ค.

5. Cluster ์ƒํƒœ ํ™•์ธ

kubectl get nodes

  • eksctl create cluster ๋ช…๋ น์–ด ์ž…๋ ฅ์‹œ work node์˜ ๊ฐœ์ˆ˜๋ฅผ 3๋กœ ์ž…๋ ฅํ•˜์—ฌ node ๊ฐœ์ˆ˜๊ฐ€ 3๊ฐœ์ธ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3. Deployment๋ฅผ ์ด์šฉํ•œ Pod ๋ฐฐํฌ

1. deployment.yaml ํŒŒ์ผ ์ƒ์„ฑ

apiVersion: apps/v1

kind: Deployment

metadata:
  name: nginx-app  # ๋ฐฐํฌ์˜ ์ด๋ฆ„์„ ์ง€์ •.
  labels:
    app: nginx-app  # ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•œ ๋ผ๋ฒจ.

spec:
  replicas: 2  # ํŒŒ๋“œ์˜ ๋ณต์ œ๋ณธ ์ˆ˜๋ฅผ ์ •์˜.

  selector:
    matchLabels:
      app: nginx-app  # ํŒŒ๋“œ๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๋ผ๋ฒจ.

  template:
    metadata:
      labels:
        app: nginx-app  # ์ƒ์„ฑ๋œ ํŒŒ๋“œ์— ์ถ”๊ฐ€๋  ๋ผ๋ฒจ.
    spec:
      containers:
      - name: nginx-container  # ์ปจํ…Œ์ด๋„ˆ์˜ ์ด๋ฆ„.
        image: nginx  # ์‚ฌ์šฉํ•  ๋„์ปค ์ด๋ฏธ์ง€.
        ports:
        - containerPort: 80  # ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋…ธ์ถœํ•˜๋Š” ํฌํŠธ.

2. Deployment ์ ์šฉ

  • ํ˜„์žฌ ์œ„์น˜์— deployment.yaml ํŒŒ์ผ์ด ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธ ํ›„ ์•„๋ž˜ ๋ช…๋ น์–ด ์ž…๋ ฅ.
kubectl apply -f deployment.yaml

3. Deployment ์ƒํƒœ ํ™•์ธ

# deployment ์ƒํƒœ ํ™•์ธ
kubectl get deployment

# replicas ์ƒํƒœ ํ™•์ธ
kubectl get replicas

# pod ์ƒํƒœ ํ™•์ธ
kubectl get pods

4. LoadBalancer๋ฅผ ์ด์šฉํ•œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์™ธ๋ถ€ ๋…ธ์ถœ

Pod๋ฅผ ์™ธ๋ถ€์—์„œ ์ ‘์†ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Service์˜ LoadBalancer๋ฅผ ์ƒ์„ฑํ•ด์ค˜์•ผํ•ฉ๋‹ˆ๋‹ค.

1. service.yaml ํŒŒ์ผ ์ƒ์„ฑ

apiVersion: v1 
kind: Service  
metadata:
  name: nginx-service  # Service์˜ ์ด๋ฆ„์„ ์ง€์ •.
spec:
  type: LoadBalancer  # ์™ธ๋ถ€ IP๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์™ธ๋ถ€ ํŠธ๋ž˜ํ”ฝ์„ ํด๋Ÿฌ์Šคํ„ฐ๋กœ ๋ผ์šฐํŒ….
  selector:
    app: nginx-app  # nginx-app ๋ผ๋ฒจ์ด ์žˆ๋Š” ํŒŒ๋“œ๋ฅผ ์„ ํƒํ•˜์—ฌ ์—ฐ๊ฒฐ.
  ports:
  - protocol: TCP  # ์„œ๋น„์Šค๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋„คํŠธ์›Œํฌ ํ”„๋กœํ† ์ฝœ (๊ธฐ๋ณธ๊ฐ’์€ TCP).
    port: 80  # ์™ธ๋ถ€์—์„œ ์ ‘๊ทผํ•  ํฌํŠธ ๋ฒˆํ˜ธ.
    targetPort: 80  # ํŒŒ๋“œ์—์„œ ๋…ธ์ถœํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ ํฌํŠธ์™€ ๋งคํ•‘.

2. service ๋ฐฐํฌ

kubectl apply -f service.yaml

3. service ์ƒํƒœ ํ™•์ธ

kubectl get svc

  • nginx-service์˜ EXTERNAL-IP๋กœ ์ ‘์†ํ•˜๋ฉด nginx ์„œ๋ฒ„์Šค๊ฐ€ ์ž˜ ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

5. EKS ์ž‘์—… ๋‚ด์—ญ ์‚ญ์ œ

1. Load Balancer ์‚ญ์ œ

  • ์„œ๋น„์Šค ์กฐํšŒ: kubectl get svc --all-namespaces
  • ์„œ๋น„์Šค ์‚ญ์ œ: kubectl delete svc ์„œ๋น„์Šค์ด๋ฆ„

2. ํด๋Ÿฌ์Šคํ„ฐ ์‚ญ์ œ

  • eksctl ์‚ฌ์šฉ: eksctl delete cluster --name ํด๋Ÿฌ์Šคํ„ฐ์ด๋ฆ„

3. CloudFormation

  • VPC stack ์‚ญ์ œ

๐Ÿ’ก ๋А๋‚€์ 

EKS๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๊ณผ์ •์—์„œ CloudFormation, eksctl, ๊ทธ๋ฆฌ๊ณ  Kubernetes์˜ ๊ธฐ๋ณธ ๊ฐœ๋…์„ ์‹ค์Šต์„ ํ†ตํ•ด ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ, EKS์˜ ๋„คํŠธ์›Œํฌ ๊ตฌ์„ฑ์—์„œ VPC์˜ ํ•„์š”์„ฑ์„ ๋А๊ผˆ์œผ๋ฉฐ, Kubernetes ๋ฆฌ์†Œ์Šค์˜ ๋ฐฐํฌ ๊ณผ์ •์„ ์ตํž ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“šย ์ฐธ๊ณ  ์ž๋ฃŒ

profile
๊ฒฝํ—˜์œผ๋กœ ์„ฑ์žฅํ•˜๋Š” ๊ฐœ๋ฐœ์ž ์ง€๋ง์ƒ

0๊ฐœ์˜ ๋Œ“๊ธ€