eBPF: Linux çekirdeğini yeniden derlemeden programlamak
eBPF'in Linux çekirdeğinde güvenli program çalıştırmayı nasıl sağladığını, ağ, güvenlik ve gözlemlenebilirlikteki kullanımını örnekle öğrenin.
eBPF nedir?
eBPF (extended Berkeley Packet Filter), Linux çekirdeği içinde küçük programları güvenli biçimde çalıştırmanıza izin veren bir teknolojidir. Çekirdek kodunu değiştirmeden ve çekirdek modülü yazmadan, sistemde olan olayları izleyebilir, ağ paketlerini işleyebilir ya da güvenlik kuralları uygulayabilirsiniz.
Adındaki "paket filtresi" ifadesi tarihsel kalıntıdır. Bugün eBPF yalnızca paket süzmez; bir sistem çağrısından disk erişimine, bir ağ paketinden süreç başlatmaya kadar çok çeşitli olaya bağlanabilen genel amaçlı bir çalışma ortamı sunar.
Nasıl çalışır?
Akış şu aşamalardan oluşur: • Program, kısıtlı bir dille (çoğunlukla C ya da Rust ile yazılıp derlenir) hazırlanır ve çekirdeğe yüklenir. • Çekirdekteki doğrulayıcı (verifier) programı çalıştırmadan önce inceler: sonsuz döngü var mı, geçersiz bellek erişimi var mı, program sonlanıyor mu. Kuralları ihlal eden program reddedilir. • Doğrulanan program derlenerek (JIT) makine koduna çevrilir ve belirlenen bir bağlantı noktasına, yani olay kancasına takılır. • Olay gerçekleştiğinde program çalışır, sonucu haritalar (maps) denen paylaşımlı veri yapılarına yazar. Kullanıcı alanındaki uygulama bu haritalardan veriyi okur.
Doğrulayıcı sayesinde yazılan bir hata çekirdeği çökertmez; geleneksel çekirdek modülünden en önemli fark budur.
Nerede kullanılır?
- Gözlemlenebilirlik: Uygulamaya kod eklemeden hangi sürecin hangi dosyayı açtığını, hangi sistem çağrısının yavaş kaldığını, ağda gecikmenin nerede oluştuğunu görmek.
- Ağ: Paketleri çok erken aşamada, ağ kartına yakın bir noktada süzmek, yük dağıtmak, Kubernetes servis yönlendirmesini geleneksel kurallar yerine eBPF ile yapmak. Cilium bu alanın bilinen örneğidir.
- Güvenlik: Beklenmeyen süreç davranışını, şüpheli sistem çağrılarını ve ağ bağlantılarını çalışma anında tespit etmek ya da engellemek.
Bu araçların ortak yanı, izlenen uygulamayı değiştirmeden çekirdek düzeyinde görünürlük sağlamalarıdır.
Örnek senaryo
Örneğin üretimde bir servis zaman zaman yavaşlıyor ve uygulama günlüklerinde neden görünmüyor. Ekip, bpftrace gibi bir araçla çekirdekteki disk girdi çıktı olaylarına kısa bir izleme programı bağlar. Birkaç dakika içinde belirli bir sürecin aynı dosyaya art arda yazdığı ve gecikmenin buradan geldiği görülür. Program kaldırıldığında sistemde iz kalmaz, servisin yeniden başlatılması da gerekmemiştir.
Aynı iş geleneksel yöntemle ya uygulamaya ölçüm kodu eklemeyi ya da çekirdek düzeyinde hata ayıklama araçlarını ağır bir yük olarak devreye almayı gerektirirdi.
Benzer kavramlardan farkı
Çekirdek modülü: Tam yetkiyle çekirdeğe kod ekler, hata sistemi çökertebilir. eBPF programı ise doğrulayıcıdan geçer, yapabilecekleri sınırlıdır ve çalışırken yüklenip kaldırılabilir.
Kullanıcı alanı ajanı: Klasik izleme ajanları çekirdekten veri almak için sistem arayüzlerine ya da günlüklere dayanır, ek yük ve görünürlük sınırı vardır. eBPF olayı kaynağında yakalar.
Servis ağı (service mesh) yan araç (sidecar) modeli: Her uygulama kabının yanına proxy koymak yerine, ağ ve gözlem işlevlerinin bir kısmı node düzeyinde eBPF ile sunulabilir. Bu bir hazır çözüm değil, mimari bir seçenektir; gereksinimlere göre değerlendirilir.
Sınırlar ve dikkat edilecekler
eBPF özellikleri çekirdek sürümüne bağlıdır; eski çekirdeklerde bazı bağlantı noktaları ya da program türleri bulunmayabilir. Programları yüklemek genellikle yüksek yetki gerektirir, bu yüzden hangi araca hangi yetkinin verildiği ayrıca yönetilmelidir. Doğrulayıcının sınırları nedeniyle karmaşık mantığı tek programa sığdırmak zordur; iş çoğu zaman çekirdekte hafif veri toplama, kullanıcı alanında ise analiz olarak bölünür.
Ayrıca eBPF yalnızca Linux çekirdeği için konuşulan bir teknolojidir. Karma ortamlarda diğer işletim sistemleri için ayrı yaklaşımlar gerekir.
Mindset programlarında bu konu
Mindset kataloğundaki eBPF Tabanlı Gözlemlenebilirlik Araçları eğitiminin modülleri eBPF mimarisi, bpftrace ile hızlı teşhis, BCC ve libbpf ile araç geliştirme, ağ katmanında eBPF ve Kubernetes ortamında eBPF ekosistemini kapsar. Cilium ve eBPF Tabanlı Kubernetes Ağı eğitimi ise Cilium kurulumu, ağ politikaları, kube-proxy yerine eBPF servis yönlendirme ve Hubble ile gözlemlenebilirlik konularını ele alır.
İlgili Mindset programı
eBPF Tabanlı Gözlemlenebilirlik Araçları
Sık sorulan sorular
eBPF bir programlama dili midir?
Hayır. eBPF, Linux çekirdeğinde çalışan küçük programlar için bir çalışma ortamı ve komut kümesidir. Programlar çoğunlukla C ya da Rust gibi dillerle yazılıp bu komut kümesine derlenir. bpftrace gibi araçlar ise daha kısa betik dilleri sunarak yazımı kolaylaştırır.
eBPF çekirdeği çökertebilir mi?
Tasarım amacı bunu önlemektir. Her program yüklenmeden önce doğrulayıcıdan geçer; sonsuz döngü, geçersiz bellek erişimi gibi riskli davranışlar içeren program reddedilir. Yine de çekirdek sürümünün kendi hataları ya da yanlış yetki yönetimi gibi riskler ayrıca ele alınmalıdır.
eBPF Windows ve macOS'ta çalışır mı?
eBPF Linux çekirdeğinde ortaya çıkmış ve en olgun biçimde orada kullanılan bir teknolojidir. Diğer işletim sistemleri için benzer çabalar olsa da kurumsal kullanımda eBPF dendiğinde çoğunlukla Linux sunucuları ve Kubernetes düğümleri kastedilir.
Cilium ile eBPF arasındaki ilişki nedir?
eBPF temel teknolojidir, Cilium ise bu teknolojiyi Kubernetes ağı, ağ politikaları ve gözlemlenebilirlik için kullanan bir projedir. Yani eBPF bir yetenektir, Cilium ise o yeteneğin üzerine kurulmuş bir uygulamadır. Bir ağ politikası tanımladığınızda Cilium bunu çekirdekteki eBPF programlarına çevirir.