DevOps/Kubernetes

[Kubernetes] AWS EKS - Fargate로 구성하기

TTOII 2022. 6. 14. 10:09
728x90

 🚀 AWS Fargate

AWS Fargate - Amazon EKS
AWS Fargate는 서버리스형 컨테이너 서비스로서 Amazon EKS 클러스터의 일부로

Kubernetes 파드로 실행되는 컨테이너에 대해 적절한 크기의 온디맨드 컴퓨팅 용량을 제공한다.

컨테이너를 실행하는 리소스 비용만 초단위에 따라 지불하면 된다.

 

Fargate를 이용해 EC2 인스턴스를 사용하지 않고 파드를 실행할 수 있다.
우리가 EKS를 사용할 때 컨트롤 플레인은 AWS에서 관리해주지만

워커 노드들은 오토 스케일링 그룹을 이용해 EC2 인스턴스를 배포해서 사용한다.

즉, EC2 인스턴스의 관리는 사용자의 몫이다.

 

Fargate는 EC2 인스턴스를 추상화시켰기 때문에 사용자가 관리할 필요가 없다.
사용자는 운영체제 버전 업데이트, 패치 등을 할 필요없이 오로지 파드만을 관리하면 된다.

 

📌 Fargate 사용시 주의할 점

  • alb.ingress.kubernetes.io/target-type
    • instance: EC2 타겟
    • ip: Pod 타겟(Fargate)
  • alb.ingress.kubernetes.io/scheme
    • internal: 내부
    • internet-facing: 외부

Fargate의 경우 EC2 인스턴스가 없기때문에 인스턴스 타겟 방식으로는 연결할 수 없다.
반드시 ip 타입으로만 지정해야 한다.

Fargate에서 DaemonSet은 배치시킬 수 없고 GPU는 사용할 수 없다.

 

 

📌 Fargate를 배포하기 위한 구성

# Fargate Profiles
fargateProfiles:
  - name: fg-1
    selectors:
    - namespace: dev
      labels:
        env: fargate

파드를 생성할 때 기본적으로 Fargate를 사용하기 위한 조건을 지정할 수 있다.
fg-1이라고 하는 Fargate Profile을 사용하기 위해서는 namespace가 dev여야 하고

파드의 레이블에는 env: farage가 붙어있어야 한다.

만약 조건을 만족시키지 못한다면 Fargate가 아닌 EC2 인스턴스의 워커노드에 배치된다.

 

 🚀 실습

Fargate를 배치하기위해 Fargate Profile의 조건에 맞는 파드와 조건에 맞지 않는 파드를 각각 만들어본다.

kubectl create ns dev

 

nofg.yaml

apiVersion: v1
kind: Pod
metadata:
  name: nofg
  labels:
    name: nofg
spec:
  containers:
  - name: nofg
    image: ghcr.io/c1t1d0s7/go-myweb
    ports:
      - containerPort: 8080
PS C:\Users\Shinsohui\aws-eks> kubectl get nodes
NAME                                                 STATUS   ROLES    AGE     VERSION
ip-192-168-112-50.ap-northeast-2.compute.internal    Ready    <none>   9m26s   v1.22.6-eks-7d68063
ip-192-168-138-4.ap-northeast-2.compute.internal     Ready    <none>   9m28s   v1.22.6-eks-7d68063
ip-192-168-168-171.ap-northeast-2.compute.internal   Ready    <none>   9m32s   v1.22.6-eks-7d68063
PS C:\Users\Shinsohui\aws-eks> kubectl get po -o wide
NAME   READY   STATUS    RESTARTS   AGE   IP               NODE                                                NOMINATED NODE   READINESS GATES
nofg   1/1     Running   0          12s   192.168.108.49   ip-192-168-112-50.ap-northeast-2.compute.internal   <none>           <none>

해당 파드는 Fargate가 아닌 EC2 노드에 배치된다.

 

fg.yaml

apiVersion: v1
kind: Pod
metadata:
  name: fg
  namespace: dev
  labels:
    name: fg
    env: fargate
spec:
  containers:
  - name: fg
    image: ghcr.io/c1t1d0s7/go-myweb
    ports:
      - containerPort: 8080
