Fargate는 컨테이너에 대한 적정 규모의 온디맨드 컴퓨팅 용량을 제공하는 기술입니다. Fargate를 사용하면 EC2와 달리 인스턴스를 설정하고, 확장시킬 방안을 고민할 필요가 없습니다. 그럼 Fargate를 사용하여 Pod를 배포하고, 로그까지 보내봅시다.
0. 사전 준비
Fargate profile을 구성할 때, Pod execution role이 필요합니다. IAM Role 생성으로 들어가 Use case에서 EKS - Fargate pod를 선택합니다.
Policy는 자동으로 설정되므로 계속 Next를 누르고 Role name을 정한 뒤 Create role을 하면 됩니다.
로그를 받을 Kinesis Data Firehose도 하나 생성하겠습니다. 이때, Source는 Direct PUT이여야 합니다.
1. Fargate profile 생성
EKS Console에 들어가 Cluster 하나를 선택하고, Compute 메뉴에 들어갑니다.
밑으로 내려가서 Fargate profiles에 있는 Add Fargate profile을 누릅니다.
Fargate profile의 이름을 정하고, 생성했던 IAM Role과 Pod가 실행될 Subnet을 선택합니다.
Fargate에 배치할 Pod의 특징을 정의해야 합니다. 저는 demo Namespace에 있고, 'type: fargate'의 label을 가진 Pod를 Fargate에 배치하겠습니다.
Review가 끝나면 Create를 눌러 생성합니다. 조금만 기다리면 Active 상태가 됩니다.
2. 로깅 설정
Pod를 생성하기 전, 로깅 설정을 해주겠습니다. Fargate는 Fluent Bit를 기반으로 내장된 로그 라우터를 제공하기 때문에 Namespace와 ConfigMap만 생성하면 바로 로깅이 가능합니다.
먼저, 전용 namespace인 aws-observability를 생성합니다.
cat <<EOF | kubectl apply -f -
kind: Namespace
apiVersion: v1
metadata:
name: aws-observability
labels:
aws-observability: enabled
EOF
다음으로, 로깅 ConfigMap을 작성합니다. 저는 CloudWatch Logs와 Kinesis Data Firehose에 보내도록 설정하겠습니다.
LOG_GROUP_NAME=demo-log
LOG_STREAM_PREFIX=fargate-
DELIVERY_STREAM=DemoFirehose
cat <<EOF | kubectl apply -f -
kind: ConfigMap
apiVersion: v1
metadata:
name: aws-logging
namespace: aws-observability
data:
flb_log_cw: "false"
filters.conf: |
[FILTER]
Name parser
Match *
Key_name log
Parser crio
[FILTER]
Name kubernetes
Match kube.*
Merge_Log On
Keep_Log Off
Buffer_Size 0
Kube_Meta_Cache_TTL 300s
output.conf: |
[OUTPUT]
Name cloudwatch_logs
Match kube.*
region ap-northeast-2
log_group_name $LOG_GROUP_NAME
log_stream_prefix $LOG_STREAM_PREFIX
log_retention_days 60
auto_create_group true
[OUTPUT]
Name kinesis_firehose
Match *
region ap-northeast-2
delivery_stream $DELIVERY_STREAM
parsers.conf: |
[PARSER]
Name crio
Format Regex
Regex ^(?<time>[^ ]+) (?<stream>stdout|stderr) (?<logtag>P|F) (?<log>.*)$
Time_Key time
Time_Format %Y-%m-%dT%H:%M:%S.%L%z
EOF
로그를 보내기 위해서 권한이 추가로 필요합니다. Pod execution role에 다음과 같은 Policy를 추가로 연결합니다.
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": [
"logs:CreateLogStream",
"logs:CreateLogGroup",
"logs:DescribeLogStreams",
"logs:PutLogEvents",
"firehose:PutRecordBatch"
],
"Resource": "*"
}]
}
3. Pod 배포
이제 Pod를 생성하여 Fargate가 잘 나타나고, Logging이 잘 되는지 확인해봅시다.
Pod가 위치할 namespace부터 생성합니다.
kubectl create namespace demo
Pod에는 Fargate profile에서 지정했던 namespace와 label이 기재되어야 합니다.
# pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
namespace: demo
labels:
type: fargate
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
kubectl apply -f pod.yaml
Pod describe를 했을 때 다음과 같은 내용이 있으면 성공적으로 된 것입니다.
[ec2-user@ip-10-0-10-55 ~]$ kubectl describe pod -n demo nginx
...
Labels: eks.amazonaws.com/fargate-profile=DemoFargate
type=fargate
...
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal LoggingEnabled 35s fargate-scheduler Successfully enabled logging for pod
[ec2-user@ip-10-0-10-55 ~]$
노드 리스트를 보면 Fargate 노드가 추가된 것도 볼 수 있습니다.
[ec2-user@ip-10-0-10-55 ~]$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
fargate-ip-10-0-149-45.ap-northeast-2.compute.internal Ready <none> 2m38s v1.27.1-eks-2f008fe
[ec2-user@ip-10-0-10-55 ~]$
CloudWatch와 Kinesis Data Firehose에도 curl을 했을 때 로그가 잘 도착했습니다.
오늘의 글은 여기까지입니다. 감사합니다!
'AWS' 카테고리의 다른 글
[AWS] aws-nuke로 모든 리소스 삭제 (0) | 2023.09.24 |
---|---|
[AWS] EKS Node Metadata (IMDS) - EC2 (1) | 2023.09.22 |
[AWS] ArgoCD를 통한 애플리케이션 배포 (with CodeCommit) (0) | 2023.09.19 |
[AWS] EKS AutoScaling - HPA, Cluster Autoscaler (2) | 2023.09.18 |
[AWS] CodePipeline을 통한 React CI / CD (2) | 2023.09.15 |