Search

OpenTelemetry

ENV

EKS_CLUSTER_NAME="<CLUSTER_NAME>" EKS_NODE_GROUP_NAME="<NODE_GROUP_NAME>" NODE_GROUP_ROLE_NAME=$(aws eks describe-nodegroup --cluster-name $EKS_CLUSTER_NAME --nodegroup-name $EKS_NODE_GROUP_NAME --query "nodegroup.nodeRole" --output text | cut -d'/' -f2-) AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query "Account" --output text)
Shell
복사

CERT MANAGER

kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.16.0/cert-manager.crds.yaml kubectl create ns cert-manager helm repo add jetstack https://charts.jetstack.io helm repo update helm install \ cert-manager jetstack/cert-manager \ --namespace cert-manager \ --version 1.16.0
Shell
복사
kubectl get pods -n cert-manager
Shell
복사

Opentelemetry Operator

kubectl apply -f https://github.com/open-telemetry/opentelemetry-operator/releases/latest/download/opentelemetry-operator.yaml
Shell
복사
kubectl get pods -n opentelemetry-operator-system
Shell
복사

Grafana Tempo Create

Create Policy

cat << EOF > tempo-s3-policy.json { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:ListBucket", "s3:GetObject", "s3:PutObject" ], "Resource": [ "arn:aws:s3:::skills-tracing-bucket", "arn:aws:s3:::skills-tracing-bucket/*" ] } ] } EOF
JSON
복사
aws iam create-policy \ --policy-name TempoS3AccessPolicy \ --policy-document file://tempo-s3-policy.json
Shell
복사
aws iam attach-role-policy \ --role-name $NODE_GROUP_ROLE_NAME \ --policy-arn arn:aws:iam::$AWS_ACCOUNT_ID:policy/TempoS3AccessPolicy # aws iam list-attached-role-policies --role-name $NODE_GROUP_ROLE_NAME --query "AttachedPolicies[].PolicyArn" --output text
Shell
복사
tempo-helm-values.yaml
global_overrides: metrics_generator_processors: - service-graphs metricsGenerator: config: storage: remote_write: - send_exemplars: true url: http://mimir-nginx.mimir.svc:80/api/v1/push enabled: true storage: trace: backend: s3 s3: bucket: skills-tracing-bucket endpoint: s3.ap-northeast-2.amazonaws.com prefix: tempo traces: otlp: grpc: enabled: true http: enabled: true
YAML
복사
helm repo add grafana https://grafana.github.io/helm-charts helm repo update helm upgrade --install tempo grafana/tempo-distributed -n tempo --create-namespace --values tempo-helm-values.yaml
Shell
복사

OTel Collector Setting

kubectl create ns otel
Shell
복사
otel-collector-config.yaml
apiVersion: opentelemetry.io/v1alpha1 kind: OpenTelemetryCollector metadata: name: demo-collector namespace: otel spec: mode: deployment config: | exporters: prometheusremotewrite: endpoint: "http://mimir-nginx.mimir.svc:80/api/v1/push" otlp: endpoint: tempo-distributor.tempo.svc.cluster.local:4317 tls: insecure: true processors: batch: {} memory_limiter: check_interval: 5s limit_percentage: 80 spike_limit_percentage: 25 receivers: otlp: protocols: http: grpc: service: pipelines: traces: exporters: - otlp processors: - memory_limiter - batch receivers: - otlp metrics: exporters: - prometheusremotewrite processors: - memory_limiter - batch receivers: - otlp
YAML
복사
kubectl apply -f otel-collector-config.yaml
Shell
복사

OTel Instrumentation Setting

otel-instrumentation.yaml
apiVersion: opentelemetry.io/v1alpha1 kind: Instrumentation metadata: name: demo-instrumentation namespace: otel spec: exporter: endpoint: http://demo-collector.otel.svc.cluster.local:4317 propagators: - tracecontext - baggage sampler: argument: "1" type: parentbased_traceidratio java: image: ghcr.io/open-telemetry/opentelemetry-operator/autoinstrumentation-java:1.32.1 resources: limits: cpu: 500m memory: 64Mi requests: cpu: 50m memory: 64Mi nodejs: image: ghcr.io/open-telemetry/opentelemetry-operator/autoinstrumentation-nodejs:0.46.0 python: image: ghcr.io/open-telemetry/opentelemetry-operator/autoinstrumentation-python:0.43b0
YAML
복사
kubectl apply -f otel-instrumentation.yaml
Shell
복사

애플리케이션에 Instrumentation 적용

deployment.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: demo-app namespace: default spec: replicas: 1 selector: matchLabels: app: demo-app template: metadata: labels: app: demo-app annotations: instrumentation.opentelemetry.io/inject-java: otel/demo-instrumentation spec: containers: - name: demo-app image: 362708816803.dkr.ecr.ap-northeast-2.amazonaws.com/demo:latest ports: - containerPort: 8080
YAML
복사
kubectl apply -f deployment.yaml
Shell
복사

Grafana

kubectl create namespace grafana
Shell
복사
helm repo add grafana https://grafana.github.io/helm-charts helm repo update helm install grafana grafana/grafana \ --namespace grafana \ --set persistence.enabled=false \ --set adminPassword='admin1234' \ --set service.type=ClusterIP
Shell
복사

Grafana Web Setting

Connections > Data sources > Add data source > Tempo 선택 후 아래의 URL 입력 & Save Test
http://tempo-query-frontend-discovery.tempo.svc.cluster.local:3100
Shell
복사
추후에 Explore 창에서 실습하기.