PS C:\Users\Shinsohui\aws-eks> kubectl get po -o wide -n dev
NAME   READY   STATUS    RESTARTS   AGE    IP                NODE                                                         NOMINATED NODE   READINESS GATES
fg     1/1     Running   0          111s   192.168.103.169   fargate-ip-192-168-103-169.ap-northeast-2.compute.internal   <none>           <none>
PS C:\Users\Shinsohui\aws-eks> kubectl get nodes
NAME                                                         STATUS   ROLES    AGE   VERSION
fargate-ip-192-168-103-169.ap-northeast-2.compute.internal   Ready    <none>   90s   v1.22.6-eks-7d68063
ip-192-168-112-50.ap-northeast-2.compute.internal            Ready    <none>   13m   v1.22.6-eks-7d68063
ip-192-168-138-4.ap-northeast-2.compute.internal             Ready    <none>   13m   v1.22.6-eks-7d68063
ip-192-168-168-171.ap-northeast-2.compute.internal           Ready    <none>   13m   v1.22.6-eks-7d68063

하나의 파드가 하나의 Fargate 노드로 구성된다. Fargate가 10개 떠있다면 노드도 10개 떠있다.


Fargate 노드라는 것은 경량의 VM으로 되어있다.
눈으로 보이진 않지만 이것을 lightweight VM이라고 한다. 이것은 EC2 위에 띄워진다.

내부적으로는 하이퍼바이저를 이용해 아주 경량의 VM에 이 파드를 띄우는 형태이다.

 

Fargate는 EC2 인스턴스 관리 콘솔에서는 확인할 수 없다.

 

Fargate에 ReplicaSet 또는 Deployment를 만들고 ALB 또는 NLB를 만들어서 연결시킨 후 통신이 되는지 확인해보자

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myfg
  namespace: dev
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myfg
  template:
    metadata:
      labels:
        app: myfg
        env: fargate
    spec:
      containers:
      - name: myfg
        image: ghcr.io/c1t1d0s7/go-myweb
        resources:
          limits:
            memory: "128Mi"
            cpu: "500m"
        ports:
        - containerPort: 8080
apiVersion: v1
kind: Service
metadata:
  name: mysvc
  namespace: dev
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-type: "external"
    service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: "ip"
    service.beta.kubernetes.io/aws-load-balancer-scheme: "internet-facing"
spec:
  selector:
    app: myfg
  ports:
  - port: 80
    targetPort: 8080
  type: LoadBalancer

nlb-target-type은 반드시 ip 타입이어야 한다.
internet-facing으로 연결시켜줘야 외부에서 접속할 수 있다.

쿠버네티스 EKS 클러스터를 새로 올렸기 때문에 LB 컨트롤러는 없다. Helm으로 설치해줘야 한다.

 

PS C:\Users\Shinsohui\aws-eks> kubectl get all -n dev -o wide
NAME                        READY   STATUS    RESTARTS   AGE    IP                NODE                                                         NOMINATED NODE   READINESS GATES
pod/fg                      1/1     Running   0          16m    192.168.103.169   fargate-ip-192-168-103-169.ap-northeast-2.compute.internal   <none>           <none>
pod/myfg-5ffccc7d88-dfsgz   1/1     Running   0          7m3s   192.168.156.93    fargate-ip-192-168-156-93.ap-northeast-2.compute.internal    <none>           <none>
pod/myfg-5ffccc7d88-fsbbc   1/1     Running   0          7m3s   192.168.139.60    fargate-ip-192-168-139-60.ap-northeast-2.compute.internal    <none>           <none>
pod/myfg-5ffccc7d88-hdpp9   1/1     Running   0          7m3s   192.168.175.59    fargate-ip-192-168-175-59.ap-northeast-2.compute.internal    <none>           <none>

NAME            TYPE           CLUSTER-IP     EXTERNAL-IP                                                                  PORT(S)        AGE    SELECTOR
service/mysvc   LoadBalancer   10.100.30.35   k8s-dev-mysvc-62891a32d3-1b683d2c598a3d59.elb.ap-northeast-2.amazonaws.com   80:31982/TCP   7m1s   app=myfg

NAME                   READY   UP-TO-DATE   AVAILABLE   AGE    CONTAINERS   IMAGES                      SELECTOR
deployment.apps/myfg   3/3     3            3           7m3s   myfg         ghcr.io/c1t1d0s7/go-myweb   app=myfg

NAME                              DESIRED   CURRENT   READY   AGE    CONTAINERS   IMAGES                      SELECTOR
replicaset.apps/myfg-5ffccc7d88   3         3         3       7m3s   myfg         ghcr.io/c1t1d0s7/go-myweb   app=myfg,pod-template-hash=5ffccc7d88

3개의 파드가 모두 다른 곳에 배치된다.

 

로드밸런서 관리 콘솔에서 NLB가 생성되는 것을 확인할 수 있다.

 

활성 상태가 되면 DNS 주소로 접속 가능하다.

728x90