[Kubernetes] AWS EKS - Fargate로 구성하기
🚀 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 주소로 접속 가능하다.