AWS Fargate는 서버리스 컨테이너 서비스로 최소한의 인프라로 Kubernetes 클러스터에 애플리케이션을 구동할 수 있고 사용한 리소스에 대해서만 비용을 지불할 수 있다는 점에서 현업에서 많이 활용하고 있다.
Fargate는 pod를 띄울 때마다 새로운 EC2가 생성되는데, 만약 아래와 같은 pod를 실행시킨다면 8 vCPU와 20GB 메모리를 가진 적절한 EC2에 배치될 것이다.
apiVersion: v1
kind: Pod
metadata:
name: my-pod
labels:
app: my-app
spec:
containers:
- name: my-container
image: app:latest
resources:
requests:
memory: "20Gi"
cpu: "8"
limits:
memory: "20Gi"
cpu: "8"
Fargate가 서버리스 서비스이기 때문에 비용 효율적인것은 맞지만 애플리케이션이 실제로 사용하는 리소스보다 크게 잡아둔다면 비용이 엄청나게 나올 것이다. 그래서 리소스 사용량을 추정해서 애플리케이션을 실행시켜야 하고, 실행시키고 나서도 얼마나 자원을 쓰고 있는지 모니터링하고 필요하다면 자원을 조정해서 재배포 하는 것이 좋을 것이다.
그렇다면 Fargate가 얼마나 자원을 쓰는지 어떻게 알 수 있을까?
ADOT는 OpenTelemetry의 AWS 배포판으로 AWS 환경에서 최적화된 분산 추적, 메트릭, 로그 수집 도구 및 API를 제공하는 솔루션이다.
💡 OpenTelemetry는 애플리케이션의 성능과 동작을 모니터링하기 위한 오픈 소스 프로젝트로 trace, metrics, logs와 같은 데이터를 수집, 처리, 내보내기 위한 도구 및 API를 제공한다.
ADOT의 구성요소 중 하나인 ADOT Collector는 아래 그림과 같이 Kubernetes API 서버를 호출해서 각 worker node의 메트릭을 수집하고 PutLogEvents API를 사용해서 Cloudwatch로 메트릭을 전송해준다. 즉, ADOT Collector를 Fargate 클러스터에 배포하면 각 pod의 리소스 사용량을 Cloudwatch에서 조회할 수 있게 된다.
ADOT Collector가 CloudWatch로 로그를 전송하려면 IAM 권한이 필요하다. 그래서 IRSA 기능을 사용해서 Kubernetes SA를 생성하고 IAM Role을 매핑시켜주어야 한다.
CLUSTER_NAME
: EKS 클러스터 이름REGION
: EKS 클러스터가 위치한 지역 (ex. ap-northeast-2)SERVICE_ACCOUNT_NAME
: ADOT Collector가 사용할 SA 이름 (ex. adot-collector)SERVICE_ACCOUNT_NAMESPACE
: SA가 위치할 EKS namespace (ex. fargate-container-insights)SERVICE_ACCOUNT_IAM_ROLE
: SA와 매핑할 IAM Role (ex. adot-role)$ eksctl create iamserviceaccount \
--cluster=$CLUSTER_NAME \
--region=$REGION \
--name=$SERVICE_ACCOUNT_NAME \
--namespace=$SERVICE_ACCOUNT_NAMESPACE \
--role-name=$SERVICE_ACCOUNT_IAM_ROLE \
--attach-policy-arn=arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy \
--approve
ADOT Collector가 Fargate에서 실행되려면 Fargate Profile이 있어야 한다. 만약, profile이 없다면 pod는 schedule되지 않고 계속 Pending
상태로 남아있게 된다.
$ eksctl create fargateprofile \
--cluster $CLUSTER_NAME \
--name $FARGATE_PROFILE_NAME \
--namespace $SERVICE_ACCOUNT_NAMESPACE
otel-fargate-container-insights.yaml을 다운로드 받고 클러스터 이름과 지역정보를 수정한 후 배포하자.
region
: EKS 클러스터가 위치한 지역 (line 453)ClusterName
: EKS 클러스터 이름 (line 533)$ kubectl apply -f otel-fargate-container-insights.yaml
잘 배포되어 있는지 확인해보자.
$ kubectl get pods -n fargate-container-insights
ADOT Collector가 metric을 잘 가져가는지 확인하기 위해 aws-cli가 설치된 간단한 pod를 배포해보자.
$ cat << EOF > test-pod.yaml
apiVersion: v1
kind: Pod
spec:
containers:
- image: brentley/awscli
name: aws-cli
restartPolicy: Never
EOF
$ kubectl apply -f test-pod.yaml
AWS Console에서 [CloudWatch - Log groups]로 진입하면 아래와 같은 log group이 새로 생성되어 있을 것이다.
/aws/constainerinsights/$CLUSTER_NAME/performance
Log streams 중 하나를 선택해서 들어가보면 여러가지 metric들이 수집된 것을 확인할 수 있다.
주기별로 수집된 metric들을 CloudWatch에서 그래프로 만들어 대시보드에 구축해두면 CPU, Memory 등 현재 사용중인 리소스에 대해 확인하기 좋다.