Netdata ile Kubernetes Cluster İzleme
Kubernetes cluster’ı izlemek, production ortamında hayatta kalmanın temel koşullarından biri. Pod’lar sürekli ölüp yeniden doğuyor, node’lar kaynak açısından strese giriyor, network trafiği beklenmedik şekillerde artıyor. Bu kaotik ortamda Netdata, hem gerçek zamanlı görünürlük hem de düşük kaynak tüketimiyle öne çıkan güçlü bir alternatif. Prometheus + Grafana stack’ine kıyasla kurulumu çok daha hızlı, built-in dashboard’ları hazır kullanıma uygun ve Kubernetes için özel olarak tasarlanmış agent mimarisi sayesinde cluster’ın her köşesini izleyebiliyorsunuz.
Netdata’nın Kubernetes’teki Mimarisi
Netdata’yı Kubernetes’te çalıştırmanın iki temel bileşeni var: Netdata Agent ve Netdata Parent. Agent’lar her node üzerinde DaemonSet olarak çalışır ve o node’daki tüm container metriklerini, sistem metriklerini ve Kubernetes API metriklerini toplar. Parent ise merkezi bir Deployment olarak çalışır ve tüm agent’lardan gelen veriyi birleştirerek tek bir görünüm sunar.
Bu mimari sayesinde:
- Her node kendi metriklerini kendi başına toplayabilir, ağır bir merkezi toplama yükü olmaz
- Agent’lar birbirinden bağımsız çalıştığı için tek bir node arızalanınca tüm izleme sistemi çökmez
- Netdata Cloud’a bağlanarak tüm cluster’ı tek bir arayüzden yönetebilirsiniz
- cgroups entegrasyonu sayesinde container başına CPU, RAM, network ve disk metrikleri otomatik yakalanır
Pratik açıdan bakarsak, bir node’da 50 pod çalışsa bile Netdata Agent o node’da genellikle 100-150 MB RAM ve minimal CPU kullanır. Bu, resource-constrained ortamlarda büyük avantaj sağlıyor.
Kurulum Öncesi Hazırlık
Helm üzerinden kurulum yapacağız, dolayısıyla önce birkaç ön koşulu kontrol etmeliyiz.
# Helm versiyonunu kontrol et
helm version
# kubectl bağlantısını doğrula
kubectl cluster-info
# Namespace oluştur
kubectl create namespace netdata
# Helm repo ekle
helm repo add netdata https://netdata.github.io/helmchart/
helm repo update
Netdata Cloud’u kullanacaksanız, önce cloud.netdata.cloud adresinden bir hesap açıp claim token almanız gerekiyor. Bu token, agent’larınızı cloud hesabınıza bağlamak için kullanılıyor. Token olmadan da çalışır ama o zaman cluster dışından erişim için kendiniz bir ingress veya port-forward ayarlamanız gerekir.
Helm ile Temel Kurulum
Önce varsayılan values dosyasını indirip üzerinde çalışalım:
helm show values netdata/netdata > netdata-values.yaml
Aşağıdaki yapılandırma, production ortamı için iyi bir başlangıç noktası:
# netdata-values.yaml
replicaCount: 1
image:
repository: netdata/netdata
tag: stable
pullPolicy: Always
sd:
image:
tag: latest
child:
enabled: true
configmap:
name: netdata-child-sd-config
key: config.yml
resources:
requests:
cpu: 50m
memory: 100Mi
limits:
cpu: 200m
memory: 300Mi
parent:
resources:
requests:
cpu: 400m
memory: 512Mi
limits:
cpu: 2000m
memory: 2Gi
database:
storageclass: standard
volumesize: 10Gi
alarms:
storageclass: standard
volumesize: 1Gi
child:
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 512Mi
configs:
netdata:
enabled: true
path: /etc/netdata/netdata.conf
data: |
[global]
memory mode = ram
history = 3600
[health]
enabled = yes
[plugins]
cgroups = yes
proc = yes
diskspace = yes
claiming:
enabled: true
token: "BURAYA_CLAIM_TOKEN_YAZIN"
rooms: "ROOM_ID"
url: "https://app.netdata.cloud"
Kurulumu başlatalım:
helm install netdata netdata/netdata
--namespace netdata
--values netdata-values.yaml
--wait
--timeout 5m
Kurulumun durumunu kontrol edelim:
# Pod'ların durumunu izle
kubectl get pods -n netdata -w
# DaemonSet durumunu kontrol et
kubectl get daemonset -n netdata
# Parent deployment'ı kontrol et
kubectl get deployment -n netdata
Kubernetes Metrics Server Entegrasyonu
Netdata’nın Kubernetes-spesifik metrikleri toplayabilmesi için kube-state-metrics ve metrics-server’ın cluster’da çalışıyor olması gerekiyor. Eğer henüz kurulu değilse:
# kube-state-metrics kurulumu
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install kube-state-metrics prometheus-community/kube-state-metrics
--namespace kube-system
--set resources.requests.memory=64Mi
--set resources.requests.cpu=10m
# Metrics server kurulumu (eğer yoksa)
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
Netdata bu bileşenleri otomatik olarak discover etmez, konfigürasyonda belirtmemiz gerekiyor. Child node konfigürasyonuna şunu ekliyoruz:
# values.yaml içindeki child.configs bölümüne ekle
child:
configs:
kubestatemetrics:
enabled: true
path: /etc/netdata/go.d/k8s_kubeproxy.conf
data: |
jobs:
- name: kube-state-metrics
url: http://kube-state-metrics.kube-system.svc.cluster.local:8080/metrics
Değişiklikleri uygulayalım:
helm upgrade netdata netdata/netdata
--namespace netdata
--values netdata-values.yaml
RBAC Konfigürasyonu
Netdata’nın Kubernetes API’sine erişmesi için doğru RBAC izinleri şart. Helm chart bu konfigürasyonu otomatik oluşturuyor ama bazı durumlarda özelleştirme gerekebiliyor. Özellikle pod metadata’sına erişim ve node bilgilerini okuma için:
# Mevcut RBAC konfigürasyonunu kontrol et
kubectl get clusterrole netdata -o yaml
kubectl get clusterrolebinding netdata -o yaml
# Eğer eksik izinler varsa patch uygula
kubectl patch clusterrole netdata --type='json' -p='[
{
"op": "add",
"path": "/rules/-",
"value": {
"apiGroups": [""],
"resources": ["pods", "nodes", "services", "endpoints"],
"verbs": ["get", "list", "watch"]
}
}
]'
Genellikle bu adım gerekmez, ama eğer Netdata dashboard’unda pod metrikleri görünmüyorsa RBAC’ı kontrol etmek iyi bir başlangıç noktası.
Custom Alarm Tanımlamaları
Built-in alarmlar çoğu senaryo için yeterli ama production’da daha granüler kontrol istiyorsunuz. Örneğin, belirli bir namespace’deki pod’ların restart sayısını izlemek veya kritik servislerin container CPU kullanımı için özel eşikler koymak gibi.
# netdata-custom-alarms.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: netdata-custom-alarms
namespace: netdata
data:
k8s.conf: |
# Pod restart sayısı alarmı
alarm: k8s_pod_restart_rate
on: k8s.pod.restarts
lookup: sum -5m
units: restarts
every: 1m
warn: $this > 3
crit: $this > 10
info: Kubernetes pod restart sayısı son 5 dakikada yüksek
to: sysadmin
# Node bellek kullanımı
alarm: k8s_node_memory_high
on: system.ram
lookup: average -2m percentage used
units: %
every: 1m
warn: $this > 80
crit: $this > 90
info: Node bellek kullanımı kritik seviyede
to: sysadmin
kubectl apply -f netdata-custom-alarms.yaml
# ConfigMap'i agent pod'una mount etmek için values.yaml'ı güncelle
# child.configs altına ekle:
# alarms:
# enabled: true
# path: /etc/netdata/health.d/k8s.conf
# data: |
# # alarm içeriği buraya
Slack Entegrasyonu ile Alarm Bildirimleri
Alarm geldiğinde doğrudan Slack’e bildirim gitmesi için notification konfigürasyonu yapalım. Bu kısım production’da hayat kurtarıyor:
# values.yaml içine eklenecek parent konfigürasyonu
parent:
configs:
netdata:
enabled: true
path: /etc/netdata/netdata.conf
data: |
[global]
hostname = k8s-netdata-parent
[health]
enabled = yes
default recipient = admin
alarms:
enabled: true
path: /etc/netdata/health_alarm_notify.conf
data: |
SEND_SLACK="YES"
SLACK_WEBHOOK_URL="https://hooks.slack.com/services/XXXX/YYYY/ZZZZ"
DEFAULT_RECIPIENT_SLACK="#alerts-kubernetes"
SEND_EMAIL="NO"
# Sadece kritik alarmlar için pagerduty
SEND_PAGERDUTY="YES"
PAGERDUTY_SERVICE_KEY="buraya_pagerduty_key"
Değişiklikleri push ettikten sonra alarm testi yapalım:
# Parent pod'una gir
kubectl exec -it -n netdata
$(kubectl get pod -n netdata -l app=netdata,role=parent -o jsonpath='{.items[0].metadata.name}')
-- /bin/bash
# Alarm testi gönder
/usr/libexec/netdata/plugins.d/alarm-notify.sh test slack
Log ve Troubleshooting
İzleme sisteminde bir şeyler ters gittiğinde nereye bakacağınızı bilmek çok önemli:
# Parent loglarını kontrol et
kubectl logs -n netdata
$(kubectl get pod -n netdata -l app=netdata,role=parent -o jsonpath='{.items[0].metadata.name}')
--tail=100 -f
# Belirli bir node'daki child agent loglarını gör
kubectl logs -n netdata
$(kubectl get pod -n netdata -l app=netdata,role=child -o jsonpath='{.items[0].metadata.name}')
--tail=100
# Tüm child pod'larının durumunu listele
kubectl get pods -n netdata -l role=child -o wide
# Agent'ın topladığı metrikleri doğrula
kubectl port-forward -n netdata
$(kubectl get pod -n netdata -l app=netdata,role=parent -o jsonpath='{.items[0].metadata.name}')
19999:19999
# Tarayıcıda aç: http://localhost:19999
Sık karşılaşılan bir sorun: child agent’lar parent’a bağlanamıyor. Bu durumda genellikle network policy sorunları veya service DNS çözümlemesi hataları oluyor. Kontrol listesi:
- NetworkPolicy: netdata namespace’ine gelen trafiği bloke eden bir policy var mı?
- Service DNS:
kubectl execile agent pod’una giripnslookup netdata.netdata.svc.cluster.localçalıştırın - Port Çakışması: 19999 portu başka bir uygulama tarafından kullanılıyor olabilir
- Resource Limits: Child agent’lar memory limit’e çarpıyorsa
kubectl describe podçıktısında OOMKilled göreceksiniz
Gerçek Dünya Senaryosu: Memory Leak Tespiti
Production’da sık yaşanan bir senaryo: belirli bir deployment’ın pod’ları zamanla artan bellek tüketiyor, eventual olarak OOMKilled alıyor ve restart ediyor. Bu pattern’i Netdata ile nasıl tespit edip izolasyonu yapıyoruz?
Önce namespace bazında aggregate bellek kullanımını izliyoruz. Netdata’nın Kubernetes dashboard’unda container başına memory grafiklerini açın. Belirli bir container’ın grafiği düzenli artış gösteriyorsa ve restart sonrası sıfırlanıyorsa klasik memory leak belirtisi.
Bu durumda şu alarm konfigürasyonunu ekliyoruz:
# memory-leak-detection.conf
alarm: container_memory_growth
on: k8s.cgroup.mem_usage
lookup: max -30m, min -1h
units: MiB
every: 5m
warn: $this > 100
crit: $this > 200
info: Container bellek kullanımı son 30 dakikada hızla artıyor, memory leak şüphesi
to: sysadmin
Bu alarm, son 30 dakikanın maksimum değeri ile önceki saatin minimum değeri arasındaki farkı ölçüyor. Fark 100 MiB’ı geçerse warning, 200 MiB’ı geçerse critical alarm tetikleniyor.
Ingress Kontrolcüsü Metrikleri
NGINX Ingress Controller veya Traefik kullanan cluster’larda HTTP request metrics’i de izlemek isteyebilirsiniz. Netdata’nın go.d plugin’i bu konuda oldukça yetenekli:
# ingress-nginx-monitoring.yaml
child:
configs:
nginxvts:
enabled: true
path: /etc/netdata/go.d/nginx.conf
data: |
jobs:
- name: ingress-nginx
url: http://ingress-nginx-controller-metrics.ingress-nginx.svc.cluster.local:10254/metrics
Bu konfigürasyon sayesinde Netdata’nın dashboard’unda şunları görebilirsiniz:
- Saniyedeki istek sayısı (RPS)
- HTTP durum kodu dağılımı (2xx, 4xx, 5xx)
- Upstream response time
- Active connection sayısı
PersistentVolume ve Depolama İzleme
Storage sorunları Kubernetes’te sıkça can sıkıyor, özellikle PVC’ler dolarsa pod’lar crash loop’a giriyor. Netdata disk metrikleri bu konuda yardımcı olabilir ama doğrudan PVC kapasitesi için kube-state-metrics’ten veri almak daha güvenilir:
# kube-state-metrics'in PVC metriklerini expose ettiğini doğrula
kubectl port-forward svc/kube-state-metrics -n kube-system 8080:8080 &
curl -s http://localhost:8080/metrics | grep kube_persistentvolumeclaim_resource_requests_storage_bytes | head -5
# Netdata'nın bu metrikleri çektiğini kontrol et
kubectl exec -it -n netdata
$(kubectl get pod -n netdata -l role=child -o jsonpath='{.items[0].metadata.name}')
-- curl -s http://localhost:19999/api/v1/charts | python3 -m json.tool | grep -i "pvc|persistent"
Performans Tuning
Büyük cluster’larda (50+ node) Netdata Parent pod’u ciddi kaynak tüketebilir. Birkaç optimizasyon önerisi:
Retention süresi ayarı: Parent’ta veri ne kadar süre tutulacak? Uzun retention = daha fazla disk ve RAM.
parent:
configs:
netdata:
data: |
[global]
# RAM'de 4 saat, disk'te 1 ay tut
memory mode = dbengine
page cache size = 256
dbengine multihost disk space = 10240
[db]
storage tiers = 3
# Tier 0: saniyede bir nokta, 14 gün
# Tier 1: dakikada bir nokta, 3 ay
# Tier 2: saatte bir nokta, 2 yıl
Streaming compression: Agent ile parent arasındaki veri akışını sıkıştırarak network kullanımını azaltabilirsiniz:
child:
configs:
stream:
enabled: true
path: /etc/netdata/stream.conf
data: |
[stream]
enabled = yes
destination = netdata:19999
api key = BURAYA_API_KEY
send charts matching = *
compression algorithms order = lz4 zstd brotli gzip
Scrape interval optimizasyonu: Her şeyi saniyede bir toplamak gerekmeyebilir. Önemsiz metrikler için intervali artırın:
child:
configs:
netdata:
data: |
[plugins]
python.d = no
charts.d = no
[plugin:cgroups]
update every = 2
[plugin:proc:/proc/diskstats]
update every = 5
Netdata Cloud ile Merkezi Yönetim
Birden fazla Kubernetes cluster’ı yönetiyorsanız Netdata Cloud kaçınılmaz hale geliyor. Her cluster için ayrı ayrı dashboard açmak yerine tek bir arayüzde tüm cluster’ları görebiliyorsunuz.
# Claim token ile mevcut kurulumu cloud'a bağla
kubectl patch configmap netdata-conf -n netdata --type merge -p '{
"data": {
"claiming": "enabled = yesntoken = TOKEN_BURAYAnrooms = ROOM_IDnurl = https://app.netdata.cloudn"
}
}'
# Pod'ları yeniden başlat
kubectl rollout restart daemonset/netdata -n netdata
kubectl rollout restart deployment/netdata -n netdata
# Bağlantı durumunu kontrol et
kubectl logs -n netdata
$(kubectl get pod -n netdata -l role=parent -o jsonpath='{.items[0].metadata.name}')
| grep -i "cloud|claim|connect"
Cloud bağlantısı kurulduktan sonra Netdata Rooms özelliğini kullanarak farklı cluster’ları veya farklı ortamları (production, staging, dev) gruplandırabilirsiniz. Her room için ayrı alarm politikaları tanımlayabilmek production operasyonlarını önemli ölçüde kolaylaştırıyor.
Monitoring Stack Karşılaştırması
Netdata’yı tercih etmek için geçerli nedenler var ama her araç gibi bazı kısıtları da mevcut:
- Kurulum süresi: Netdata 15-20 dakika, Prometheus + Grafana 1-2 saat
- Built-in dashboard: Netdata’da hazır gelir, Grafana’da dashboard import veya oluşturma gerekir
- Özelleştirme esnekliği: Grafana çok daha güçlü ama karmaşıklık da o kadar fazla
- Long-term storage: Netdata’nın TSDB’si yeterli ama Thanos veya Cortex gibi uzun vadeli depolama için Prometheus ekosistemi daha olgun
- Mevcut ekosistem entegrasyonu: Prometheus exporter’ları zaten varsa Prometheus’u tercih etmek mantıklı
Startup veya küçük/orta ölçekli ekipler için Netdata mükemmel bir tercih. Büyük organizasyonlarda her ikisini birlikte kullanmak da mümkün; Netdata gerçek zamanlı debugging ve anomali tespiti için, Prometheus ise uzun vadeli trend analizi ve SLO takibi için.
Sonuç
Netdata ile Kubernetes cluster izlemek, kurulum kolaylığı ve düşük öğrenme eğrisiyle ciddi zaman tasarrufu sağlıyor. DaemonSet mimarisi sayesinde her node kendi metriklerini topluyor, parent pod tüm veriyi birleştiriyor ve Netdata Cloud üzerinden tüm cluster’a tek noktadan bakış imkanı sunuyor.
Bu yazıda anlattığımız adımları özetlersek:
- Helm ile temel kurulum ve namespace hazırlığı
- kube-state-metrics ve metrics-server entegrasyonu
- RBAC konfigürasyonu ve erişim yönetimi
- Custom alarm tanımlamaları ve Slack bildirimleri
- Memory leak tespiti gibi gerçek dünya senaryoları
- Ingress ve storage izleme
- Büyük cluster’lar için performans optimizasyonu
Production’a geçmeden önce staging ortamında test edin, özellikle resource limit’lerini cluster boyutunuza göre ayarlayın. İlk kurulumdan sonra birkaç gün boyunca Netdata’nın kendi kaynak tüketimini de gözlemleyin; bazı ortamlarda child agent’ların memory limit’lerini biraz artırmanız gerekebilir.
En kritik nokta: alarmları doğru eşiklerle yapılandırmak. Çok hassas alarmlar alarm yorgunluğu yaratır, çok gevşek alarmlar sorunları gözden kaçırmanıza neden olur. İlk birkaç hafta baseline metrikleri toplayın, sonra gerçek eşikleri belirleyin. Netdata’nın anomaly detection özelliği de bu konuda yardımcı olabilir; makine öğrenimi tabanlı analizle normal davranıştan sapmalar otomatik olarak raporlanıyor.
