EKS ADOT(AWS Distro for OpenTelemetry)
EKS ADOT를 사용하기에 앞서 해당 Add-On이 어떤 것인지 이해하기 위한 정보를 먼저 찾아보았다.
APM(Application Performance Monitoring) 이란?
서비스 중인 어플리케이션의 성능과 장애 등을 진단하는데 사용하는 도구이다.
APM을 통해서 어플리케이션의 어느 부분에서 지연이 발생하는지 추적하고 개선하는데 사용되며,
주로 아래와 같은 기능을 포함한다.
- 성능 메트릭 : APM 도구는 요청 수, 응답 시간 및 오류 수와 같은 애플리케이션의 다양한 성능 메트릭을 모니터링할 수 있다.
- 트랜잭션 추적 : APM 도구는 애플리케이션의 트랜잭션을 추적하여 애플리케이션의 성능 병목 현상과 문제를 식별할 수 있다.
- 디버깅 정보 : APM 도구는 개발자가 애플리케이션의 문제를 이해하고 해결하는 데 도움이 되는 상세한 디버깅 정보를 제공할 수 있다.
- 경보 및 알림 : APM 도구는 성능 문제가 발생할 때 사용자에게 경고하고 알려준다.
https://www.g2.com/ 라는 소프트웨어 비교 사이트를 통해서 확인해보면 정말 다양한 APM 도구들이 존재하는 것을 볼 수 있다.
- G2 사이트의 측정 점수는 해당 사이트 리뷰 별점으로 매긴 것이므로 국내에서의 트렌드와는 차이가 있을 수 있다.
- 각 도구 별 장단점이 있기 때문에 도입하려 서비스의 규모와 확장성 등을 고려해서 선택하는게 더 중요하다.
OpenTelemetry란?
Cloud, SaaS와 같은 환경이 주가 되기전에 앞서 본 APM 제품을 서비스에 도입하려고 하면
기동하는 서비스에 APM 라이브러리를 심는다던가, 소스코드에 APM을 호출하는 코드를 추가한다던가, 모니터링을 위한 APM Agent를 설치하는 등 작업이 필요했다.
또한 이러한 작업 후에 APM 도구를 사용했는데 만족스럽지 않아 다른 도구로 전환하고자하면 이미 추가한 라이브러리를 교체하고, 소스코드를 변경하는 등의 작업이 발생한다.
즉 모니터링을 위한 다양한 APM 도구들이 존재하고 각 APM 도구 별 프로토콜이나 수집 데이터 형식 등이 천차만별이기에, 한번 구축하면 APM 벤더에 종속적이 되어버리는 경우가 발생했다.
이런 벤더 종속성을 제거하고 표준을 정립하려는 움직임으로 Cloud community가 2가지 open-source project를 만들었다.
- OpenTracing (CNCF project) : 애플리케이션 트랜잭션을 추적하기 위한 오픈 소스 표준
- OpenCensus (Google Open Source community project) : 애플리케이션에서 계측 데이터를 생성하기 위한 오픈 소스 표준
이 2개의 프로젝트는 둘다 표준을 지향하고, 다른 방향에서의 APM 표준을 목표로 한다는 점에서 비슷한데
결국 2019년에 OpenTelemetry 프로젝트로 통합되었다.
- OpenTelemetry : 이 두 프로젝트를 통합하여 애플리케이션에서 데이터를 수집하기 위한 단일 오픈 소스 표준을 제공
- https://www.cncf.io/projects/opentelemetry/
그림을 보면 기존 APM 도구들이 수행하던 Collector 역할이나 Agent 역할은 존재하는데
데이터를 보관하고, 가공해주고 모니터링하는 시각화(Visualization) 역할이 없는 것을 할 수 있다.
이 Visualization 역할을 각 APM도구의 Back-End 단을 통해서 수행하는 것이고
OpenTelemetry는 모니터링에 핵심인 데이터 수집 부분에 대한 표준 API, SDK만 제공하는 것이다.
따라서 OpenTelemetry를 구축하면 일종의 소스코드 변경이나 라이브러리 추가를 한번만 하면,
데이터를 수집하고 가공해서 보여주는 각 APM 도구의 Back-End(단, OpenTelemetry 표준을 준수하는 도구)를 얼마든지 교체해서 사용할 수 있게 된다는 뜻이다.
EKS ADOT(AWS Distro for OpenTelemetry)란?
AWS에서도 OpenTelemetry 지원을 하고 있는데,
EKS에서 Add-On을 통해 OpenTelemetry를 설치하고 관련 메트릭을 다른 곳으로 전달할 수 있다.
https://aws.amazon.com/ko/about-aws/whats-new/2022/04/eks-opentelemetry-operator-now-available/
EKS Add-On ADOT 사용해보기
EKS에서 ADOT Operator를 Add-On으로 제공한다.
ADOT를 설치하면 다양한 Back-End로 Metric 정보를 전달할 수 있는데 AWS에서는 CloudWatch나 X-Ray, Amazon Managed Service for Prometheus(AMP) 에서 해당 정보를 조회할 수 있도록 제공한다.
EKS Add-On ADOT 설치
설치 요구사항
- kubectl 이 설치되어있어야 한다.
- eksctl 이 설치되어있어야 한다.
- Kubernetes version 1.21 이상
- AWS CLI v2 가 설치되어있어야 한다.
- TLS인증을 위해 cert-manager가 설치되어있어야 한다.
# 설치 요구사항 확인 및 설치
(test_admin@myeks:N/A) [root@myeks-bastion-EC2 ~]# kubectl version --short
Flag --short has been deprecated, and will be removed in the future. The --short output will become the default.
Client Version: v1.25.7-eks-a59e1f0
Kustomize Version: v4.5.7
Server Version: v1.24.13-eks-0a21954
(test_admin@myeks:N/A) [root@myeks-bastion-EC2 ~]# eksctl version
0.141.0
(test_admin@myeks:N/A) [root@myeks-bastion-EC2 ~]# aws --version
aws-cli/2.11.21 Python/3.11.3 Linux/4.14.313-235.533.amzn2.x86_64 exe/x86_64.amzn.2 prompt/off
# cert-manager 설치
curl -OL https://github.com/cert-manager/cert-manager/releases/download/v1.8.2/cert-manager.yaml
kubectl apply -f cert-manager.yaml
(test_admin@myeks:N/A) [root@myeks-bastion-EC2 ~]# kubectl get pod -n cert-manager
NAME READY STATUS RESTARTS AGE
cert-manager-6dd9658548-xvdt5 1/1 Running 0 29s
cert-manager-cainjector-5987875fc7-bld7m 1/1 Running 0 29s
cert-manager-webhook-7b4c5f579b-rp54t 1/1 Running 0 29s
# 현재 EKS에서 설치 가능한 ADOT 버전 확인
aws eks describe-addon-versions --addon-name adot --kubernetes-version 1.24 \
--query "addons[].addonVersions[].[addonVersion, compatibilities[].defaultVersion]" --output text
v0.74.0-eksbuild.1
True
v0.70.0-eksbuild.1
False
...
# 만약 v0.62.1 이하의 Add-On 버전을 사용하면 아래의 추가 권한 필요
kubectl apply -f https://amazon-eks.s3.amazonaws.com/docs/addons-otel-permissions.yaml
IAM 역할 부여
eksctl create iamserviceaccount \
--name adot-collector \
--namespace default \
--cluster <cluster_name> \
# Amazon Managed Service for Prometheus(AMP) 나
# AWS CloudWatch로 조회할 경우 각각 필요한 권한을 추가한다.
# --attach-policy-arn arn:aws:iam::aws:policy/AmazonPrometheusRemoteWriteAccess \
--attach-policy-arn arn:aws:iam::aws:policy/AWSXrayWriteOnlyAccess \
# --attach-policy-arn arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy \
--approve \
--override-existing-serviceaccounts
# 명령어 수행 시 Cloudformation 스택이 생성된다.
설치 명령어
# 설치 명령어
aws eks create-addon --addon-name adot --cluster-name <cluster_name> [--configuration-values]
(test_admin@myeks:N/A) [root@myeks-bastion-EC2 ~]# aws eks create-addon --addon-name adot --cluster-name myeks
{
"addon": {
"addonName": "adot",
"clusterName": "myeks",
"status": "CREATING",
"addonVersion": "v0.74.0-eksbuild.1",
...
"tags": {}
}
}
# 설치 확인
aws eks describe-addon --addon-name adot --cluster-name <cluster_name>
(test_admin@myeks:N/A) [root@myeks-bastion-EC2 ~]# aws eks describe-addon --addon-name adot --cluster-name myeks
{
"addon": {
"addonName": "adot",
"clusterName": "myeks",
"status": "ACTIVE",
"addonVersion": "v0.74.0-eksbuild.1",
"health": {
"issues": []
},
"addonArn": "arn:aws:eks:ap-northeast-2:~~~:addon/myeks/adot/4ac41ce4-27ad-2586-3739-9346cb3ef32b",
"createdAt": "2023-05-21T00:30:09.266000+09:00",
"modifiedAt": "2023-05-21T00:30:57.314000+09:00",
"tags": {}
}
}
(test_admin@myeks:N/A) [root@myeks-bastion-EC2 ~]# kubectl get pod -n opentelemetry-operator-system
NAME READY STATUS RESTARTS AGE
opentelemetry-operator-7858c9dbbb-d7w5k 2/2 Running 0 25m
설치 시 configuration 값을 옵션으로 전달해 CPU 제한 등을 설정할 수 있지만, 이번 테스트에서는 사용하지 않았다.
(참조 : https://aws-otel.github.io/docs/getting-started/adot-eks-add-on/add-on-configuration
X-Ray용 ADOT Collector 배포
어플리케이션에서 OTEL을 통해 Metric을 만들었다고해도 해당 Metric을 수신할 Collector가 필요하다.
해당 Collector에서 Metric을 수신하면 X-Ray로 전달한다.
# ADOT Collector 배포파일 다운로드
curl -OL https://raw.githubusercontent.com/aws-observability/aws-otel-community/master/sample-configs/operator/collector-config-xray.yaml
# 배포 파일 설정 수정
26 exporters:
27 awsxray:
28 region: <YOUR_AWS_REGION> # 현재 사용 중인 Region
# ADOT Collector 배포
kubectl apply -f collector-config-xray.yaml
(test_admin@myeks:N/A) [root@myeks-bastion-EC2 ~]# kubectl apply -f collector-config-xray.yaml
opentelemetrycollector.opentelemetry.io/my-collector-xray created
# 배포 확인
(test_admin@myeks:N/A) [root@myeks-bastion-EC2 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
my-collector-xray-collector-8f8f749bd-p7hjw 1/1 Running 0 23s
# Endpoints 확인
(test_admin@myeks:N/A) [root@myeks-bastion-EC2 ~]# kubectl get endpoints
NAME ENDPOINTS AGE
kubernetes 192.168.1.119:443,192.168.2.155:443 3h7m
my-collector-xray-collector 192.168.1.183:4317,192.168.1.183:4318 2m26s
my-collector-xray-collector-headless 192.168.1.183:4317,192.168.1.183:4318 2m26s
my-collector-xray-collector-monitoring 192.168.1.183:8888 2m26s
모니터링 샘플 어플리케이션 배포
# 트래픽 생성기 Pod 배포
# curl sample-app:4567로 계속 트래픽을 발생시키는 Pod
curl -OL https://raw.githubusercontent.com/aws-observability/aws-otel-community/master/sample-configs/traffic-generator.yaml
kubectl apply -f traffic-generator.yaml
# 모니터링 대상이 되는 어플리케이션 Pod 배포
# 해당 어플리케이션에 OpenTelemetry가 추가된다.
curl -OL https://raw.githubusercontent.com/aws-observability/aws-otel-community/master/sample-configs/sample-app.yaml
34 spec:
35 containers:
36 - env:
37 - name: AWS_REGION
38 value: <YOUR_AWS_REGION> # <-- 구축한 Region으로 변경
39 - name: LISTEN_ADDRESS
40 value: 0.0.0.0:4567 # <-- curl sample-app:4567의 트래픽 발생 대상
#### 아래와 같은 식으로 OTEL(OpenTelemetry)를 세팅해준다 ####
41 - name: OTEL_EXPORTER_OTLP_ENDPOINT # <-- 해당 Endpoint로 Metric을 전달한다.
42 value: http://my-collector-xray-collector:4317 # X-Ray Endpoint로 변경
43 - name: OTEL_RESOURCE_ATTRIBUTES
44 value: service.namespace=GettingStarted,service.name=GettingStartedService
45 image: public.ecr.aws/aws-otel-test/aws-otel-java-spark:1.17.0
46 name: sample-app
47 ports:
48 - containerPort: 4567
49 resources: {}
50 restartPolicy: Always
kubectl apply -f sample-app.yaml
# 트래픽 생성기와 어플리케이션 배포 후 확인
NAME READY STATUS RESTARTS AGE
my-collector-xray-collector-8f8f749bd-p7hjw 1/1 Running 0 90s
sample-app-68d96c9744-5r9xr 1/1 Running 0 5s
traffic-generator-667c8d8677-jvhp4 1/1 Running 0 12s
X-Ray에서 Trace 확인
CloudWatch의 X-Ray 기록 > 기록 에 보면 배포한 sample-app 에 대한 추적이 확인된다.
하단의 기록에서 각 기록을 클릭하면 호출별 지연과 호출과정 등을 확인할 수 있다.
EKS Add-On ADOT 삭제
삭제 과정 및 명령어
# 모니터링용 샘플 어플리케이션 삭제
kubectl delete -f traffic-generator.yaml
kubectl delete -f sample-app.yaml
# X-Ray Collector 삭제
kubectl delete -f collector-config-xray.yaml
# 추가한 IAM 삭제
eksctl delete iamserviceaccount \
--name adot-collector \
--namespace default \
--cluster myeks
# cert-manager 삭제
kubectl delete -f cert-manager.yaml
# ADOT addon 삭제
aws eks delete-addon --addon-name adot --cluster-name <cluster_name>
참고자료
- 애플리케이션 성능 관리 위키 : https://ko.wikipedia.org/wiki/애플리케이션_성능_관리
- Getting Started with AWS Distro for OpenTelemetry using EKS Add-Ons : https://aws-otel.github.io/docs/getting-started/adot-eks-add-on
- [OpenTelemetry] 2. OpenTelemetry란 무엇일까? : https://binux.tistory.com/151
- OpenTelemetry Operator for Kubernetes : https://opentelemetry.io/docs/k8s-operator/automatic/
- Metrics and traces collection using Amazon EKS add-ons for AWS Distro for OpenTelemetry : https://aws.amazon.com/ko/blogs/containers/metrics-and-traces-collection-using-amazon-eks-add-ons-for-aws-distro-for-opentelemetry/