Kodeloka
  1. Kodeloka
  2. Kelas OpenTelemetry
  3. Materi

4 · Produksi · Modul 7 dari 8

Penerapan di Kubernetes

Menjalankan Collector di klaster, menyuntik instrumentasi otomatis, dan memperkaya telemetri dengan metadata pod.

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]
💡 k8sattributes menghemat banyak instrumentasi manual

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.

⚠️ Penyuntikan hanya terjadi saat pod dibuat

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
🚫 memory_limiter harus lebih rendah dari batas memori container

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.

⚠️ Jangan menyetel CPU limit pada Collector

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'