Kubernetes v1.37’de Native Histogramlar Beta Oldu
Kubernetes v1.37 ile native histogram desteği Beta aşamasına yükseldi ve varsayılan olarak etkinleştirildi. Prometheus Native Histograms standardını kullanan özellik, Kubernetes metriklerinde daha yüksek çözünürlüklü gözlemlenebilirlik sağlıyor; klasik histogramlara kıyasla zaman serisi ve depolama yükünü azaltmayı amaçlıyor.
Klasik histogramların sınırları
Kubernetes’te istek gecikmeleri ve işlem süreleri gibi metrikler uzun süredir klasik Prometheus histogramlarıyla izleniyor. Bu modelde metrik yazarı, le etiketleriyle statik kova sınırları tanımlıyor. Örneğin bir histogramda 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5 ve 10 gibi değerler kullanılabiliyor.
Bu yaklaşımın üç temel sorunu var:
- Kova sınırlarını önceden tahmin etme zorunluluğu: İş yükünün gecikme profili değiştiğinde histogram yeterli görünürlük sağlamayabiliyor. Değerlerin mikrosaniye aralığına kayması veya uzun kuyruk gecikmelerinin en yüksek sınırı aşması buna örnek.
- Yüksek kardinalite ve depolama maliyeti: Her kova sınırı ayrı bir zaman serisi olarak dışa aktarılıyor. Çok sayıda etiket eklendiğinde zaman serisi sayısı artıyor, Prometheus ile TSDB üzerindeki yük de büyüyor.
- Nicelik hesaplamalarında enterpolasyon hatası:
histogram_quantile()statik kova sınırları arasında doğrusal enterpolasyon yapıyor. Kovalar geniş olduğunda yüzdelik değerlerin tahmini daha az doğru olabiliyor.
Native histogram nedir?
Prometheus native histogramları, kullanıcı tarafından önceden belirlenen statik kovalar yerine dinamik üstel kovalar kullanıyor. Native histogram, her kova sınırı için ayrı bir zaman serisi oluşturmak yerine pozitif ve negatif aralıkları, sıfır eşiğini ve üstel ölçekleme bilgilerini tek bir zaman serisinde taşıyor.
Bu modelin öne çıkan özellikleri şöyle:
- Üstel kovalar, nanosaniyelerden saatlere kadar farklı değer aralıklarına önceden sınır tanımlamadan uyum sağlayabiliyor.
- Kovaların yapılandırılmış aralıklar içinde birleştirilmesi, zaman serisi ve depolama yükünü yüzde 90’a kadar azaltabiliyor.
- Varsayılan ayarlarda nicelik hesaplamaları için en kötü durumda yaklaşık yüzde 5’lik bağıl hata sınırı sağlanıyor.
Kubernetes’te native histogramların çalışma modeli
Destek, Kubernetes’in ortak metrik altyapısı olan k8s.io/component-base/metrics paketine doğrudan eklendi. Kubernetes v1.37’de NativeHistograms özellik kapısı varsayılan olarak açık olduğundan bileşenler çift gösterim yapıyor.
Çift gösterim, mevcut gözlemlenebilirlik altyapılarıyla geriye dönük uyumluluğu koruyor:
- Klasik kovalar, yani
h.Bucketdeğerleri, native aralıklarla birlikte dışa aktarılmaya devam ediyor. - Native histogram bilgileri,
h.Schemaveh.PositiveSpanalanlarıyla Protobuf yüküne ekleniyor. - Geleneksel metin kazıma, klasik histogram kovalarını aktarmayı sürdürüyor.
Native histogram etkinleştirildiğinde ortak metrik paketi histogramlar için standart üstel ayarlar uyguluyor. BucketFactor: 1.1 değeri, her kovanın önceki kovadan en fazla yüzde 10 daha geniş olmasını sağlıyor. MaxBucketNumber: 160 ise histogram başına kova sayısını sınırlıyor; uç değer dağılımlarında bileşen belleğinin korunmasına yardımcı oluyor.
Bu entegrasyondan başlıca Kubernetes kontrol düzlemi ve düğüm bileşenleri yararlanıyor. Bunlar arasında kube-apiserver, kube-scheduler, kubelet, kube-controller-manager ve kube-proxy bulunuyor. Örnek metrikler arasında apiserver_request_duration_seconds, scheduler_plugin_execution_duration_seconds ve scheduler_scheduling_algorithm_duration_seconds yer alıyor.
Prometheus ile native histogramları kazıma
Kubernetes v1.37 native histogramları varsayılan olarak dışa aktardığından Prometheus yapılandırması kullanılan sürüme göre değişiyor. Prometheus 3.0 ve üzeri için iş bazında açık yapılandırma kullanılması öneriliyor:
scrape_configs:
- job_name: 'kubernetes-apiservers'
scrape_native_histograms: true
always_scrape_classic_histograms: true
Geçiş döneminde always_scrape_classic_histograms: true ayarını korumak gerekiyor. Bu ayar kullanılmazsa Prometheus yalnızca native formatı alabilir ve mevcut _bucket, _count ve _sum serilerini içeri aktarmayabilir. Böylece klasik histogram sorgularını kullanan panolar ile uyarı kuralları çalışmaya devam eder.
Prometheus 2.40 ve 2.x sürümlerinde native histogramlar, Prometheus başlatılırken aşağıdaki özellik bayrağıyla genel olarak etkinleştiriliyor:
prometheus --enable-feature=native-histograms
Prometheus 2.x tarafındaki bu ayar, tüm kazıma hedefleri için geçerli toplu bir yapılandırma. Prometheus 3.9 ve sonrasında genel --enable-feature=native-histograms bayrağının kullanılması önerilmiyor; iş bazlı yapılandırma tercih ediliyor.
Native histogramları alabilmek için Prometheus, scrape_native_histograms etkin olduğunda Kubernetes uç noktalarıyla Protobuf biçimini otomatik olarak görüşüyor. Kubernetes bileşenlerinin native histogram dışa aktardığını doğrulamak için Protobuf kabul başlığıyla bir istek gönderilebiliyor. Kaynakta verilen örnek, yalnızca test bağlamı için güvenli olmayan bir curl isteği olarak belirtiliyor.
PromQL sorguları nasıl değişiyor?
Native histogramlar Prometheus’a alındıktan sonra sorgular, klasik histogramlardaki _bucket son ekine ve le etiketine ihtiyaç duymadan doğrudan metrik adı üzerinden çalışabiliyor.
# Classic histogram
histogram_quantile(
0.99,
rate(apiserver_request_duration_seconds_bucket[5m])
)
# Native histogram
histogram_quantile(
0.99,
rate(apiserver_request_duration_seconds[5m])
)
Birden fazla API sunucusunu klasik histogramla toplarken kova sınırlarını korumak için sum by (le) kullanılıyor. Native histogramlarda bu gruplama gerekmiyor:
# Classic histogram
histogram_quantile(
0.99,
sum by (le) (
rate(apiserver_request_duration_seconds_bucket[5m])
)
)
# Native histogram
histogram_quantile(
0.99,
sum (
rate(apiserver_request_duration_seconds[5m])
)
)
Geçiş sırasında Grafana panoları ve Prometheus uyarı kuralları, klasik histogram_quantile(..._bucket...) sorgularından native histogram sorgularına taşınabiliyor. Klasik _count ve _sum serilerine yapılan başvuruların da sırasıyla histogram_count() ve histogram_sum() işlevleriyle değiştirilmesi gerekiyor.
Geçiş ve geri alma seçenekleri
Önerilen geçiş modeli, iki formatı bir süre birlikte toplamaya dayanıyor. Önce Prometheus 3.x kazıma yapılandırmasında hem scrape_native_histograms: true hem de always_scrape_classic_histograms: true etkinleştiriliyor. Ardından sorgular, panolar ve uyarılar native histogram biçimine taşınıyor. Staging veya üretim ortamında doğrulama tamamlandıktan sonra klasik serilerin alımı kapatılabiliyor.
Geçiş tamamlandığında always_scrape_classic_histograms: false ayarıyla statik _bucket, _count ve _sum serilerinin Prometheus’a alınması durdurulabiliyor. Bu adım, histogram zaman serisi sayısını yüzde 90’a kadar azaltabiliyor.
Native histogramların alınması, Prometheus iş yapılandırmasında scrape_native_histograms: false ayarıyla durdurulabiliyor; bunun için Kubernetes’i yeniden başlatmak gerekmiyor. Kubernetes bileşenlerindeki özellik kapısı da --feature-gates=NativeHistograms=false ile kapatılabiliyor, ancak bu işlem bileşenin yeniden başlatılmasını gerektiriyor.
Native histogramların Genel Kullanıma Sunum aşamasına ilerlemesiyle SIG Instrumentation, ekosistem hazırlığını, performans özelliklerini ve klasik kovaların gelecekte kullanımdan kaldırılmasına ilişkin planları değerlendirmeyi sürdürecek.
Kaynaklar ve İleri Okuma
- Kubernetes v1.37 Native Histograms Beta duyurusu
- KEP-5808: Native Histograms
- Prometheus Native Histograms spesifikasyonu
- Kubernetes native histogram belgeleri
- PromQL histogram işlevleri
- Kubernetes SIG Instrumentation







Yorum gönder