Son 2 yılda bulutta yerel topluluklarda eBPF hakkında çok fazla konuşma yapıldı. eBPF, KubeCon'un dayanak noktasıydı , eBPF günlerinin ve eBPF zirvelerinin popülaritesi hızla artıyor, Google ve Netflix gibi şirketler eBPF'yi yıllardır kullanıyor ve her zaman yeni kullanım durumları ortaya çıkıyor. Özellikle gözlemlenebilirlik açısından eBPF'nin oyunun kurallarını değiştirmesi bekleniyor.
Öyleyse eBPF'ye bakalım; teknoloji nedir, gözlemlenebilirliği nasıl etkiliyor, mevcut gözlemlenebilirlik uygulamalarıyla nasıl karşılaştırılıyor ve gelecekte neler olabilir?
eBPF, çekirdek kodunu değiştirmeden Linux çekirdeğinde korumalı alana alınmış programları güvenli bir şekilde çalıştırmamıza olanak tanıyan bir programlama çerçevesidir.
Başlangıçta Linux için geliştirildi (ve bugün hala teknolojinin en olgun olduğu yerdir), ancak Microsoft, Windows için eBPF uygulamasını hızla geliştirmektedir.
eBPF programları tasarım gereği son derece verimli ve güvenlidir; işletim sisteminin kararlılığını veya güvenliğini riske atmadıklarından emin olmak için çekirdek tarafından doğrulanırlar.
Bunu anlamak için Kullanıcı alanını ve Çekirdek alanını anlamamız gerekir.
Kullanıcı alanı tüm uygulamaların çalıştığı yerdir. Çekirdek alanı, kullanıcı alanı ile fiziksel donanım arasında bulunur. Kullanıcı alanındaki uygulamalar donanıma doğrudan erişemez. Bunun yerine, donanıma erişen çekirdeğe sistem çağrıları yaparlar.
Tüm bellek erişimi, dosya okuma/yazma işlemleri ve ağ trafiği çekirdekten geçer. Çekirdek aynı zamanda eşzamanlı süreçleri de yönetir.
Temel olarak her şey çekirdekten geçer (aşağıdaki Şekil'e bakın).
Ve eBPF, çekirdek işlevselliğini genişletmenin güvenli ve emniyetli bir yolunu sağlar.
Tarihsel olarak, bariz nedenlerden ötürü, çekirdek kaynak kodundaki veya işletim sistemi katmanındaki herhangi bir şeyi değiştirmek çok zor olmuştur.
Linux çekirdeğinde 30 milyon satır kod bulunur ve herhangi bir değişikliğin bir fikirden yaygın olarak kullanılabilir hale gelmesi birkaç yıl alır. Öncelikle Linux topluluğunun bunu kabul etmesi gerekiyor. Daha sonra resmi Linux sürümünün bir parçası haline gelmesi gerekiyor. Daha sonra birkaç ay sonra Red Hat ve Ubuntu gibi dağıtımlar tarafından alınıp daha geniş bir kitleye ulaştırılıyor.
Teknik olarak, çekirdek modülleri kendi çekirdeğine yüklenebilir ve doğrudan değişiklik yapılabilir, ancak bu çok yüksek risktir ve karmaşık çekirdek düzeyinde programlamayı gerektirir, bu nedenle neredeyse evrensel olarak bundan kaçınılır.
eBPF gelir ve bu sorunu çözer ve çekirdeğe program eklemek ve çalıştırmak için güvenli ve etkili bir mekanizma sağlar.
eBPF'nin hem güvenliği hem de performansı nasıl sağladığına bakalım.
Sıkı doğrulama - Herhangi bir eBPF programı çekirdeğe yüklenmeden önce, eBPF doğrulayıcı tarafından doğrulanır, bu da kodun kesinlikle güvenli olmasını sağlar - örneğin sabit döngülerin olmaması, geçersiz bellek erişimi, güvenli olmayan işlemler.
Korumalı alanda - eBPF programları, diğer çekirdek bileşenlerinden ayrı olarak çekirdek içindeki bellekle yalıtılmış bir sanal alanda çalıştırılır. Bu, çekirdek belleğine, veri yapılarına ve çekirdek kaynak koduna yetkisiz erişimi önler.
Sınırlı işlemler - eBPF programlarının genellikle C dilinin küçük bir alt kümesinde (sınırlı bir talimat kümesi) yazılması gerekir. Bu, eBPF programlarının gerçekleştirebileceği işlemleri sınırlayarak güvenlik açıkları riskini azaltır.
Yerel makine kodu olarak çalıştır - eBPF programları, CPU'da yerel makine talimatları olarak çalıştırılır. Bu, daha hızlı yürütmeye ve daha iyi performansa yol açar.
Bağlam geçişi yok - Düzenli bir uygulama, kaynak yoğun olan kullanıcı alanı ile çekirdek alanı arasında düzenli olarak bağlam geçişi yapar. eBPF programları, çekirdek katmanında çalıştıkları için çekirdek veri yapılarına ve kaynaklarına doğrudan erişebilir.
Olay odaklı - eBPF programları genellikle yalnızca belirli çekirdek olaylarına yanıt olarak çalışır ve her zaman açık durumdadır. Bu, yükü en aza indirir.
Donanım için optimize edilmiştir - eBPF programları, yürütmeden hemen önce çekirdeğin JIT (Tam Zamanında) derleyicisi tarafından makine kodu halinde derlenir, böylece kod, üzerinde çalıştığı belirli donanım için optimize edilir.
Böylece eBPF, programlama için çekirdeğe güvenli ve etkili bir kanca sağlar. Ve her şeyin çekirdekten geçtiği göz önüne alındığında, bu şimdiye kadar mümkün olmayan birçok yeni olasılığın önünü açıyor.
eBPF'nin etrafındaki teknoloji uzun bir süre içinde gelişti ve yapımı yaklaşık 30 yıl sürdü.
Son 7-8 yılda eBPF birçok büyük şirket tarafından geniş çapta kullanıldı ve şimdi eBPF kullanımının ana akım haline geldiği bir döneme giriyoruz. Linux'un ortak yaratıcısı ve eBPF'nin ortak bakımcısı Alexei Starovoitov'un eBPF'nin evrimi hakkındaki bu videosunu izleyin.
1993- Lawrence Berkeley Ulusal Laboratuvarı'ndan bir makale, paket filtreleme için bir çekirdek aracısının kullanımını araştırıyor. BPF (“Berkeley Paket Filtresi”) adı buradan gelmektedir.
1997 - BPF, Linux çekirdeğinin (versiyon 2.1.75) bir parçası olarak resmi olarak tanıtıldı.
1997-2014 - BPF yeteneklerini geliştirmek, stabilize etmek ve genişletmek için çeşitli özellikler eklendi.
2014 - "Genişletilmiş Berkeley paket Filtresi" (eBPF) adı verilen önemli bir güncelleme tanıtıldı. Bu sürüm, BPF teknolojisinde büyük değişiklikler yapar ve onu daha geniş çapta kullanılabilir hale getirir; dolayısıyla "genişletilmiş" kelimesi
Bu sürümün bu kadar büyük olmasının nedeni, çekirdek işlevselliğinin genişletilmesini kolaylaştırmasıydı .
Bir programcı aşağı yukarı normal bir uygulamadaki gibi kodlayabilir ve çevredeki eBPF altyapısı düşük düzeyli doğrulama, güvenlik ve verimlilikle ilgilenir.
eBPF'nin etrafındaki destekleyici ekosistem ve iskelenin tamamı bunu mümkün kılmaktadır (aşağıdaki şekle bakınız).
Kaynak: https://ebpf.io/what-is-ebpf/
Daha da iyisi, eBPF programları herhangi bir yeniden başlatmaya gerek kalmadan çekirdeğe yüklenebiliyor ve çekirdekten kaldırılabiliyor.
Bütün bunlar birdenbire yaygın bir şekilde benimsenmesine ve uygulanmasına olanak sağladı.
eBPF'nin popülaritesi son 7-8 yılda birçok büyük şirketin bunu ölçekli üretim sistemlerinde kullanması ile patlama yaşadı.
2016 yılına gelindiğinde Netflix, eBPF'yi izleme için yaygın olarak kullanıyordu. Bunu uygulayan Brendan Gregg , altyapı ve operasyon çevrelerinde eBPF konusunda bir otorite olarak geniş çapta tanındı.
2017 - Facebook'un açık kaynaklı Katran'ı , eBPF tabanlı yük dengeleyicisi. 2017'den bu yana Facebook.com'a gönderilen her paket eBPF'den geçti.
2020- Google, eBPF'yi Kubernetes teklifinin bir parçası haline getirdi. eBPF artık GKE'nin ağ iletişimi, güvenlik ve gözlemlenebilirlik katmanına güç veriyor. Şu anda Capital One ve Adobe gibi şirketlerde de kurumsal düzeyde benimsenme söz konusu.
2021 - Facebook, Google, Netflix, Microsoft ve Isovalent, eBPF teknolojisinin büyümesini yönetmek için eBPF temelini duyurmak üzere bir araya geldi.
Artık eBPF kullanan binlerce şirket var ve her yıl farklı kullanım durumlarını araştıran yüzlerce eBPF projesi ortaya çıkıyor.
eBPF artık Linux çekirdeği içinde onu destekleyen geniş bir topluluğa sahip ayrı bir alt sistemdir. Teknolojinin kendisi birkaç yeni eklemeyle önemli ölçüde genişledi.
eBPF'nin en yaygın kullanım durumları 3 alandadır:
Güvenlik ve ağ oluşturma, Cilum gibi projelerle desteklenen daha geniş bir benimsenme ve uygulama alanı buldu. Buna karşılık, eBPF tabanlı gözlemlenebilirlik teklifleri evrimlerinin daha erken safhalarında ve daha yeni başlıyor.
Önce güvenlik ve ağ oluşturmadaki kullanım örneklerine bakalım.
Güvenlik, eBPF için oldukça popüler bir kullanım örneğidir. Programlar, eBPF'yi kullanarak çekirdek düzeyinde olup biten her şeyi gözlemleyebilir, beklenmeyen davranışları kontrol etmek için olayları yüksek hızda işleyebilir ve uyarıları çok daha hızlı bir şekilde yükseltebilir.
Örneğin -
Google, geniş ölçekte izinsiz giriş tespiti için eBPF'yi kullanıyor
Shopify, konteyner güvenliğini uygulamak için eBPF'yi kullanıyor
Birçok üçüncü taraf güvenlik teklifi artık veri toplama ve izleme için eBPF'yi kullanıyor.
Ağ oluşturma, yaygın olarak uygulanan başka bir kullanım durumudur. eBPF katmanında olmak, kaynak ve hedef IP'nin yanı sıra tüm atlama noktaları da dahil olmak üzere tam ağ yolunun görünürlüğü gibi kapsamlı ağ gözlemlenebilirliğine olanak tanır. eBPF programlarıyla, yüksek hacimli ağ olaylarını işleyebilir ve ağ paketlerini doğrudan çekirdek içinde çok düşük bir ek yük ile yönetebilirsiniz.
Bu, yük dengeleme, DDoS önleme, Trafik şekillendirme ve Hizmet Kalitesi (QoS) gibi çeşitli ağ kullanım senaryolarına olanak tanır.
Şimdiye kadar eBPF'nin Gözlemlenebilirlik konusunda nasıl faydalı olabileceği açık olmalı.
Her şey çekirdekten geçer. Ve eBPF, her şeyi çekirdekten gözlemlemek için yüksek performanslı ve güvenli bir yol sağlar.
Gözlemlenebilirliğin derinliklerine inelim ve bu teknolojinin sonuçlarına bakalım.
Bunu keşfetmek için eBPF evreninden Gözlemlenebilirlik evrenine adım atalım ve standart gözlemlenebilirlik çözümümüzün nelerden oluştuğuna bakalım.
Herhangi bir gözlemlenebilirlik çözümünün 4 ana bileşeni vardır:
Veri toplama - Uygulamalardan ve altyapıdan telemetri verilerinin alınması
Veri işleme - Toplanan veriler üzerinde filtreleme, indeksleme ve hesaplamalar gerçekleştirme
Veri depolama - Verilerin kısa ve uzun vadeli depolanması
Kullanıcı deneyimi katmanı - Verilerin kullanıcı tarafından nasıl tüketildiğini belirleme
Bunlardan eBPF'nin (bugün itibariyle) etkilediği şey aslında yalnızca veri toplama katmanıdır - eBPF kullanılarak telemetri verilerinin doğrudan çekirdekten kolayca toplanması.
Yani bugün "eBPF gözlemlenebilirliği" dediğimizde kastettiğimiz şey, diğer enstrümantasyon yöntemlerini kullanmak yerine eBPF'yi telemetri verilerini toplamak için enstrümantasyon mekanizması olarak kullanmaktır. Gözlemlenebilirlik çözümünün diğer bileşenleri etkilenmeden kalır.
eBPF gözlemlenebilirliğinin altında yatan mekanizmaları tam olarak anlamak için kanca kavramını anlamamız gerekir.
Daha önce gördüğümüz gibi, eBPF programları öncelikle olaya dayalıdır; yani belirli bir olay meydana geldiğinde tetiklenirler. Örneğin, her işlev çağrısı yapıldığında, gözlemlenebilirlik amacıyla bazı verileri yakalamak için bir eBPF programı çağrılabilir.
Öncelikle bu kancalar çekirdek alanında veya kullanıcı alanında olabilir. Dolayısıyla eBPF, hem kullanıcı alanı uygulamalarını hem de çekirdek düzeyindeki olayları izlemek için kullanılabilir.
İkincisi, bu kancalar önceden belirlenebilir/statik olabilir veya çalışan bir sisteme dinamik olarak yerleştirilebilir (yeniden başlatma olmadan!)
Dört farklı eBPF mekanizması bunların her birine izin verir (aşağıdaki şekle bakın)
| Önceden Belirlenmiş/Manuel | Dinamik |
---|---|---|
Çekirdek | Çekirdek izleme noktaları | kproblar |
Kullanıcı alanı | USDT | elbiseler |
Statik ve dinamik eBPF, kullanıcı alanına ve çekirdek alanına bağlanır
Çekirdek izleme noktaları - çekirdek geliştiricileri tarafından önceden tanımlanmış olaylara bağlanmak için kullanılır (TRACE_EVENT makrolarıyla)
USDT - geliştiriciler tarafından uygulama kodunda belirlenen önceden tanımlanmış izleme noktalarına bağlanmak için kullanılır
Kprobes (Çekirdek Probları) - çalışma zamanında çekirdek kodunun herhangi bir bölümüne dinamik olarak bağlanmak için kullanılır
Urobes (Kullanıcı Probları) - çalışma zamanında bir kullanıcı alanı uygulamasının herhangi bir bölümüne dinamik olarak bağlanmak için kullanılır
Çekirdek alanında, bir eBPF programının kolayca eklenebileceği önceden tanımlanmış birkaç kanca vardır (örneğin, sistem çağrıları, işlev girişi/çıkış, ağ olayları, çekirdek izleme noktaları). Benzer şekilde kullanıcı alanında, birçok dil çalışma zamanı, veritabanı sistemi ve yazılım yığını, eBPF programlarının bağlanabileceği Linux BCC araçları için önceden tanımlanmış kancaları açığa çıkarır.
Ama daha ilginç olan, sondalar ve üstlükler. Üretimde bir şeyler bozuluyorsa ve yeterli bilgiye sahip değilsem ve çalışma zamanında dinamik olarak enstrümantasyon eklemek istersem ne olur? Kprobe'ların ve uprob'ların güçlü gözlemlenebilirliğe izin verdiği yer burasıdır.
Örneğin, uprobes kullanılarak, çalışma zamanında uygulamanın kodunu değiştirmeden bir uygulama içindeki belirli bir işleve bağlanılabilir. İşlev her yürütüldüğünde, gerekli verileri yakalamak için bir eBPF programı tetiklenebilir. Bu, canlı hata ayıklama gibi heyecan verici olanaklara olanak tanır.
Artık eBPF ile gözlemlenebilirliğin nasıl çalıştığını bildiğimize göre, kullanım örneklerine bakalım.
eBPF, mevcut gözlemlenebilirlik kullanım durumlarının neredeyse tamamı için kullanılabilir ve ayrıca yeni olasılıkların önünü açar.
Sistem ve Altyapı İzleme: eBPF, CPU kullanımı, bellek tahsisi, disk G/Ç ve ağ trafiği gibi sistem düzeyindeki olayların derinlemesine izlenmesine olanak tanır. Örneğin LinkedIn, tüm altyapı izleme işlemleri için eBPF'yi kullanıyor .
Container ve Kubernetes İzleme: Kubernetes'e özgü ölçümler, kaynak kullanımı ve bireysel konteynerlerin ve kapsüllerin sağlığı hakkında görünürlük.
Uygulama Performansı İzleme (APM): Kullanıcı alanı uygulamalarında ayrıntılı gözlemlenebilirlik ve uygulama verimi, hata oranları, gecikme ve izlere ilişkin görünürlük.
Özel Gözlemlenebilirlik: Özel kod yazılmadan kolayca kullanılamayacak uygulamalara veya altyapıya özgü özel metriklerin görünürlüğü.
Gelişmiş Gözlemlenebilirlik: eBPF, canlı hata ayıklama , düşük maliyetli uygulama profili oluşturma ve sistem çağrısı izleme gibi gelişmiş gözlemlenebilirlik kullanım durumları için kullanılabilir.
Gözlemlenebilirlik alanında eBPF'nin her gün yeni uygulamaları ortaya çıkıyor.
Bugün gözlemlenebilirliğin nasıl yapıldığı açısından bu ne anlama geliyor? eBPF'nin mevcut enstrümantasyon biçimlerinin yerini alması muhtemel mi? Mevcut seçeneklerle karşılaştıralım.
Bugün, eBPF'den ayrı olarak Gözlemlenebilirlik için uygulamaları ve altyapıyı ölçmenin iki ana yolu vardır.
Sepet proxy tabanlı araçlar : Sepetler, bir uygulama veya hizmetle birlikte çalışan hafif, bağımsız süreçlerdir. Mikro hizmetlerde ve Kubernetes gibi konteyner tabanlı mimarilerde popülerdirler.
eBPF tabanlı enstrümantasyonun aracılar ve yan araçlarla nasıl karşılaştırıldığına ilişkin ayrıntılı bir karşılaştırma için buraya bakın . Aşağıda özet bir görünüm verilmiştir -
| eBPF | Temsilciler | Sepetler |
---|---|---|---|
1. Veri Görünürlüğü/Ayrıntılılık | Yüksek (ancak bazı boşluklar) | Yüksek | Düşük |
2. Müdahalecilik | Düşük (bant dışı) | Yüksek (satır içi) | Yüksek (satır içi) |
3. Performans yükü | Düşük | Orta | Yüksek |
4. Emniyet ve Güvenlik | Yüksek | Orta | Orta |
5. Uygulama kolaylığı | Yüksek | Düşük | Orta |
6. Bakım ve güncelleme kolaylığı | Yüksek | Düşük | Orta |
7. Ölçeklenebilirlik | Yüksek | Orta | Düşük |
Görebildiğimiz gibi eBPF, neredeyse tüm parametrelerde mevcut enstrümantasyon yöntemlerinden daha iyi performans gösteriyor. Birkaç faydası var -
Her şeyi tek seferde kapsayabilir (altyapı, uygulamalar)
Daha az müdahaleci - eBPF, iş yükü her çalıştırıldığında çalışan kod aracıları gibi iş yüklerini çalıştırmanın satır içi değildir. Veri toplama bant dışı ve korumalı alana alınır, dolayısıyla çalışan sistem üzerinde hiçbir etkisi yoktur.
Düşük performans ek yükü - eBPF, yerel makine kodu olarak çalışır ve içerik değiştirme yoktur.
Doğrulama gibi yerleşik güvenlik önlemleri sayesinde daha güvenli .
Kurulumu kolaydır - herhangi bir kod değişikliği veya yeniden başlatma gerekmeden bırakılabilir.
Bakımı ve güncellemesi kolaydır - yine kod değişikliği ve yeniden başlatma gerekmez.
Daha ölçeklenebilir - kolay uygulama ve bakım ve düşük performans ek yükü sayesinde sağlanır
Eksileri açısından bakıldığında, bugün eBPF gözlemlenebilirliğindeki temel boşluk, dağıtılmış izlemededir ( mümkündür , ancak kullanım durumu hala erken aşamalardadır).
eBPF'nin mevcut enstrümantasyon yöntemlerine göre sunduğu önemli avantajlar göz önüne alındığında, eBPF'nin varsayılan yeni nesil enstrümantasyon platformu olarak ortaya çıkmasını makul bir şekilde bekleyebiliriz.
Bu gözlemlenebilirlik endüstrisi için ne anlama geliyor? Hangi değişiklikler?
Bir gözlemlenebilirlik çözümü düşünün:
5 dakika içinde çekirdeğe girebileceğinizi
kod değişikliği veya yeniden başlatma yok
Her şeyi tek seferde kapsar - altyapı, uygulamalar, her şey
sıfıra yakın ek yüke sahip
son derece güvenli
eBPF'nin mümkün kıldığı şey budur. Teknolojiyle ilgili bu kadar heyecanın olmasının nedeni de budur.
Yeni nesil gözlemlenebilirlik çözümlerinin tamamının kod aracıları yerine eBPF ile donatılmasını bekleyebiliriz.
Datadog ve NewRelic gibi geleneksel oyuncular, kod tabanlı temsilci portföylerini genişletmek için eBPF tabanlı enstrümantasyon oluşturmaya şimdiden yatırım yapıyorlar. Bu arada, eBPF üzerine kurulu, hem niş kullanım durumlarını hem de karmaşık gözlemlenebilirliği çözen birkaç yeni nesil satıcı var.
Geleneksel oyuncular birkaç yıl içinde her bir altyapı bileşeni için dil bazında ayrı kod aracıları oluşturmak zorundayken, yeni oyuncular eBPF ile birkaç ay içinde aynı kapsama düzeyine ulaşabilirler. Bu aynı zamanda veri işleme, kullanıcı deneyimi ve hatta yapay zeka gibi değer zincirinin daha üst kademelerinde inovasyonlara odaklanmalarına da olanak tanıyor. Ayrıca veri işleme ve kullanıcı deneyimi katmanları da yeni kullanım durumlarını, hacimleri ve sıklığı destekleyecek şekilde temelden oluşturulmuştur.
Tüm bunlar, bu alanda büyük miktarda yeniliğe yol açmalı ve önümüzdeki yıllarda gözlemlenebilirliği daha kusursuz, güvenli ve kolay uygulanabilir hale getirmelidir.
Öncelikle, modern bir bulut tabanlı ortamdaysanız (Kubernetes, mikro hizmetler), eBPF tabanlı ve aracı tabanlı yaklaşımlar arasındaki farklar en görünür durumdadır (performans ek yükü, güvenlik, kurulum kolaylığı vb.).
İkincisi, eğer büyük ölçekte çalışıyorsanız, o zaman eBPF tabanlı hafif aracılar statükoya göre çarpıcı gelişmelere yol açacaktır. Bu muhtemelen eBPF'nin benimsenmesinin LinkedIn, Netflix ve Meta gibi büyük ayak izine sahip teknoloji şirketlerinde en yüksek olmasının nedenlerinden biridir.
Üçüncüsü, eğer teknoloji konusunda yetersizseniz. Kapasitesi yüksek ve kurulumu ve bakımı neredeyse hiç çaba gerektirmeyen bir gözlemlenebilirlik çözümü arıyorsanız, ardından doğrudan eBPF tabanlı bir çözüme gidin.
Özetle, eBPF, önemli ölçüde daha iyi bir enstrümantasyon mekanizması sunarak, önümüzdeki yıllarda gözlemlenebilirliğe yaklaşımımızı temelden yeniden şekillendirme potansiyeline sahiptir.
Bu makalede öncelikle eBPF'nin veri toplama/enstrümantasyondaki uygulamasını incelemiş olsak da, gelecekteki uygulamalarda eBPF'nin veri işleme ve hatta veri depolama katmanlarında kullanıldığını görebiliriz. Olasılıklar geniştir ve henüz keşfedilmemiştir.