Tiga Pola Penerapan
DaemonSet satu Collector per node
+ metadata node akurat, lalu lintas tetap di node
+ jumlah instans sebanding jumlah node
− beban node bertambah
Deployment kelompok Collector terpusat (gateway)
+ tempat sampling ekor dan kebijakan terpusat
+ mudah diskalakan terpisah
− satu lompatan jaringan tambahan
Sidecar satu Collector per pod
+ isolasi penuh antar beban kerja
− pemakaian sumber daya paling boros
Pola yang lazim di klaster berukuran menengah ke atas: DaemonSet sebagai agen yang mengumpulkan dan memperkaya, meneruskan ke Deployment gateway yang menangani sampling ekor dan pengiriman ke backend.
OpenTelemetry Operator
kubectl apply -f https://github.com/open-telemetry/opentelemetry-operator/releases/latest/download/opentelemetry-operator.yaml
apiVersion: opentelemetry.io/v1beta1
kind: OpenTelemetryCollector
metadata:
name: agen
spec:
mode: daemonset
config:
receivers:
otlp:
protocols:
grpc: { endpoint: 0.0.0.0:4317 }
processors:
k8sattributes:
auth_type: serviceAccount
extract:
metadata:
- k8s.namespace.name
- k8s.pod.name
- k8s.deployment.name
- k8s.node.name
batch: {}
exporters:
otlp:
endpoint: gateway-collector:4317
tls: { insecure: true }
service:
pipelines:
traces:
receivers: [otlp]
processors: [k8sattributes, batch]
exporters: [otlp]
Prosesor ini mencocokkan IP pengirim dengan pod di klaster, lalu menambahkan nama namespace, pod, deployment, dan node secara otomatis. Tanpanya, setiap aplikasi harus membaca metadata itu sendiri lewat Downward API dan menyetelnya di Resource — pekerjaan berulang di setiap layanan yang mudah terlupa.
Instrumentasi Otomatis Lewat Anotasi
apiVersion: opentelemetry.io/v1alpha1
kind: Instrumentation
metadata:
name: instrumentasi-bawaan
spec:
exporter:
endpoint: http://agen-collector:4317
propagators: [tracecontext, baggage]
sampler:
type: parentbased_traceidratio
argument: "0.25"
nodejs:
image: ghcr.io/open-telemetry/opentelemetry-operator/autoinstrumentation-nodejs:latest
apiVersion: apps/v1
kind: Deployment
metadata:
name: layanan-pesanan
spec:
template:
metadata:
annotations:
instrumentation.opentelemetry.io/inject-nodejs: "true"
Operator menambahkan init container yang menyalin pustaka instrumentasi ke volume bersama dan menyetel variabel lingkungan pada container aplikasi. Kode aplikasi maupun image-nya tidak berubah sama sekali.
Menambahkan anotasi pada Deployment yang sudah berjalan tidak menyentuh pod yang ada. Perlu peluncuran ulang agar webhook penyuntik ikut bekerja. Bila anotasi sudah dipasang tetapi telemetri tidak muncul, periksa dulu apakah pod-nya memang sudah dibuat ulang.
kubectl rollout restart deployment/layanan-pesanan
kubectl get pod -l app=layanan-pesanan -o jsonpath='{.items[0].spec.initContainers[*].name}'
Metadata dari Downward API
env:
- name: NODE_NAME
valueFrom:
fieldRef: { fieldPath: spec.nodeName }
- name: POD_NAME
valueFrom:
fieldRef: { fieldPath: metadata.name }
- name: OTEL_RESOURCE_ATTRIBUTES
value: "k8s.node.name=$(NODE_NAME),k8s.pod.name=$(POD_NAME)"
- name: OTEL_EXPORTER_OTLP_ENDPOINT
value: "http://$(NODE_NAME):4317"
Sumber Daya dan Ketahanan
resources:
requests: { cpu: 200m, memory: 400Mi }
limits: { memory: 800Mi }
# Dalam konfigurasi Collector
processors:
memory_limiter:
limit_mib: 600 # DI BAWAH limit container
spike_limit_mib: 150
Bila limit_mib disetel sama atau lebih tinggi dari batas container, kernel akan mematikan proses dengan OOM sebelum memory_limiter sempat menolak data masuk. Collector mati berulang, telemetri hilang setiap kali, dan penyebabnya sulit terbaca karena tidak ada catatan apa pun dari Collector sendiri. Sisakan margin sekitar 25 persen.
Pembatasan CPU menyebabkan throttling pada lonjakan lalu lintas, yang berarti antrean menumpuk lalu data dibuang — tepat ketika telemetri paling dibutuhkan. Tetapkan requests agar penjadwalan benar, dan biarkan Collector memakai CPU menganggur saat lonjakan terjadi.
Memeriksa Keadaan
kubectl get opentelemetrycollector kubectl logs -l app.kubernetes.io/name=agen-collector --tail=100 kubectl port-forward svc/gateway-collector 8888:8888 curl -s localhost:8888/metrics | grep -E 'refused|failed|queue_size'