Merhaba arkadaşlar, bugün sizlere modern sistem izleme dünyasının en güçlü araçlarından biri olan eBPF'yi kullanarak Docker konteynerlerinizi nasıl derinlemesine izleyebileceğinizi anlatacağım. Klasik log dosyaları ve top komutu artık yeterli değil, özellikle mikroservis mimarilerinde bir konteynerin içinde tam olarak neler olduğunu, hangi sistem çağrılarını (syscall) yaptığını ve ağ trafiğinin detaylarını görmek performans sorunlarını çözmede ve güvenliği artırmada çok kritik. Bu rehberde, BCC (BPF Compiler Collection) araç seti ile pratik adımları göstereceğim.
eBPF ve BCC Nedir? Neden Kullanmalıyız?
eBPF (extended Berkeley Packet Filter), Linux kernel'ine güvenli bir şekilde program yükleyip çalıştırmamızı sağlayan bir teknoloji. Performansı neredeyse sıfır etkilerken, kernel seviyesinde izleme, ağ filtreleme ve güvenlik politikaları uygulama gibi süper güçler veriyor. BCC ise bu eBPF programlarını kolayca yazıp çalıştırmak için Python ve Lua front-end'leri sağlayan bir araç seti. Docker konteynerlerini izlemek için biçilmiş kaftan çünkü konteyner ID'sine göre filtreleme yapabiliyoruz.
Ortam Hazırlığı ve BCC Kurulumu
İlk adım olarak, BCC araçlarını kurmamız gerekiyor. Ben genelde Ubuntu/Debian tabanlı sistemlerde çalıştığım için şu adımları takip ediyorum. Kernel başlık dosyalarının da kurulu olduğundan emin olun.
Kurulum bittikten sonra araçlar `/usr/share/bcc/tools` dizinine yüklenir. Buradaki araçların çoğu `-h` parametresi ile kullanım detaylarını gösterir. Bir Docker konteynerini çalıştıralım ki üzerinde deneme yapabilelim.
Konteyner Sistem Çağrılarını (Syscall) İzleme
Şimdi sıra geldi en sevdiğim kısma. `execsnoop-bpfcc` aracı, sistemde çalıştırılan yeni prosesleri (ve dolayısıyla `exec()` syscall'larını) gerçek zamanlı gösterir. Docker konteynerlerini izlemek için `-c` parametresini kullanıyoruz. Önce konteynerimizin ID'sini öğrenelim.
Çıktıdaki konteyner ID'sini (uzun hash değeri) kopyalayıp aşağıdaki komutta kullanın. Bu komut, sadece o konteyner içinde çalıştırılan komutları gösterecek.
Başka bir terminalden konteyner içine girip birkaç komut çalıştırdığınızda (örn: `docker exec test-nginx ls /`), bu komutların anında ekrana basıldığını göreceksiniz. Bu, bir konteynerin içinde gizli/kötü amaçlı bir işlem çalışıp çalışmadığını anlamak için harika bir yöntem.
Dikkat Edilmesi Gerekenler
eBPF araçları kernel seviyesinde çalışır. Bu yüzden `sudo` yetkisi ile çalıştırılmaları şart. Yanlış kullanım sistem kararsızlığına yol açmaz (eBPF güvenlik kontrollerinden geçer) ancak yine de canlı sunucularda test etmeden önce bir staging ortamında denemenizi şiddetle tavsiye ederim. Ayrıca, `opensnoop` veya `fileslower` gibi araçlar da disk I/O izleme için çok kullanışlıdır.
Konteyner Ağ Trafiğini İzleme
Ağ performansı konteyner dünyasının can damarı. `tcpconnect-bpfcc` aracı ile konteynerimizin yaptığı TCP bağlantılarını gözlemleyebiliriz. Yine `-c` parametresi ile konteyner ID'sini belirtiyoruz.
Bu komut, konteynerin hangi IP ve port'a bağlantı kurmaya çalıştığını, bağlantının durumunu ve gecikmesini gösterir. Özellikle mikroservisler arası iletişimde beklenmeyen bir bağlantı veya gecikme olup olmadığını tespit etmekte çok faydalı.
Daha detaylı ağ analizi için `tcptracer-bpfcc` veya `tcplife-bpfcc` araçlarını da kullanabilirsiniz. Örneğin, `tcplife` TCP bağlantılarının ömrünü, aktarılan byte miktarını gösterir.
Örnek Bir İzleme Senaryosu ve Çıktı Yorumlama
Diyelim ki `test-nginx` konteynerinizin anormal derecede yavaş çalıştığını fark ettiniz. Hemen birkaç aracı ardışık çalıştırarak sorunu daraltabilirsiniz:
1. `execsnoop` ile aşırı proses oluşturuluyor mu bakın.
2. `opensnoop-bpfcc` ile hangi dosyaların sürekli okunduğunu kontrol edin.
3. `tcpconnect` ile dış servislere yapılan bağlantıların hızını ve sıklığını gözlemleyin.
Bu araçların çıktıları bize sadece "ne" olduğunu değil, "nerede" ve "ne zaman" olduğunu da gösterir. Örneğin, /var/log/application.log dosyasının saniyede yüzlerce kez açıldığını görürseniz, loglama konfigürasyonunda bir hata olduğunu anlarsınız.
Umarım bu rehber, konteyner ortamlarınızı daha iyi anlamanıza ve sorun giderme süreçlerinizi hızlandırmanıza yardımcı olur. eBPF dünyası gerçekten çok geniş ve her geçen gün yeni araçlar çıkıyor. Siz bu konfigürasyonu kendi sunucularınızda nasıl yapıyorsunuz? Özellikle üretim ortamında eBPF kullanırken dikkat ettiğiniz noktalar var mı? Sorusu olan aşağıya yazsın, tecrübelerimizi paylaşalım.
eBPF (extended Berkeley Packet Filter), Linux kernel'ine güvenli bir şekilde program yükleyip çalıştırmamızı sağlayan bir teknoloji. Performansı neredeyse sıfır etkilerken, kernel seviyesinde izleme, ağ filtreleme ve güvenlik politikaları uygulama gibi süper güçler veriyor. BCC ise bu eBPF programlarını kolayca yazıp çalıştırmak için Python ve Lua front-end'leri sağlayan bir araç seti. Docker konteynerlerini izlemek için biçilmiş kaftan çünkü konteyner ID'sine göre filtreleme yapabiliyoruz.
İlk adım olarak, BCC araçlarını kurmamız gerekiyor. Ben genelde Ubuntu/Debian tabanlı sistemlerde çalıştığım için şu adımları takip ediyorum. Kernel başlık dosyalarının da kurulu olduğundan emin olun.
Bash:
sudo apt update && sudo apt install -y bpfcc-tools linux-headers-$(uname -r)
Kurulum bittikten sonra araçlar `/usr/share/bcc/tools` dizinine yüklenir. Buradaki araçların çoğu `-h` parametresi ile kullanım detaylarını gösterir. Bir Docker konteynerini çalıştıralım ki üzerinde deneme yapabilelim.
Bash:
docker run -d --name test-nginx nginx:alpine
Şimdi sıra geldi en sevdiğim kısma. `execsnoop-bpfcc` aracı, sistemde çalıştırılan yeni prosesleri (ve dolayısıyla `exec()` syscall'larını) gerçek zamanlı gösterir. Docker konteynerlerini izlemek için `-c` parametresini kullanıyoruz. Önce konteynerimizin ID'sini öğrenelim.
Bash:
docker ps --no-trunc --format "table {{.ID}}\t{{.Names}}"
Çıktıdaki konteyner ID'sini (uzun hash değeri) kopyalayıp aşağıdaki komutta kullanın. Bu komut, sadece o konteyner içinde çalıştırılan komutları gösterecek.
Bash:
sudo /usr/share/bcc/tools/execsnoop-bpfcc -c [KONTEYNER_ID]
Başka bir terminalden konteyner içine girip birkaç komut çalıştırdığınızda (örn: `docker exec test-nginx ls /`), bu komutların anında ekrana basıldığını göreceksiniz. Bu, bir konteynerin içinde gizli/kötü amaçlı bir işlem çalışıp çalışmadığını anlamak için harika bir yöntem.
eBPF araçları kernel seviyesinde çalışır. Bu yüzden `sudo` yetkisi ile çalıştırılmaları şart. Yanlış kullanım sistem kararsızlığına yol açmaz (eBPF güvenlik kontrollerinden geçer) ancak yine de canlı sunucularda test etmeden önce bir staging ortamında denemenizi şiddetle tavsiye ederim. Ayrıca, `opensnoop` veya `fileslower` gibi araçlar da disk I/O izleme için çok kullanışlıdır.
Ağ performansı konteyner dünyasının can damarı. `tcpconnect-bpfcc` aracı ile konteynerimizin yaptığı TCP bağlantılarını gözlemleyebiliriz. Yine `-c` parametresi ile konteyner ID'sini belirtiyoruz.
Bash:
sudo /usr/share/bcc/tools/tcpconnect-bpfcc -c [KONTEYNER_ID]
Bu komut, konteynerin hangi IP ve port'a bağlantı kurmaya çalıştığını, bağlantının durumunu ve gecikmesini gösterir. Özellikle mikroservisler arası iletişimde beklenmeyen bir bağlantı veya gecikme olup olmadığını tespit etmekte çok faydalı.
Daha detaylı ağ analizi için `tcptracer-bpfcc` veya `tcplife-bpfcc` araçlarını da kullanabilirsiniz. Örneğin, `tcplife` TCP bağlantılarının ömrünü, aktarılan byte miktarını gösterir.
Diyelim ki `test-nginx` konteynerinizin anormal derecede yavaş çalıştığını fark ettiniz. Hemen birkaç aracı ardışık çalıştırarak sorunu daraltabilirsiniz:
1. `execsnoop` ile aşırı proses oluşturuluyor mu bakın.
2. `opensnoop-bpfcc` ile hangi dosyaların sürekli okunduğunu kontrol edin.
3. `tcpconnect` ile dış servislere yapılan bağlantıların hızını ve sıklığını gözlemleyin.
Bu araçların çıktıları bize sadece "ne" olduğunu değil, "nerede" ve "ne zaman" olduğunu da gösterir. Örneğin, /var/log/application.log dosyasının saniyede yüzlerce kez açıldığını görürseniz, loglama konfigürasyonunda bir hata olduğunu anlarsınız.
Umarım bu rehber, konteyner ortamlarınızı daha iyi anlamanıza ve sorun giderme süreçlerinizi hızlandırmanıza yardımcı olur. eBPF dünyası gerçekten çok geniş ve her geçen gün yeni araçlar çıkıyor. Siz bu konfigürasyonu kendi sunucularınızda nasıl yapıyorsunuz? Özellikle üretim ortamında eBPF kullanırken dikkat ettiğiniz noktalar var mı? Sorusu olan aşağıya yazsın, tecrübelerimizi paylaşalım.