Haziran 6 2026

Dört Altın Sinyal Öldü Mü? Determinimistik Olmayan Altyapılarda Yeni Nesil Telemetri Tasarımı

Google SRE Book hayatımıza girdiğinden beri latency, traffic, errors ve saturation dörtlüsünü (yani golden signals) kutsal kase olarak kabul ettik. Ancak günümüzün non-deterministic infrastructure (deterministik olmayan altyapı) ve dinamik microservices monitoring dünyasında, bu statik metrikler artık sistemin gerçek sağlığını göstermekte yetersiz kalıyor. Modern ve dinamik sistemlerde ayakta kalabilmek için observability odaklı, yeni nesil bir telemetry design yaklaşımına geçmek zorundayız.

Peki ama neden? Çünkü artık “sunucu ayakta mı?” sorusu anlamsız. Kubernetes cluster’ınızda bir pod ölüyor, yerine yenisi geliyor; serverless fonksiyonlar milisaniyeler içinde cold start yaşayıp kayboluyor. Bu yazıda, geleneksel dört altın sinyalin neden yetersiz kaldığını ve modern dağıtık mimarilerde nasıl bir telemetri mimarisi kurmanız gerektiğini teknik detaylarıyla inceleyeceğiz.

Klasik Metriklerin Epistemolojik Çöküşü

Eski dünyada her şey basitti. Bir bare-metal sunucumuz, bir load balancer’ımız ve bir veritabanımız vardı. CPU %90’a ulaştığında disk IOPS limitine yaklaşıyorduk ve bu net bir alarm sebebiydi. Bugün ise CPU kullanımı tek başına hiçbir şey ifade etmiyor. Container bazlı kısıtlamalar (CFS throttling), multi-tenant yapılar ve mikroservislerin birbirleriyle olan asenkron ilişkileri, klasik “saturation” metriğini anlamsızlaştırıyor.

Deterministik olmayan altyapılarda bir hata (error), genellikle tek bir bileşenin çökmesinden değil; ağ gecikmesi, rate limitler, queue derinliği ve veri tutarsızlığı gibi birden fazla faktörün bir araya gelmesiyle (emergent behavior) oluşur. Dolayısıyla, sadece giriş ve çıkış kapılarını izleyerek içeride ne olduğunu anlamamız imkansızdır.

Dört Altın Sinyal Nerede Patlıyor?

Klasik dört altın sinyali tek tek masaya yatıralım ve modern mimarideki sınırlarını görelim:

  • Latency (Gecikme): Ortalama (mean) latansı ölçmek bir yalandır. p99 veya p99.9 latansı bile bazen yanıltıcı olabilir. Eğer bir istek arka planda 50 farklı mikroservise dokunuyorsa, kümülatif p99 latansı tamamen kontrol dışı kalır. Bize gereken, istek bazlı bağlamsal gecikmedir (contextual latency).
  • Traffic (Trafik): Saniyedeki istek sayısı (RPS) tek başına sistem yükünü açıklamaz. 1000 basit read isteği ile 10 tane yoğun write/join isteği sistemde aynı saturation’ı yaratmaz.
  • Errors (Hatalar): HTTP 500’leri yakalamak kolaydır. Peki ya 200 OK dönen ama boş gövde (empty payload) gönderen veya mantıksal olarak hatalı çalışan servisler? Ya da circuit breaker devreye girdiği için hızlıca hata dönen (“fail-fast”) ama aslında downstream servislerin ayakta olduğu durumlar?
  • Saturation (Doygunluk): Kubernetes ortamında bir container’ın CPU limiti (limit ve request farkı) yüzünden throttle edilmesi, host makinenin CPU’sunun boş olmasına rağmen uygulamanın yavaşlamasına neden olur. Klasik host-level saturation izleme burada tamamen kör kalır.

Yeni Nesil Telemetry Design: OpenTelemetry ile Bağlamsal İzleme

Çözüm, metrik, log ve trace verilerini birbirinden bağımsız adalar olarak toplamayı bırakmaktır. Modern bir telemetry design, yüksek kardinaliteye (high cardinality) ve bağlam geçişine (context propagation) dayanmalıdır.

Aşağıdaki OpenTelemetry Collector konfigürasyon bloğu, deterministik olmayan bir ortamda metrik ve trace verilerini nasıl zenginleştirebileceğimizi ve sistem üzerindeki “gürültüyü” nasıl azaltabileceğimizi gösteriyor. Burada özellikle transform processor’ını kullanarak dinamik etiketleme (enrichment) yapıyoruz:


receivers:
  otlp:
    protocols:
      grpc:
      http:

processors:
  batch:
    send_batch_size: 8192
    timeout: 5s
    send_batch_max_size: 10240

  memory_limiter:
    check_interval: 1s
    limit_percentage: 75
    spike_limit_percentage: 15

  resourcedetection:
    detectors: [env, gcp, ecs, ec2, k8snode]
    timeout: 2s

  transform:
    error_mode: ignore
    metric_statements:
      - context: datapoint
        statements:
          - set(attributes["env"], "production")
          - set(attributes["service.tier"], "critical") where attributes["service.name"] == "payment-gateway"

exporters:
  otlp/prometheus:
    endpoint: "prometheus-gateway:9090"
    tls:
      insecure: true
  otlp/jaeger:
    endpoint: "jaeger-collector:4317"
    tls:
      insecure: true

service:
  pipelines:
    metrics:
      receivers: [otlp]
      processors: [memory_limiter, resourcedetection, transform, batch]
      exporters: [otlp/prometheus]
    traces:
      receivers: [otlp]
      processors: [memory_limiter, resourcedetection, batch]
      exporters: [otlp/jaeger]

Bu konfigürasyondaki resourcedetection adımı kritiktir. Uygulamanın hangi k8s podunda, hangi cloud provider üzerinde çalıştığını koda dokunmadan telemetri verisine enjekte eder. Bu sayede, deterministik olmayan altyapılardaki transient (geçici) hataları analiz ederken “Altyapısal bir dalgalanma mı oldu yoksa kodda mı hata var?” sorusuna anında yanıt bulabiliriz.

Dinamik Eşik Değerleri ve Anomalilerle Mücadele

Geleneksel alerting sistemleri statik threshold (eşik değer) mantığına dayanır. Örneğin: “CPU %80’i geçerse alarm ver.” Ancak auto-scale olan bir cluster’da bu kural sabaha karşı anlamsız alarmlarla uyanmanıza sebep olur. Bunun yerine PromQL kullanarak dinamik standart sapma (standard deviation) bazlı anomalileri tespit etmeliyiz.

Aşağıdaki PromQL sorgusu, bir servisin son 5 dakikadaki latansını (p99), son 1 haftalık geçmiş verinin ortalaması ve standart sapmasıyla karşılaştırır. Eğer mevcut latans, tarihsel sapmanın 3 katından fazlaysa bu gerçek bir anomalidir:


(
  histogram_quantile(0.99, sum(rate(http_request_duration_seconds_bucket[5m])) by (le, service))
  -
  avg_over_time(histogram_quantile(0.99, sum(rate(http_request_duration_seconds_bucket[5m])) by (le, service))[1w])
)
/
stddev_over_time(histogram_quantile(0.99, sum(rate(http_request_duration_seconds_bucket[5m])) by (le, service))[1w])
> 3

Neden böyle bir sorgu kullanmalıyız? Çünkü her pazartesi saat 09:00’da sistemde doğal bir trafik artışı (ve dolayısıyla latans yükselmesi) oluyorsa, statik bir alert tetiklenir. Ancak bu dinamik sorgu, geçmiş pazartesi verilerini de hesaba katarak sistemi tolere eder. Böylece SRE ekibinin alert fatigue (alarm yorgunluğu) yaşamasının önüne geçilmiş olur.

eBPF: Altyapıyı Kodsuz Gözlemlemek

Uygulama seviyesinde SDK entegrasyonu yapmak her zaman mümkün veya pratik olmayabilir. Özellikle legacy servislerin veya üçüncü parti bileşenlerin (örneğin redis, nginx veya veri tabanları) telemetri verilerini toplamak ciddi bir operasyonel yük getirir.

İşte burada devreye eBPF (Extended Berkeley Packet Filter) giriyor. Kernel seviyesinde çalışan eBPF probaları sayesinde uygulamaya tek bir satır kod eklemeden, ağ paketlerini ve sistem çağrılarını (syscalls) intercept ederek ultra-low overhead ile telemetri üretebiliriz.

Örneğin, bir Kubernetes cluster’ında tüm podlar arasındaki TCP handshake sürelerini ve paket kayıplarını eBPF tabanlı bir tool (örn. Hubble/Cilium veya Pixie) ile izlediğinizde, “Ağda paket kaybı var ama hangi podlar etkileniyor?” sorusuna sıfır kod değişikliğiyle yanıt bulursunuz. Bu, modern observability vizyonunun en kritik yapı taşlarından biridir.

Sonuç: Yeni Nesil Telemetri Tasarımı İçin Yol Haritası

Dört altın sinyal tamamen ölmedi, ancak artık tek başlarına yetersizler. Onları sistemin genel durumunu gösteren kaba göstergeler olarak tutmalı, altını ise bağlamsal izleme ile doldurmalıyız. Başarılı bir yeni nesil telemetri tasarımı için şu adımları uygulamalısınız:

  1. Log, metrik ve trace’leri tek bir trace_id ve span_id ile birbirine bağlayın (Context Propagation).
  2. Kardinalite korkusunu aşın. Etiketlerde (tags/attributes) dinamik verileri (customer_id, k8s_pod_name, deployment_version) kullanmaktan çekinmeyin.
  3. Statik threshold alarmlarından kaçının; anomali tespiti için matematiksel modelleri (Z-score, Holt-Winters) PromQL seviyesinde uygulayın.
  4. eBPF teknolojisini altyapı gözlemlenebilirliği için bir standart haline getirin.

Unutmayın, sistemleriniz artık deterministik değil. Onları izleme yöntemleriniz de doğrusal ve durağan olamaz.

Category: Genel | LEAVE A COMMENT
Haziran 5 2026

Terminalden Ayrılmadan Yazılım Geliştirmek: Claude Code CLI ile Dinamik İş Akışları Yönetimi

Yazılım geliştirirken odaklanmayı, yani o meşhur “flow” (akış) durumunu bozan en büyük şey nedir diye sorsak, çoğumuz aynı cevabı veririz: Sürekli ekran ve bağlam (context) değiştirmek. Tarayıcıda bir sekme aç, ChatGPT’ye kod sor, kodu kopyala, editöre dön, yapıştır, terminalde çalıştır, hata al, hatayı kopyala, tekrar tarayıcıya dön… Bu kısır döngü, developer productivity (geliştirici üretkenliği) sürecinin en büyük baltalayıcısıdır. Anthropic, tam olarak bu soruna parmak basmak ve geliştiricileri terminalin konforlu karanlığında tutmak için yeni claude code aracını duyurdu. Bu yazımızda, terminalden hiç ayrılmadan kod yazmamızı sağlayan bu yeni nesil cli tool ve ai coding agent deneyimini her yönüyle masaya yatırıyor, bizzat test edip deneyimlerimizi aktarıyoruz.

Claude Code Nedir? Süper Güçleri Olan Bir Terminal Arkadaşı

Yapay zekanın kodlama dünyasındaki yeri hızla evrimleşiyor. İlk başlarda sadece sorduğumuz sorulara kod blokları fırlatan sohbet robotlarımız vardı. Ardından IDE eklentileri (Copilot gibi) satır içi tamamlamalarla hayatımızı kolaylaştırdı. Şimdi ise karşımızda “Agentic AI” yani kendi kendine karar alıp uygulayabilen yapay zeka ajanları dönemi var. İşte claude code, bu yeni dönemin en taze ve iddialı temsilcilerinden biri.

Anthropic’in en gelişmiş modeli Claude 3.5 Sonnet altyapısını kullanan bu CLI aracı, terminalinizde çalışan interaktif bir yardımcıdır. Onu basit bir kod jeneratöründen ayıran en büyük özellik, projenizin dosya yapısını okuyabilmesi, terminalinizde komutlar çalıştırabilmesi, git entegrasyonu sayesinde doğrudan commit’ler atabilmesi ve hatta testleri koşturup hata ayıklayabilmesidir. Yani sadece “kod yazan” değil, “kodlama sürecini yöneten” bir yardımcıdan bahsediyoruz.

Kurulum ve İlk Yapılandırma

Claude Code’u kurmak oldukça basit ancak başlamadan önce sisteminizde Node.js (v18 veya üzeri) kurulmuş olması ve aktif bir Anthropic API anahtarınızın bulunması gerekiyor. Hazırsanız terminali açalım ve şu komutla kurulumu başlatalım:

npm install -g @anthropic-ai/claude-code

Kurulum tamamlandıktan sonra, projenizin olduğu dizine gidip aracı başlatmak için sadece şu komutu yazmanız yeterli:

claude

İlk çalıştırmada sizden Anthropic hesabınızla giriş yapmanızı ve API anahtarınızı tanımlamanızı isteyecektir. Bu adımı tamamladıktan sonra terminaliniz yeşil ve siyah tonlarında, sohbete hazır dinamik bir arayüze dönüşecek.

[Görsel: Claude Code ilk kurulum ve API anahtarı eşleme ekranı]

Gerçek Bir Senaryo: Hata Bulma ve Düzeltme Testi

Promisleri ve teorik övgüleri bir kenara bırakalım. kertenkerem.net olarak biz deneyip raporlamayı severiz. Claude Code’u test etmek için basit bir Node.js/Express API projesi oluşturduk. Projede bilerek `/api/users` endpoint’inde (rotasında) parametre uyuşmazlığından kaynaklanan ufak bir hata (bug) bıraktık.

Terminalde Claude’a şu komutu verdik:

“Projeyi analiz et, testleri çalıştır ve eğer bir hata varsa tespit edip düzelt.”

Yapay Zeka Ajanının Çalışma Adımları:

  1. Dosya Keşfi: Claude Code önce dizindeki package.json dosyasını okudu. Hangi test kütüphanesini (Jest) kullandığımızı kendisi anladı.
  2. Komut Çalıştırma İzni: Güvenlik gereği doğrudan komut koşturmuyor. Ekranımıza şu uyarı geldi: “Testleri koşturmak için ‘npm run test’ komutunu çalıştırmak istiyorum, onaylıyor musunuz? (y/n)”. ‘y’ tuşuna basarak onay verdik.
  3. Hata Tespiti ve Düzeltme: Test başarısız oldu. Claude, hata çıktısını okudu, ilgili userController.js dosyasını açtı, hatayı tespit etti ve kodu güncelledi.
  4. Doğrulama: Kodu güncelledikten sonra testleri kendi kendine tekrar koşturdu ve bu kez yeşil ışıkları gördü.

[Görsel: Claude Code’un hata tespit edip kendi kendine kodu düzelttiği terminal çıktısı]

Bu süreç boyunca editörü açıp tek bir satır kod yazmadık veya tarayıcıya geçip hata kodunu aratmadık. Sadece terminalde kaldık ve süreci izledik. İşte dinamik iş akışı yönetimi tam olarak budur!

Claude Code: Artıları ve Eksileri

Her güzel şeyin bir bedeli ve bazı sınırlılıkları vardır. Claude Code’u birkaç gün yoğun olarak kullandıktan sonra çıkardığımız artı ve eksi tablosu şu şekilde:

Artıları (+) Eksileri (-)
Terminalden çıkmadan Git, npm ve dosya işlemlerini yönetebilme hızı. Her işlem API üzerinden yapıldığı için yüksek token tüketimi (maliyet).
Önceki komutların bağlamını (context) kaybetmeden dinamik devam edebilme. Büyük projelerde bazen çok fazla gereksiz dosya okuyup maliyeti artırması.
Hataları kendi kendine test edip düzeltebilen gerçek bir “agent” yapısı. Tamamen internete bağımlı olması ve yerel (offline) çalışamaması.
Kod kalitesini artırmak için anında refactoring önerileri sunabilmesi. Güvenlik hassasiyeti yüksek projelerde komut çalıştırma izinlerinin yorucu olabilmesi.

Maliyetler ve Ücretsiz Alternatifler

Gelelim işin duygusal boyutuna. Claude Code aracını indirmek ve kullanmak tamamen ücretsizdir. Ancak bu araç doğrudan Anthropic’in API’sini kullandığı için, yaptığınız her sorgu ve Claude’un okuduğu her kod satırı sizin API hesabınızdan (token bazlı) ücretlendirilir. Küçük projelerde günlük kullanım birkaç sent tutabilirken, binlerce satırlık devasa projelerde Claude Code’a “bu projeyi incele” demek tek seferde 1-2 dolarlık token tüketimine yol açabilir.

Ücretsiz ve Yerel (Local) Alternatifler:

  • Aider: Claude Code’un en dişli açık kaynaklı rakibidir. Kendi API anahtarınızı kullanabileceğiniz gibi, yerel bilgisayarınızda çalışan Ollama (Llama 3, Mistral vb.) modelleriyle tamamen ücretsiz ve internet olmadan da kullanabilirsiniz.
  • Mentat: Yine terminal tabanlı, açık kaynaklı ve oldukça güçlü bir diğer kodlama asistanı alternatifidir.

Son Söz: Terminalde Gelecek Var mı?

Claude Code, “yapay zekaya kod yazdırma” olayını bir adım öteye taşıyarak doğrudan geliştiricinin doğal ortamına entegre ediyor. Eğer günün büyük bölümünü terminalde geçiriyor, git komutlarıyla yaşıyor ve sürekli bağlam değiştirmekten yoruluyorsanız, bu araca kesinlikle bir şans vermelisiniz. Belki tüm projeyi sıfırdan ona yazdırmayacaksınız ama rutin debug süreçlerinde ve test yazımında en iyi sağ kolunuz olmaya aday.

Category: Genel | LEAVE A COMMENT
Mayıs 28 2026

DevOps’un Geleceği: 2025 ve Ötesinde AIOps, DevSecOps ve Platform Mühendisliği ile Süper Güçlere Ulaşmak!

Merhaba kod sihirbazları, sistem mimarları ve bulut kaşifleri! Klavyeleriniz hazır mı? Çünkü bugün, dijital evrenimizin en dinamik köşelerinden biri olan DevOps’un geleceğine, 2025 ve ötesine doğru heyecan verici bir yolculuğa çıkıyoruz. Kemerlerinizi bağlayın, çünkü bu yolculukta sadece trendleri değil, aynı zamanda bu trendlerin hayatımızı nasıl kolaylaştıracağını, sistemlerimizi nasıl daha akıllı, daha güvenli ve daha verimli hale getireceğini keşfedeceğiz. Hazır mısınız?

DevOps, bildiğiniz gibi, yazılım geliştirme ve operasyon ekipleri arasındaki o meşhur duvarları yıkan, işbirliğini ve otomasyonu merkeze alan bir felsefe. Ama durmak yok, yola devam! Dijital dönüşümün hızı kesilmezken, DevOps da sürekli evrim geçiriyor. Bugün, bu evrimin en parlak yıldızlarından üçüne odaklanacağız: AIOps, DevSecOps ve Platform Mühendisliği. Bu üçlü, sadece birer moda kelime değil, aynı zamanda geleceğin yazılım geliştirme ve dağıtım süreçlerinin temel taşları olmaya aday. Gelin, bu süper güçlerin her birini yakından inceleyelim!

AIOps: Sistemlerinizin Yapay Zeka Destekli Süper Kahramanı

Şimdi hayal edin: Gece yarısı, sistemlerinizden biri aniden garip davranmaya başlıyor. Normalde ne yaparsınız? Logları tararsınız, metrikleri incelersiniz, alarmları kontrol edersiniz… Kısacası, bir dedektif gibi ipuçlarının peşine düşersiniz. Peki ya tüm bu işleri sizin yerinize yapan, hatta sorun daha ortaya çıkmadan size haber veren süper zeki bir asistanınız olsaydı? İşte AIOps tam olarak bu! Yapay zeka (AI) ve makine öğrenimi (ML) algoritmalarını kullanarak IT operasyonlarını (IT Operations) otomatikleştiren ve iyileştiren bir disiplin. Yani, sistemlerinizin kahve makinesi bozulmadan önce size “Kahve makinesi arızalanacak, yedek parça sipariş et!” diyen akıllı bir sistem gibi düşünebilirsiniz. Artık manuel müdahalelerle boğuşmak yerine, AI’ın gücüyle proaktif ve öngörülü olabiliyoruz.

[Buraya AIOps ile ilgili bir görsel ekleyebilirsiniz]

Peki, bu AIOps denen süper kahraman, Kubernetes ekosisteminde nasıl bir rol oynuyor? Bildiğiniz gibi, Kubernetes ortamları dinamik, karmaşık ve sürekli değişen bir yapıya sahip. Binlerce pod, servis ve deployment’ın olduğu bir ortamda manuel olarak sorun tespiti yapmak, samanlıkta iğne aramaktan farksız. AIOps, burada devreye giriyor ve Kubernetes metriklerini, loglarını ve olaylarını (events) gerçek zamanlı olarak analiz ederek anormallikleri tespit ediyor. Örneğin, bir pod’un CPU kullanımında ani ve beklenmedik bir artış olduğunda, AIOps bunu hemen fark edip size bildirebilir, hatta otomatik olarak ölçeklendirme veya yeniden başlatma gibi aksiyonlar önerebilir. Daha da ileri giderek, geçmiş verileri kullanarak gelecekteki kaynak ihtiyaçlarını tahmin edebilir ve proaktif olarak ölçeklendirme kararları almanıza yardımcı olabilir. Bu, Kubernetes kümelerinizin her zaman optimum performansta çalışmasını sağlarken, operasyonel yükünüzü de önemli ölçüde azaltır.

AIOps dünyasında parlayan bazı popüler araçlar var:

  • Prometheus: Kubernetes metriklerini toplamak için endüstri standardı haline gelmiş açık kaynaklı bir izleme sistemi. AIOps algoritmaları için zengin bir veri kaynağı sunar.
  • Grafana: Prometheus ile toplanan metrikleri görselleştirmek için kullanılan, esnek ve güçlü bir dashboard aracı. AIOps’un tespit ettiği anormallikleri ve öngörüleri anlaşılır grafiklerle sunar.
  • Datadog: Kapsamlı bir bulut izleme ve analitik platformu. AIOps yetenekleriyle log yönetimi, APM (Application Performance Monitoring) ve altyapı izlemeyi bir araya getirir.
  • Splunk: Büyük veri analizi ve güvenlik bilgileri ve olay yönetimi (SIEM) için kullanılan güçlü bir platform. AIOps için log ve olay verilerini analiz etme konusunda oldukça yeteneklidir.

AIOps yolculuğunuza başlarken aklınızda bulundurmanız gereken birkaç ipucu:

  • Küçük Başlayın, Büyük Düşünün: Tüm sistemlerinizi bir anda AIOps’a geçirmeye çalışmayın. En kritik veya en çok sorun çıkaran alanlardan başlayarak pilot projeler yapın.
  • Veri Kalitesine Odaklanın: AIOps algoritmaları, beslendiği veriler kadar iyidir. Temiz, doğru ve eksiksiz metrik ve log verileri topladığınızdan emin olun.
  • İnsan Dokunuşunu Unutmayın: AIOps, insan operasyon uzmanlarının yerini almak yerine, onların daha stratejik ve karmaşık sorunlara odaklanmasını sağlar. AI’ın önerilerini her zaman bir insan gözüyle değerlendirin.

DevSecOps: Kalenizi İnşa Ederken Güvenliği Temelden Sağlamak

Bir zamanlar, yazılım geliştirme süreci bir kale inşa etmeye benzerdi. Önce kaleyi inşa eder, sonra etrafına hendekler kazar, duvarları güçlendirir ve nöbetçiler yerleştirirdik. Yani, güvenlik sonradan eklenen bir özellikti. Ama dijital dünyada bu yaklaşım, kapıları açık bırakıp hırsızları davet etmek gibi! İşte DevSecOps, bu eski anlayışı kökten değiştiriyor. Güvenliği (Security) geliştirme (Development) ve operasyon (Operations) süreçlerinin her aşamasına entegre eden bir felsefe. Yani, kalenizi inşa etmeye başlarken, her tuğlayı yerleştirirken güvenliği düşünmek, duvarları örerken sağlamlığını test etmek ve nöbetçileri daha inşaat aşamasında eğitmek gibi. Bu sayede, güvenlik açıkları daha erken aşamalarda tespit edilip giderilir, maliyetler düşer ve en önemlisi, sistemleriniz çok daha sağlam olur.

[Buraya DevSecOps ile ilgili bir görsel ekleyebilirsiniz]

Kubernetes, DevSecOps için adeta bir oyun alanı sunuyor. Kubernetes’in sağladığı esneklik ve otomasyon yetenekleri, güvenlik kontrollerini CI/CD pipeline’larına entegre etmeyi kolaylaştırıyor. Örneğin:

  • Image Scanning: CI/CD sürecinde kullanılan container imajlarını (container images) veya gibi araçlarla otomatik olarak tarayarak bilinen güvenlik açıklarını tespit edebilirsiniz.
  • Runtime Security: gibi araçlarla Kubernetes kümelerinizdeki pod’ların çalışma zamanı davranışlarını izleyebilir, şüpheli aktiviteleri (örneğin, bir web sunucusunun dizinine yazmaya çalışması) anında tespit edip engelleyebilirsiniz.
  • Network Policies: Kubernetes kaynakları ile pod’lar arası ağ iletişimini kısıtlayarak, sadece gerekli olan bağlantılara izin verebilirsiniz. Bu, bir saldırganın içeride yatay hareket etmesini zorlaştırır.
  • Security Context: Pod tanımlarındaki ayarları ile container’ların ayrıcalıklarını (privileges) kısıtlayabilir, root olarak çalışmasını engelleyebilir veya belirli Linux yeteneklerini (capabilities) kaldırabilirsiniz.
  • Admission Controllers: Kubernetes’in ‘ları sayesinde, bir kaynak (örneğin, bir pod) kümeye dağıtılmadan önce güvenlik politikalarına uygunluğunu kontrol edebilir ve gerekirse dağıtımı engelleyebilirsiniz.

DevSecOps dünyasında öne çıkan bazı popüler araçlar:

  • Snyk: Geliştiricilerin kodlarındaki, bağımlılıklarındaki, container imajlarındaki ve IaC (Infrastructure as Code) dosyalarındaki güvenlik açıklarını bulmalarına ve düzeltmelerine yardımcı olan bir platform.
  • Trivy: Container imajları, dosya sistemleri ve Git depolarındaki güvenlik açıklarını, yanlış yapılandırmaları ve gizli sırları (secrets) tespit eden basit ve kapsamlı bir tarayıcı.
  • Falco: Kubernetes ve Linux ortamları için çalışma zamanı güvenlik aracı. Container’ların ve uygulamaların anormal davranışlarını tespit eder ve uyarır.
  • Open Policy Agent (OPA): Bulut yerel ortamlar için genel amaçlı bir politika motoru. Kubernetes admission controller’ları ile entegre olarak güvenlik politikalarını kod olarak tanımlamanıza ve uygulamanıza olanak tanır.

DevSecOps’u benimserken göz önünde bulundurmanız gerekenler:

  • “Shift Left” Yaklaşımı: Güvenliği geliştirme sürecinin en başına, yani “sola” kaydırın. Güvenlik açıklarını kod yazılırken veya test edilirken tespit etmek, üretim ortamında bulmaktan çok daha ucuz ve kolaydır.
  • Otomasyon Şart: Güvenlik kontrollerini CI/CD pipeline’larınıza entegre ederek manuel adımları ortadan kaldırın. Otomatik taramalar, testler ve politika uygulamaları, insan hatasını minimize eder.
  • Güvenlik Kültürü Oluşturun: Güvenlik sadece güvenlik ekibinin işi değildir. Tüm geliştirme ve operasyon ekiplerini güvenlik konusunda eğitin ve onları bu sürecin bir parçası haline getirin.

Platform Mühendisliği: Geliştiricilerin Süper Güçlerini Ortaya Çıkarmak

Bir zamanlar, bir geliştirici yeni bir uygulama dağıtmak istediğinde, adeta bir orkestra şefi gibi her şeyi kendi başına halletmek zorundaydı: sunucu ayarlamak, veritabanı kurmak, ağ yapılandırmak, izleme araçlarını entegre etmek… Bu, geliştiricilerin değerli zamanlarını kod yazmak yerine altyapı işleriyle harcamasına neden oluyordu. İşte Platform Mühendisliği, bu kaosu ortadan kaldırmak için sahneye çıkıyor! Geliştiricilere, uygulamalarını hızlı, güvenli ve otonom bir şekilde dağıtabilmeleri için “self-service” (kendi kendine hizmet) yetenekleri sunan, entegre bir Internal Developer Platform (IDP) oluşturma disiplini. Yani, geliştiricilere sadece tariflerini (kodlarını) vermeleri gereken, tüm mutfak ekipmanlarının (altyapı) hazır olduğu, hatta bulaşıkların bile otomatik yıkandığı bir “süper mutfak” sunmak gibi düşünebilirsiniz. Bu, geliştirici deneyimini (Developer Experience – DX) merkeze alarak verimliliği artırır.

[Buraya Platform Mühendisliği ile ilgili bir görsel ekleyebilirsiniz]

Kubernetes, Platform Mühendisliği’nin kalbinde yer alıyor. IDP’ler genellikle Kubernetes’i temel alarak, altyapı karmaşıklığını geliştiricilerden soyutlar. Geliştiriciler, Kubernetes’in detaylarıyla uğraşmak yerine, daha üst düzey soyutlamalarla (örneğin, bir “uygulama” veya bir “veritabanı” isteği) etkileşime girer. Bu, veya gibi araçlarla mümkün hale gelir:

  • Crossplane: Kubernetes’i bir kontrol düzlemi (control plane) olarak kullanarak, bulut sağlayıcılarındaki (AWS, Azure, GCP) veya şirket içi altyapıdaki kaynakları (veritabanları, mesaj kuyrukları, depolama kovaları vb.) Kubernetes API’si üzerinden yönetmenizi sağlar. Geliştiriciler, bir veritabanı isteğini Kubernetes YAML dosyası olarak tanımlar ve Crossplane bunu arka planda gerçek bulut kaynağına dönüştürür.
  • KubeVela: Uygulama dağıtımını ve yönetimini basitleştiren, bulut yerel bir uygulama dağıtım motoru. Geliştiricilerin uygulamalarını ve bağımlılıklarını (veritabanları, önbellekler vb.) tek bir uygulama tanımıyla dağıtmalarına olanak tanır, altyapı detaylarını soyutlar.

Bu sayede, geliştiriciler kendi altyapı ihtiyaçlarını kendileri karşılayabilir, ancak bu süreç Platform Mühendisliği ekibi tarafından tanımlanan ve uygulanan standartlar ve güvenlik politikaları dahilinde gerçekleşir. Bu, hem hız hem de kontrol sağlar.

Platform Mühendisliği alanında öne çıkan bazı popüler araçlar:

  • Backstage: Spotify tarafından geliştirilen ve CNCF’e bağışlanan, geliştiriciler için bir “geliştirici portalı” oluşturan açık kaynaklı bir platform. Tüm yazılım bileşenlerini, dokümantasyonu, CI/CD pipeline’larını ve altyapı kaynaklarını tek bir arayüzde bir araya getirir.
  • Crossplane: Yukarıda bahsedildiği gibi, Kubernetes’i bir kontrol düzlemi olarak kullanarak altyapı kaynaklarını yönetmenizi sağlar.
  • KubeVela: Yine yukarıda bahsedildiği gibi, uygulama dağıtımını ve yönetimini basitleştiren bir platform.
  • Terraform: IaC (Infrastructure as Code) için popüler bir araç. Platform Mühendisliği ekipleri, altyapılarını Terraform ile tanımlayarak standartlaştırılmış ve tekrarlanabilir ortamlar oluşturur.

Platform Mühendisliği yolculuğunuzda size yardımcı olacak ipuçları:

  • Geliştirici Deneyimini (DX) Merkeze Alın: Platformunuzu tasarlarken ve geliştirirken, geliştiricilerin ihtiyaçlarını ve geri bildirimlerini ön planda tutun. Onların işini kolaylaştıran bir platform, benimsenme oranını artıracaktır.
  • MVP (Minimum Viable Platform) ile Başlayın: Tüm özellikleri bir anda sunmaya çalışmayın. Geliştiricilerin en acil ihtiyaçlarını karşılayan temel bir platformla başlayın ve zamanla iteratif olarak geliştirin.
  • Platformu Bir Ürün Olarak Görün: Platformunuzu, dahili müşterileri (geliştiriciler) olan bir ürün gibi yönetin. Yol haritası oluşturun, geri bildirim toplayın ve sürekli iyileştirme yapın.

Sonuç: Geleceğe Hazır Olun!

İşte böyle kod dostları! DevOps’un 2025 ve ötesindeki evrimine kısa ama dolu dolu bir bakış attık. AIOps ile sistemlerimizi daha akıllı hale getiriyor, sorunları öngörüyor ve operasyonel yükümüzü azaltıyoruz. DevSecOps ile güvenliği bir sonradan eklenen özellik olmaktan çıkarıp, yazılım geliştirme sürecinin DNA’sına işliyoruz. Ve Platform Mühendisliği ile geliştiricilerimize süper güçler kazandırarak, onların daha hızlı, daha mutlu ve daha üretken olmalarını sağlıyoruz.

Bu trendler, sadece teknolojik yenilikler değil, aynı zamanda iş yapış şekillerimizi, ekipler arası işbirliğini ve hatta şirket kültürünü dönüştüren güçlü katalizörler. Kubernetes’in bu dönüşümdeki merkezi rolü ise yadsınamaz. Bulut yerel mimarilerin yükselişiyle birlikte, bu üç trendin önemi katlanarak artacak.

Unutmayın, dijital dünya sürekli değişiyor ve bizler de bu değişime ayak uydurmak zorundayız. Bu yeni nesil DevOps yaklaşımlarını benimseyerek, sadece bugünün değil, yarının da zorluklarına hazır olabiliriz. Öğrenmeye, denemeye ve yenilikçi olmaya devam edin! Gelecek, bu süper güçleri kullananların olacak. Bir sonraki yazıda görüşmek üzere, kodunuz bol, hatalarınız az olsun!

Category: Genel | LEAVE A COMMENT
Mayıs 28 2026

GitOps: Altyapınızın Orkestra Şefi Artık Git!

Merhaba sevgili teknoloji meraklıları, kod sihirbazları ve altyapı mimarları! Nasılsınız, iyi misiniz? Umarım her şey yolundadır ve sunucularınız tıkır tıkır çalışıyordur. Bugün, son zamanlarda adını sıkça duyduğumuz, hatta belki de “yeni nesil IaC” olarak nitelendirebileceğimiz bir konuya dalış yapacağız: GitOps.

Şimdi durup bir düşünelim: “Infrastructure as Code” (IaC) zaten hayatımızdaydı, değil mi? `CloudFormation`, `Terraform`, `Ansible` gibi araçlarla altyapımızı kod olarak tanımlıyor, versiyonluyor ve otomatikleştiriyorduk. Harika! Peki, bu kadar güzelliğin üzerine GitOps neyi farklı yapıyor? Neden şimdi herkes GitOps konuşuyor? İşte tam da bu noktada, Git’in sadece uygulama kodumuz için değil, tüm altyapımız için de “tek doğruluk kaynağı” (single source of truth) haline geldiği o büyülü dünyaya adım atıyoruz. GitOps, altyapı yönetimini, yazılım geliştirme pratiklerinin en iyi yönleriyle birleştirerek, bize daha güvenilir, daha şeffaf ve daha hızlı bir yol sunuyor. Hazır olun, çünkü altyapınızın orkestra şefi artık Git!

GitOps Nedir? Orkestrayı Kim Yönetiyor?

GitOps’u anlamanın en güzel yolu, onu bir orkestra metaforuyla açıklamaktır. Hayal edin: Bir orkestra var ve bu orkestranın her bir üyesi (sunucular, veritabanları, ağ bileşenleri, Kubernetes Pod’ları) kendi enstrümanını çalıyor. Peki, bu koca orkestrayı kim yönetiyor? Tabii ki bir orkestra şefi! GitOps dünyasında bu şef, sizin Git deponuz (Git repository).

GitOps’un temel felsefesi üç ana sütun üzerine kuruludur:

  1. Deklaratif Tanımlama (Declarative Configuration): Altyapınızın mevcut durumunu değil, olması gereken durumunu tanımlarsınız. Yani, “şu sunucuyu kur” demek yerine, “şöyle bir sunucu olsun” dersiniz. Bu tanımlamalar, `YAML` veya `JSON` gibi deklaratif dillerle Git deponuzda saklanır. Git deponuz, orkestranın çalacağı notaların yazılı olduğu partisyon gibidir.
  2. Versiyonlama ve Değişiklik Takibi (Versioned and Tracked Changes): Altyapınızdaki her değişiklik, tıpkı uygulama kodunuzdaki gibi, Git üzerinde bir `commit` olarak kaydedilir. Bu, her an altyapınızın geçmişteki herhangi bir durumuna geri dönebileceğiniz (rollback) anlamına gelir. Ayrıca, kimin ne zaman, hangi değişikliği yaptığını kolayca takip edebilirsiniz. Bu, partisyonun her bir revizyonunun kaydedilmesi gibidir; her zaman önceki versiyonlara bakabilir, hatta hatalı bir notayı düzeltebilirsiniz.
  3. Otomatikleştirilmiş Senkronizasyon (Automated Synchronization): Git deponuzdaki deklaratif tanımlamalar ile canlı altyapınız arasındaki senkronizasyon sürekli olarak otomatik bir şekilde sağlanır. Yani, Git’teki partisyon değiştiğinde, orkestra (altyapı) bu yeni notaları otomatik olarak çalmaya başlar. Bu otomasyon, genellikle bir “operatör” veya “agent” tarafından gerçekleştirilir. Bu operatör, Git deponuzu sürekli izler ve herhangi bir değişiklik olduğunda, canlı altyapıyı Git’teki duruma getirmek için gerekli aksiyonları alır. Bu sayede, insan hatası riski minimuma iner ve dağıtım süreçleri hızlanır.

Özetle, GitOps ile altyapınızdaki tüm değişiklikler sadece Git deponuza bir `commit` ve `pull request` gönderilerek yapılır. Doğrudan canlı ortama müdahale etmek yerine, Git üzerinden dolaylı ve kontrollü bir şekilde hareket edersiniz. Bu, hem güvenliği artırır hem de denetlenebilirliği maksimize eder.

[Buraya GitOps Akışını Gösteren Bir Diyagram Ekleyebilirsiniz]

Neden Kubernetes ve GitOps Mükemmel Bir İkili?

Kubernetes, doğası gereği deklaratif bir sistemdir. `Deployment`, `Service`, `Pod` gibi kaynakları `YAML` dosyalarıyla tanımlar ve Kubernetes’e “benim altyapım böyle olsun” dersiniz. Kubernetes de bu deklaratif tanıma ulaşmak için elinden geleni yapar. İşte bu deklaratif yapı, GitOps ile Kubernetes’i adeta ruh ikizi haline getiriyor.

Geleneksel Kubernetes yönetiminde, geliştiriciler veya operasyon ekipleri genellikle `kubectl apply -f my-app.yaml` gibi komutlarla doğrudan cluster’a müdahale ederler. Bu yaklaşım, küçük ölçekli projelerde sorun yaratmasa da, büyük ve dinamik ortamlarda ciddi problemlere yol açabilir:

  • Drift (Sapma): Canlı cluster’daki durum ile `YAML` dosyalarınızdaki tanımlar arasında zamanla farklar oluşabilir. Birisi cluster’da manuel bir değişiklik yapar, ancak bu değişiklik Git’e yansımaz. Sonuç? “Benim makinemde çalışıyordu!” sendromunun altyapı versiyonu.
  • Denetlenebilirlik Eksikliği: Kimin ne zaman, hangi değişikliği yaptığını takip etmek zorlaşır. Güvenlik ve uyumluluk açısından büyük bir risk.
  • Manuel Hatalar: İnsan faktörü, özellikle stresli anlarda, hatalı komutların çalıştırılmasına ve kesintilere neden olabilir.

GitOps, bu sorunların hepsine zarif bir çözüm sunar. Git deponuz, Kubernetes cluster’ınızın tek ve nihai doğruluk kaynağıdır. Cluster’da bir değişiklik mi yapmak istiyorsunuz? Doğrudan `kubectl` kullanmak yerine, Git deponuzdaki ilgili `YAML` dosyasını günceller, bir `commit` yapar ve bir `pull request` açarsınız. Bu `pull request` incelenir, onaylanır ve `merge` edildiğinde, GitOps operatörü bu değişikliği algılar ve Kubernetes cluster’ınızı otomatik olarak yeni duruma getirir.

Bu sayede:

  • Drift ortadan kalkar: Cluster her zaman Git’teki durumu yansıtır.
  • Tam denetlenebilirlik sağlanır: Her değişiklik Git geçmişinde kayıtlıdır.
  • Manuel hatalar azalır: Dağıtım süreçleri otomatikleşir ve insan müdahalesi minimuma iner.
  • Geri alma (Rollback) kolaylaşır: Hatalı bir dağıtım durumunda, Git geçmişindeki önceki bir `commit`’e geri dönmek kadar kolaydır.

Kubernetes’in deklaratif API’si ve Git’in versiyon kontrol yetenekleri birleştiğinde, altyapı yönetimi, uygulama geliştirme kadar çevik, güvenilir ve tekrarlanabilir hale gelir.

Sahnenin Yıldızları: Popüler GitOps Araçları

GitOps felsefesini hayata geçirmek için birçok harika araç mevcut. İşte sahnenin en parlak yıldızlarından ikisi:

Argo CD

`Argo CD`, Kubernetes için deklaratif, `GitOps` tabanlı sürekli dağıtım (Continuous Delivery) aracıdır. En belirgin özelliği, “pull” tabanlı çalışma mantığıdır. Yani, `Argo CD` cluster’ınızda bir `agent` olarak çalışır ve sürekli olarak Git deponuzu izler. Git’teki tanımlar ile canlı cluster’daki durum arasında bir fark (drift) tespit ettiğinde, cluster’ı otomatik olarak Git’teki duruma senkronize eder.

`Argo CD`’nin öne çıkan özellikleri:

  • Pull-Based Dağıtım: Cluster’ın içinden Git deponuzu izler ve değişiklikleri çeker. Bu, güvenlik açısından avantajlıdır çünkü cluster’a dışarıdan erişim izni vermeniz gerekmez.
  • Zengin Web Arayüzü: `Argo CD`, dağıtılan uygulamalarınızın durumunu, senkronizasyon sağlığını ve geçmişini görsel olarak takip edebileceğiniz kullanıcı dostu bir web arayüzüne sahiptir. Bu arayüz, özellikle büyük ve karmaşık ortamlarda sorun giderme ve izleme için paha biçilmezdir.
  • Otomatik Senkronizasyon ve Sağlık Kontrolü: Git’teki değişiklikleri otomatik olarak algılar ve cluster’a uygular. Ayrıca, dağıtılan kaynakların sağlığını sürekli kontrol eder.
  • Rollback ve Roll-Forward: Hatalı dağıtımları kolayca geri alabilir veya yeni bir `commit` ile ileriye doğru düzeltebilirsiniz.
  • Çoklu Cluster Desteği: Birden fazla Kubernetes cluster’ını tek bir `Argo CD` örneği üzerinden yönetebilirsiniz.

Flux CD

`Flux CD`, `Cloud Native Computing Foundation` (CNCF) bünyesinde geliştirilen bir başka popüler GitOps aracıdır. `Argo CD` gibi, `Flux` da “pull” tabanlı bir yaklaşımla çalışır ve Git deponuzu tek doğruluk kaynağı olarak kabul eder. `Flux`, özellikle `kustomize` ve `Helm` gibi Kubernetes paketleme araçlarıyla güçlü entegrasyonlarıyla bilinir.

`Flux CD`’nin temel özellikleri:

  • Git-Merkezli Yaklaşım: `Flux`, Git deponuzu merkeze alır ve tüm dağıtım süreçlerini buradan yönetir.
  • CNCF Projesi: `CNCF` çatısı altında olması, projenin uzun vadeli sürdürülebilirliği ve topluluk desteği açısından güven verir.
  • Kustomize ve Helm Entegrasyonu: `kustomize` ile Kubernetes manifestlerini özelleştirebilir ve `Helm` ile uygulamaları kolayca paketleyip dağıtabilirsiniz. `Flux`, bu araçlarla sorunsuz bir şekilde entegre olur.
  • Operatör Modeli: Kubernetes cluster’ında çalışan bir dizi operatörden oluşur. Bu operatörler, Git deponuzu izler ve cluster’daki kaynakları senkronize eder.
  • Genişletilebilirlik: `Flux`, `notification-controller`, `image-reflector-controller` gibi çeşitli bileşenlerle genişletilebilir bir yapıya sahiptir.
  • Sürekli Senkronizasyon: Git deponuzdaki değişiklikleri algılar ve cluster’ı otomatik olarak günceller.

Her iki araç da GitOps felsefesini başarıyla uygulasa da, arayüz, özellik setleri ve topluluk yaklaşımları açısından farklılıklar gösterirler. Seçiminiz, projenizin ihtiyaçlarına ve ekibinizin tercihlerine göre değişebilir.

Altın Değerinde İpuçları ve En İyi Pratikler (Tips & Tricks)

GitOps yolculuğunuzda size rehberlik edecek birkaç altın değerinde ipucu ve en iyi pratik:

Repo Yapılandırması: Uygulama Kodu ve Altyapı/Konfigürasyon Repolarını Ayırın

GitOps’a başlarken yapılan yaygın hatalardan biri, uygulama kodu ile altyapı/konfigürasyon tanımlamalarını aynı Git deposunda tutmaktır. Bu, başlangıçta kolay gibi görünse de, zamanla karmaşıklığı artırır ve sorumlulukların bulanıklaşmasına neden olur. En iyi pratik, bu iki alanı ayrı depolarda yönetmektir:

  • Uygulama Kodu Reposu: Sadece uygulamanızın kaynak kodunu, testlerini ve `Dockerfile` gibi uygulama özel dosyalarını içerir.
  • Altyapı/Konfigürasyon Reposu (Config Repo): Kubernetes manifestleri (`Deployment`, `Service`, `Ingress` vb.), `Helm` chart’ları, `kustomize` dosyaları ve diğer altyapı tanımlamalarını içerir.

Bu ayrım, “App-of-apps pattern” olarak da bilinir ve birçok fayda sağlar:

  • Sorumluluk Ayrımı: Geliştiriciler uygulama koduna, operasyon ekipleri ise altyapı konfigürasyonlarına odaklanabilir.
  • Daha Hızlı Dağıtım: Uygulama kodu değiştiğinde sadece uygulama `CI/CD` pipeline’ı tetiklenir. Altyapı değiştiğinde ise sadece GitOps pipeline’ı çalışır.
  • Gelişmiş Güvenlik: Uygulama koduna erişimi olan herkesin altyapı konfigürasyonlarını değiştirmesini engeller.
  • Daha Temiz Git Geçmişi: Her deponun kendi alanına özel, anlamlı `commit` geçmişi olur.

Gizli Bilgilerin (Secrets) Yönetimi: Git’te Şifreli Saklayın

GitOps’un temel prensibi, her şeyin Git’te olmasıdır. Ancak bu, veritabanı şifreleri, API anahtarları gibi hassas bilgileri (secrets) açık metin olarak Git’e koymanız gerektiği anlamına gelmez. Bu, büyük bir güvenlik açığıdır! `Secrets` yönetimi, GitOps’un en kritik ve dikkatli olunması gereken alanlarından biridir.

Çözüm, `secrets`’ları Git’te şifreli olarak saklamak ve sadece Kubernetes cluster’ında deşifre edilmesini sağlamaktır. Bu amaçla kullanabileceğiniz popüler araçlar şunlardır:

  • Sealed Secrets: `Bitnami` tarafından geliştirilen bu araç, `secrets`’larınızı Kubernetes cluster’ınızın anahtarlarıyla şifrelemenizi sağlar. Şifrelenmiş `secret`’ı Git’e `commit` edersiniz ve `Sealed Secrets` operatörü, cluster’da bu `secret`’ı deşifre ederek normal bir Kubernetes `Secret` objesine dönüştürür. Bu sayede, `secret`’lar Git’te güvenli bir şekilde saklanırken, sadece yetkili cluster’lar tarafından kullanılabilir.
  • HashiCorp Vault: Daha gelişmiş ve merkezi bir `secret` yönetimi çözümü arıyorsanız, `Vault` harika bir seçenektir. `Vault`, `secrets`’ları güvenli bir şekilde depolar ve Kubernetes cluster’ınızdaki uygulamaların bu `secrets`’lara erişmesini sağlar. `Vault` entegrasyonu genellikle `Vault Agent Injector` veya `External Secrets Operator` gibi araçlarla yapılır.

Unutmayın, `secrets`’ları asla açık metin olarak Git’e koymayın!

Pull Request (PR) Kültürü: Her Değişiklik Bir İncelemeden Geçsin

GitOps, sadece araçlardan ibaret değildir; aynı zamanda bir kültürdür. Bu kültürün merkezinde ise Pull Request (PR) mekanizması yer alır. Altyapınızda yapacağınız her değişiklik, küçük veya büyük olsun, bir `pull request` aracılığıyla yapılmalıdır.

`PR` kültürü, size şu faydaları sağlar:

  • Kod İncelemesi (Code Review): Her değişiklik, ekip üyeleri tarafından incelenir. Bu, hataların erken aşamada yakalanmasını, en iyi pratiklerin uygulanmasını ve bilgi paylaşımını teşvik eder.
  • Denetlenebilirlik ve Onay Süreci: `PR`’lar, değişikliklerin ne zaman, kim tarafından ve hangi amaçla yapıldığını gösteren resmi bir kayıt tutar. Ayrıca, değişikliklerin canlı ortama uygulanmadan önce onaylanması gereken bir süreç oluşturur. Bu, özellikle uyumluluk gereksinimleri olan sektörler için hayati öneme sahiptir.
  • İşbirliği ve Bilgi Paylaşımı: `PR`’lar, ekip üyelerinin birbirlerinin çalışmalarından haberdar olmasını ve altyapı hakkında ortak bir anlayış geliştirmesini sağlar.
  • Otomatik Testler: `PR`’lar, otomatik testlerin (linting, statik analiz, entegrasyon testleri) tetiklenmesi için mükemmel bir noktadır. Bu testler, değişikliklerin kalitesini ve güvenliğini artırır.

Her `commit` bir `PR`’a, her `PR` bir incelemeye ve her `merge` bir otomatik dağıtıma dönüşmelidir. Bu döngü, GitOps’un gücünü tam anlamıyla ortaya çıkarır.

Sonuç

GitOps, altyapı yönetimini, yazılım geliştirme dünyasının en iyi pratikleriyle buluşturan, devrim niteliğinde bir yaklaşımdır. Artık altyapınız, tıpkı uygulama kodunuz gibi, versiyonlanabilir, denetlenebilir ve otomatikleştirilebilir bir varlık haline geliyor. Git deponuz, altyapınızın tek doğruluk kaynağı olurken, `Argo CD` ve `Flux CD` gibi araçlar, bu vizyonu gerçeğe dönüştürmek için sahnedeki yerlerini alıyor.

Unutmayın, GitOps sadece bir araç seti değildir; aynı zamanda bir kültürdür. Deklaratif tanımlamalar, versiyon kontrolü ve sürekli otomasyon prensiplerini benimseyerek, ekipleriniz daha güvenilir, daha şeffaf ve daha verimli bir şekilde çalışabilir. Altyapınızdaki “drift” kabusuna son verin, manuel hataları minimuma indirin ve geliştirici verimliliğini artırın.

Eğer henüz GitOps dünyasına adım atmadıysanız, şimdi tam zamanı! Kubernetes ile olan mükemmel uyumu sayesinde, bulut yerel uygulamalarınızı yönetme şeklinizi kökten değiştirecek bu felsefeyi keşfetmekten çekinmeyin. Altyapınızın orkestra şefliğini Git’e devredin ve müziğin hiç durmamasını sağlayın!

Bir sonraki yazıda görüşmek üzere, kodunuz bol, sunucularınız stabil olsun!

Category: Genel | LEAVE A COMMENT
Mayıs 28 2026

30 Yaş Sonrası Kas Kaybına Savaş: Hücresel Yaşlanmayı Geciktiren Direnç Antrenmanları

30 mumlu o doğum günü pastasını üflediğimiz an, vücudumuzda sessiz sedasız bir şeyler değişmeye başlar. Hayır, bir gecede yaşlanmıyoruz tabii ki ama biyolojik saatimiz vites değiştiriyor. Bilim insanlarının “sarkopeni” dediği yaşa bağlı kas kaybı, tam da bu dönemde kapımızı çalar. Ancak panik yapmaya gerek yok; sarkopeni önleme sandığınızdan daha eğlenceli ve dinamik bir yolla mümkün. Hücresel yaşlanmayı geciktirmenin, metabolizmayı canavar gibi çalıştırmanın ve geleceğe yatırım yapmanın sırrı, o çok göz korkutan ağırlık çalışması seanslarında saklı.

Kertenkerem.net olarak bu yazıda, “Neden 30’dan sonra her şey daha zor?” sorusunun yanıtını arayacak ve sizi birer fitness salonu müdavimi yapmadan, evde veya salonda uygulayabileceğiniz bilimsel bir yol haritası sunacağız.

Sarkopeni Nedir ve Neden 30’dan Sonra Başlar?

Neden böyle oluyor? Doğa neden bize düşman? Aslında düşman değil, sadece tasarruflu. Vücudumuz son derece pragmatik bir organdır. Kullanılmayan her şeyi “gereksiz yük” olarak görür ve elden çıkarır. 30 yaşından sonra, hormonal seviyelerdeki (özellikle büyüme hormonu ve testosteron) doğal düşüşle birlikte, vücut kas kütlesini korumakta zorlanmaya başlar.

Araştırmalar gösteriyor ki, 30 yaşından sonra her on yılda ortalama %3 ila %8 oranında kas kütlesi kaybediyoruz. Eğer hareketsiz bir yaşam sürüyorsak, bu kayıp çok daha dramatik boyutlara ulaşıyor. Kas kaybı sadece kollarımızın sarkması demek değil; yavaşlayan bir metabolizma, azalan kemik yoğunluğu ve dolayısıyla erken yaşlanma anlamına geliyor.

Direnç Antrenmanı Faydaları: Hücresel Düzeyde Gençleşme

Peki, çözüm ne? Sadece kardiyo yapmak (koşmak, yürümek) kalp sağlığımız için harikadır ama kas kaybını durdurmakta yetersiz kalır. İşte burada devreye direnç antrenmanı faydaları giriyor. Direnç antrenmanı, kasları yerçekimine veya harici bir ağırlığa karşı çalışmaya zorlayan her türlü egzersizdir.

Bilimsel araştırmalar gösteriyor ki, ağırlık çalışmak hücrelerimizin enerji santralleri olan mitokondrileri gençleştiriyor. Kaslar kasıldığında, vücut “miyokin” adı verilen ve beyinden bağışıklık sistemine kadar tüm vücutta anti-enflamatuar (iltihap karşıtı) etkiler yaratan kimyasallar salgılar. Yani ağırlık kaldırmak, aslında hücrelerinize “Hâlâ hayattayız ve savaşmaya devam ediyoruz!” mesajı göndermektir. Bu yüzden uzun yaşam spor trendlerinin merkezinde artık maraton koşuları değil, akıllıca planlanmış ağırlık antrenmanları yer alıyor.

Önemli Uyarı: Eğer kronik bir rahatsızlığınız (özellikle fıtık, eklem problemleri veya kalp rahatsızlığı) varsa, yeni bir ağırlık antrenmanı programına başlamadan önce mutlaka uzman bir hekime danışmalısınız. Egzersizleri doğru formda yapmak sakatlanmaları önler.

Haftalık Direnç Antrenmanı Nasıl Planlanır?

Gözünüz korkmasın. Haftada 5 gün saatlerce ağırlık kaldırmak zorunda değilsiniz. Uzun vadeli ve sürdürülebilir bir plan, her zaman en vahşi plandan daha iyidir. İşte hücresel yaşlanmayı yavaşlatacak eyleme geçirilebilir bir haftalık planlama rehberi:

1. Bileşik Hareketlere (Compound Exercises) Odaklanın

Tek bir kas grubunu izole eden hareketler yerine, aynı anda birden fazla eklemi ve kas grubunu çalıştıran hareketleri seçin. Bunlar vücudun en çok hormon salgılamasını sağlayan hareketlerdir.

  • Squat (Çömelme): Bacak, kalça ve core bölgesini çalıştırır.
  • Push-up (Şınav) / Bench Press: Göğüs, omuz ve arka kolu hedefler.
  • Rowing (Kürek): Sırt ve pazu kaslarını güçlendirir.

2. Progresif Aşırı Yükleme (Progressive Overload) Uygulayın

Kaslarınızın gelişmeye ve adaptasyon sağlamaya devam etmesi için onları zamanla daha fazla zorlamalısınız. Her hafta aynı 5 kiloluk dambılı kaldırmak bir süre sonra fayda sağlamaz. Ağırlığı milimetrik olarak artırın, tekrar sayısını çoğaltın veya hareketler arasındaki dinlenme süresini kısaltın.

3. Haftalık Programınızı Sade Tutun

Haftada 2 veya 3 gün, tüm vücudu (Full Body) hedefleyen 40-45 dakikalık seanslar başlangıç için mükemmeldir. Aşağıdaki basit haftalık şablonu bilgisayarınıza veya telefonunuza kaydedebilirsiniz:


# kertenkerem.net Haftalık Direnç Planı
PAZARTESİ: Tüm Vücut (Squat + Şınav + Dumbbell Row) -> 3 set x 10 tekrar
ÇARŞAMBA : Dinlenme veya Hafif Yürüyüş
CUMA     : Tüm Vücut (Lunge + Overhead Press + Plank) -> 3 set x 12 tekrar
PAZAR    : Aktif Dinlenme (Mobilite ve Esneme)

Özet: Gelecekteki Kendinize Bir İyilik Yapın

Yaşlanmak kaçınılmaz bir biyolojik süreçtir ancak nasıl yaşlanacağımız büyük oranda bizim elimizde. Kaslarımız, bizim yaşlılık sigortamızdır. Bugün yapacağınız bilinçli bir ağırlık çalışması, 70’li yaşlarınızda merdivenleri tek başınıza çıkabilmenizi, torunlarınızla rahatça oynayabilmenizi ve metabolizmanızın tıkır tıkır çalışmasını sağlayacak.

Harekete geçmek için mükemmel anı beklemeyin. Kendi vücut ağırlığınızla yapacağınız basit bir şınav ve squat serisiyle bugün başlayın. Unutmayın, en iyi antrenman, yapılan antrenmandır!

Category: Genel | LEAVE A COMMENT
Mayıs 28 2026

Kendi Lokalinizde LLM Çalıştırmak: Ollama Kurulum Rehberi

Yapay zeka hayatımızın merkezine oturdu ama her sorduğumuz sorunun OpenAI veya Google sunucularına gitmesi canınızı sıkmıyor mu? İşte tam bu noktada local llm (yerel büyük dil modeli) kavramı devreye giriyor. Tamamen kendi bilgisayarınızda çalışan, internete ihtiyaç duymayan ve en önemlisi privacy (gizlilik) endişelerinizi sıfıra indiren bir yapay zeka deneyimi artık hayal değil. Bu rehberde, bu işi çocuk oyuncağı haline getiren ollama aracını mercek altına alıyor, Mac ve Linux sistemlerimizde llama, mistral gibi canavarları nasıl koşturacağımızı adım adım inceliyoruz.

Neden Bulut Değil de Local LLM?

ChatGPT veya Claude kullanırken aslında verilerimizi sürekli uzak sunuculara kiralıyoruz. Şirket sırları, kişisel günlükler veya üzerinde çalıştığınız yeni bir startup fikri… Hepsi birilerinin veri merkezinde işleniyor. Kendi bilgisayarınızda bir yapay zeka çalıştırmak ise size tam bir veri egemenliği sunar.

Bunun yanında, “Çevrimdışı çalışabilme” lüksü de cabası. Metroda, uçakta ya da internetin çekmediği bir kamp alanında, kod yazarken takıldığınız bir yeri yapay zekaya sorabildiğinizi hayal edin. Üstelik API ücreti yok, aylık abonelik derdi yok. Bilgisayarınızın elektriği ve donanımı yettiği sürece sınırsız kullanım hakkına sahipsiniz.

Ollama Nedir ve Ne İşe Yarar?

Eskiden lokalde model çalıştırmak tam bir işkenceydi. Hugging Face’ten gigabaytlarca dosya indirmeniz, doğru Python kütüphanelerini (PyTorch, llama.cpp vb.) kurmanız ve uyumluluk sorunlarıyla boğuşmanız gerekirdi. Ollama, bu karmaşayı tek bir satır kodla çözen harika bir araç. Kendisini yapay zeka modellerinin “Docker”ı olarak düşünebilirsiniz. Modelleri paketler, yönetir ve sisteminizde optimize bir şekilde çalıştırır.

[Görsel: Ollama logosu ve terminalde koşan şık, minimalist bir model çalıştırma ekranı]

Adım Adım Ollama Kurulumu

Lafı fazla uzatmadan işe koyulalım. Biz bu rehberde Mac ve Linux odaklı gideceğiz ancak Ollama’nın artık resmi bir Windows desteği de sunduğunu belirtelim.

macOS Kurulumu

Mac kullanıcıları için süreç inanılmaz derecede basit. Eğer sisteminizde Homebrew kuruluysa terminali açıp şu komutu yazmanız yeterli:

brew install ollama

Alternatif olarak, Ollama’nın resmi web sitesinden direkt bir `.dmg` dosyası indirip uygulamalar klasörünüze de sürükleyebilirsiniz.

Linux Kurulumu

Linux severler için ise tek satırlık bir script yeterli oluyor. Terminalinizi açın ve aşağıdaki komutu yapıştırın:

curl -fsSL https://ollama.com/install.sh | sh

İlk Modeli Ayaklandırmak: Llama 3, Mistral ve Phi-3

Kurulum bittiğine göre şimdi motoru çalıştırma zamanı. Ollama kütüphanesinde kullanabileceğimiz onlarca model var. Biz en popüler üç tanesini test ettik:

  • Llama 3 (8B): Meta’nın geliştirdiği, genel yetenekleri ve Türkçe anlama kapasitesi oldukça yüksek olan amiral gemisi.
  • Mistral (7B): Fransız menşeili Mistral AI tarafından geliştirilen, özellikle kodlama ve mantık yürütmede boyutuna göre devleşen bir model.
  • Phi-3 (3.8B): Microsoft’un “küçük ama zehir gibi” modeli. Düşük sistem kaynakları için ideal.

Gelin, hemen Meta’nın llama 3 modelini indirelim ve çalıştıralım:

ollama run llama3

Bu komutu verdiğinizde Ollama önce yaklaşık 4.7 GB boyutundaki modeli arka planda indirecek, ardından terminalinizi interaktif bir chat ekranına dönüştürecektir.

[Görsel: Terminal ekranında Ollama üzerinden Llama 3 modeline ‘Merhaba, bana yerel bir yapay zekanın avantajlarını anlat’ sorusunun sorulduğu ve saniyeler içinde alınan yanıtın ekran görüntüsü]

Deneyim ve Raporlama: Gerçekten Hızlı mı?

Lafı dolandırmayalım, doğrudan test sonuçlarımızı paylaşalım. Testi gerçekleştirdiğimiz makine: M1 MacBook Air (16 GB RAM).

Llama 3 (8B) modeline Türkçe bir soru sorduğumuzda aldığımız hız yaklaşık saniyede 15-18 token civarındaydı. Bu hız, rahatça okuyabileceğinizden daha hızlı bir şekilde metnin ekrana akması demek. Microsoft’un Phi-3 modelinde ise bu hız saniyede 30-35 token seviyelerine fırladı. Yani GPU olmadan, sadece Apple Silicon işlemcinin gücüyle bile akıcı bir deneyim elde etmek son derece mümkün.

Terminalden Sıkılanlara: Open WebUI Entegrasyonu

Terminal ekranında yapay zekayla sohbet etmek havalı görünse de, uzun vadede ChatGPT benzeri, sohbet geçmişini tutan, temiz bir arayüz arıyoruz. İşte burada imdadımıza Open WebUI yetişiyor.

Open WebUI’ı bilgisayarınızda çalıştırmanın en temiz yolu Docker kullanmaktır. Eğer bilgisayarınızda Docker kuruluysa, terminale şu komutu yazarak arayüzü başlatabilirsiniz:

docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway -v open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:main

Bu işlemden sonra tarayıcınızı açıp http://localhost:3000 adresine gittiğinizde, yerel ağınızda çalışan şık bir ChatGPT klonuyla karşılaşacaksınız. Üstelik Ollama ile indirdiğiniz tüm modeller sol üstteki açılır menüde otomatik olarak belirecektir.

[Görsel: Open WebUI arayüzünün karanlık modda çekilmiş ekran görüntüsü. Sol tarafta sohbet geçmişi, ortada ise Llama 3 ile yapılan Türkçe bir sohbet görünüyor.]

GPU Olmadan Performans Optimizasyonu Nasıl Yapılır?

Eğer güçlü bir ekran kartınız (NVIDIA RTX serisi gibi) veya bir Apple Silicon Mac’iniz yoksa, saf CPU gücüyle LLM çalıştırmak bilgisayarınızı biraz terletebilir. Ancak pes etmenize gerek yok, işte uygulayabileceğiniz optimizasyon adımları:

  1. Kuantize (Quantized) Modeller Seçin: Ollama varsayılan olarak modellerin 4-bit kuantize edilmiş sürümlerini indirir. Bu, modelin beynini (ağırlıklarını) biraz küçültmek ama zekasından çok az ödün vererek RAM kullanımını 1/4 oranına düşürmek demektir. Ekstra bir şey yapmanıza gerek yok, Ollama bunu sizin yerinize zaten yönetiyor.
  2. Küçük Modellere Yönelin: 8B (8 milyar parametre) yerine 3B veya 1.5B parametreli modelleri tercih edin. Örneğin ollama run phi3 veya ollama run gemma:2b düşük RAM’li bilgisayarlar için biçilmiş kaftandır.
  3. Arka Plan Uygulamalarını Kapatın: Yerel LLM çalıştırırken en kritik kaynak RAM’dir. Docker ve Ollama çalışırken özellikle RAM canavarı tarayıcı sekmelerini kapatmak performansı gözle görülür şekilde artırır.

Ollama: Artılar ve Eksiler

Kendi deneyimlerimiz doğrultusunda hazırladığımız dürüst tabloya göz atalım:

Artıları (+) Eksileri (-)
Tamamen ücretsiz ve açık kaynak kodlu. Çok büyük modeller (70B+) için aşırı güçlü donanım ister.
%100 gizlilik ve internet gerektirmeyen çalışma yapısı. Mobil cihazlarda doğrudan çalıştırmak (henüz) pratik değil.
Tek satırla model indirme ve güncelleme kolaylığı. Modeller geliştikçe diskte ciddi yer kaplıyorlar.
Aktif topluluk desteği ve harika API entegrasyonu. Türkçe dil desteği GPT-4 seviyesinde değil ama tatminkar.

Fiyat ve Ücretsiz Alternatifler

Ollama tamamen ücretsizdir. Kullandığınız modeller de açık kaynaklı olduğu için herhangi bir lisans ücreti ödemezsiniz.

Eğer Ollama’nın terminal tabanlı yapısı size hitap etmediyse, alternatif olarak şu tamamen ücretsiz araçları da deneyebilirsiniz:

  • LM Studio: Görsel bir arayüze sahip, modelleri arayıp tek tıkla indirebileceğiniz ve yerel sunucu kurabileceğiniz harika bir masaüstü uygulaması (Mac/Windows/Linux).
  • Jan.ai: Tamamen açık kaynaklı, şık arayüzlü bir başka yerel LLM istemcisi.

Kendi local LLM dünyanızı kurmak işte bu kadar kolay. Terminali açın, Ollama’yı kurun ve yapay zekanın kontrolünü kendi ellerinize alın. Bir sonraki rehberde görüşmek üzere!

Category: Genel | LEAVE A COMMENT
Mayıs 27 2026

Git Commit Çöplüğüne Son: CI/CD Pipeline Süreçlerini Yerelde Test Etme Yöntemleri

Yazım hatası yüzünden patlayan bir build. Arkasından gelen “fix typo” commit’i. O da yemedi; “fix syntax again”, “please work”, “test 4” ve nihayetinde “really fix this time”. Tanıdık geldi mi? Reponun commit geçmişini adeta bir çöplüğe çeviren bu döngü, yalnızca estetik bir problem değil. Her push işleminde buluttaki runner’ın ayağa kalkmasını beklemek, saatlik faturaları şişirmek ve geri bildirim döngüsünü (feedback loop) dakikalarca uzatmak demektir. Profesyonel bir SRE veya DevOps mühendisi için bu kabul edilemez bir zaman kaybıdır.

Bu pratik rehberde, commit-push-wait döngüsünden kurtulup yerel pipeline testi (local cicd testing) süreçlerini nasıl profesyonelce kurgulayacağımızı ele alacağız. GitHub Actions ve GitLab CI pipeline’larınızı, uzak sunuculara hiç dokunmadan, doğrudan kendi terminalinizde nasıl simüle edeceğinizi gerçek senaryolarla inceleyeceğiz.

Neden Yerelde Test Etmeliyiz? (The SRE Perspective)

Bunu sadece “temiz git geçmişi” motivasyonuyla açıklamıyoruz. Altında yatan asıl nedenler tamamen operasyonel verimlilik ve güvenlikle ilgilidir:

  • Hızlı Geri Bildirim Döngüsü: Buluttaki bir runner’ın kuyrukta beklemesi, imajı çekmesi ve init olması ortalama 1-3 dakika sürer. Yerelde bu süre saniyeler mertebesindedir.
  • Maliyet Optimizasyonu: GitHub Actions veya GitLab CI faturalarınızın önemli bir kısmı, aslında “deneme-yanılma” aşamasındaki başarısız run’lardan kaynaklanır.
  • Güvenli Secret Yönetimi: Yeni bir entegrasyonu denerken production secret’larını ya da hassas API anahtarlarını geçici olarak buluttaki CI ortamına eklemek her zaman güvenlik riski barındırır.

GitHub Actions’ı Yerelde Koşturmak: act

GitHub Actions workflow’larını yerel makinede çalıştırmanın fiili standardı act aracıdır. `act`, lokalinizdeki Docker daemon’ını kullanarak GitHub’ın runner ortamlarını simüle eden container’lar ayağa kaldırır ve tanımladığınız adımları bu container’lar içinde çalıştırır.

act Kurulumu ve Temel Kullanımı

Kurulumu macOS işletim sistemlerinde Homebrew ile hızlıca yapabilirsiniz:

brew install nektos/tap/act

Eğer Linux kullanıyorsanız, doğrudan binary olarak çekebilirsiniz:

curl -s https://raw.githubusercontent.com/nektos/act/master/install.sh | sudo bash

Gerçekçi Bir Senaryo: Secret’lar ve Matrix Yapıları

Diyelim ki elinizde node.js uygulamasını test eden ve deploy etmeden önce bir API anahtarına ihtiyaç duyan aşağıdaki gibi bir `.github/workflows/ci.yml` dosyanız var:

name: Node.js CI

on:
  push:
    branches: [ main ]

jobs:
  test:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        node-version: [18.x, 20.x]
    steps:
      - uses: actions/checkout@v3
      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v3
        with:
          node-version: ${{ matrix.node-version }}
      - run: npm ci
      - run: npm test
        env:
          DATABASE_URL: ${{ secrets.DATABASE_URL }}

Bu workflow’u yerelde çalıştırmak istediğinizde doğrudan `act` komutunu vermeniz yetmez; çünkü `secrets.DATABASE_URL` boş kalacaktır ve matrix yapısı yüzünden süreç uzayacaktır. İşte tam bu noktada profesyonel parametreler devreye giriyor.

Öncelikle bir `.secrets` dosyası oluşturun:

DATABASE_URL=mongodb://localhost:27017/test_db

Şimdi sadece Node 20 versiyonunu ve sadece `test` job’ını tetiklemek, üstelik bunu yaparken de yerel secret dosyamızı beslemek için şu komutu koşturuyoruz:

act -j test --matrix node-version:20.x --secret-file .secrets

In-depth Tip: Runner Boyutu Sorunsalı

`act` ilk çalıştığında size hangi imaj boyutunu kullanmak istediğinizi sorar (Micro, Medium, Large). Varsayılan “Micro” imaj genelde hızlı iner ancak içinde `curl`, `docker`, `aws-cli` gibi temel araçları barındırmaz. Gerçekçi bir act github actions deneyimi için en azından “Medium” imajı seçmeli veya `.actrc` dosyanıza şu custom imaj eşlemesini eklemelisiniz:

-P ubuntu-latest=catthehacker/ubuntu:act-latest

GitLab CI Pipeline’larını Yerelde Simüle Etmek

GitLab tarafında işler biraz daha karmaşıktır. Resmi `gitlab-runner exec` komutu uzun süredir “deprecated” durumdadır ve `needs`, `parent-child pipelines` veya modern `artifacts` tanımlamalarını tam olarak desteklemez. SRE topluluğu bu boşluğu doldurmak için harika bir açık kaynaklı alternatif geliştirdi: gitlab-ci-local.

gitlab-ci-local Kurulumu

NodeJS tabanlı bu CLI aracını sisteminize kurmak için NPM veya Homebrew kullanabilirsiniz:

brew install firecow/gitlab-ci-local/gitlab-ci-local

Uygulama: Kompleks Bir .gitlab-ci.yml Testi

Şöyle bir pipeline yapımız olduğunu düşünelim. Uygulamayı derliyor, artifact üretiyor ve bir sonraki stage’de bu artifact’i kullanıyor:

stages:
  - build
  - test

compile-code:
  stage: build
  image: node:20-alpine
  script:
    - npm ci
    - npm run build
  artifacts:
    paths:
      - dist/

run-unit-tests:
  stage: test
  image: node:20-alpine
  needs: ["compile-code"]
  script:
    - ls dist/
    - npm run test:unit

Bu pipeline’ı `gitlab-runner local` mantığıyla kendi makinenizde çalıştırmak için terminalden şu komutu vermeniz yeterlidir:

gitlab-ci-local

`gitlab-ci-local`, projenizin kök dizinindeki `.gitlab-ci.yml` dosyasını analiz eder, adımları sırasıyla çalıştırır, `needs` direktifine sadık kalır ve en önemlisi üretilen `dist/` klasörünü lokalinizdeki `.gitlab-ci-local/artifacts/` klasörüne otomatik olarak map eder. Böylece build artifact’lerinin bir sonraki job’a düzgün aktarılıp aktarılmadığını gözlerinizle görebilirsiniz.

Yerel GitLab Variable’larını Yönetmek

Gerçek CI ortamında GitLab UI üzerinden tanımladığınız “masked/protected” değişkenleri yerelde taklit etmek için `.gitlab-ci-local-variables.yml` adında bir dosya oluşturabilirsiniz:

STAGING_KUBE_TOKEN: "kube-token-12345"
DB_PASSWORD: "super-secret-password"

Bu dosya `.gitignore` listenizde olmalıdır. Araç, bu değişkenleri otomatik olarak okuyacak ve container’ların içerisine enjekte edecektir.

Docker-in-Docker (DinD) ve Soket Paylaşımı Çıkmazı

Yerel pipeline testlerinde en çok baş ağrıtan konulardan biri, pipeline adımının kendisinin de Docker ayağa kaldırmaya çalışmasıdır (örneğin, entegrasyon testleri için geçici bir DB container’ı başlatmak veya imajı `docker build` ile derlemek).

Eğer `act` kullanıyorsanız ve job’ınız içinde Docker komutları koşturacaksanız, lokalinizdeki Docker soketini container içine mount etmeniz gerekir:

act --bind-workdir -v /var/run/docker.sock:/var/run/docker.sock

Benzer şekilde, `gitlab-ci-local` kullanırken `services: – docker:dind` tanımınız varsa, aracın konfigürasyonunda yerel soketin paylaşıldığından emin olun. Bu sayede iç içe (nested) container yapısı yerine, tüm container’ların sizin host Docker daemon’ınız üzerinde “sibling” (kardeş) container’lar olarak ayağa kalkmasını sağlarsınız. Bu, hem disk alanından tasarruf sağlar hem de performansı katlar.

Özet ve Best Practice’ler

Süreci bir standarta oturtmak adına ekibinize şu kuralları aşılamanızı öneririz:

  1. Pre-commit Hook Entegrasyonu: Kritik CI script değişikliklerinde, geliştiricilerin lokalde en azından bir `act` veya `gitlab-ci-local` kuru testi yapmasını zorunlu tutun.
  2. Maksimum İmaj Önbellekleme (Caching): Lokal testlerin hızlı olması için Docker imajlarını yerelde optimize edin. Sık kullanılan base imajları (`node`, `python`, `golang` alpine versiyonları) önceden `docker pull` ile çekin.
  3. Lokal .env/.secrets Dosyalarını Asla Push Etmeyin: Güvenlik en katı kuraldır. `.gitignore` dosyanızda yerel pipeline testlerinde kullandığınız tüm taklit secret dosyalarının tanımlı olduğundan emin olun.

Geliştirme hızınızı (velocity) artırmak ve CI bütçelerini optimize etmek tamamen feedback loop süresini kısaltmaktan geçiyor. Araçlarınızı doğru yapılandırın, lokal gücü kullanın ve o commit çöplüğünü tarihe gömün.

Category: Genel | LEAVE A COMMENT
Mayıs 27 2026

Baharatların Dansı: Evde Restoran Usulü Hint Usulü Butter Chicken

Dışarıda yediğiniz o yumuşacık, sosu ekmek banmalık Hint yemekleri gözünüzü korkutmasın. Bugün mutfakta kendinizi bir şef gibi hissettirecek, sırrı marinasyonda saklı nefis bir butter chicken tarifi ile karşınızdayız. Giriş seviyesinde bir yemek meraklısı olsanız bile, doğru adımlarla evde Hint mutfağı rüzgarları estirmek sandığınızdan çok daha kolay ve kesinlikle sipariş vermekten daha keyifli. Hadi, baharatların o büyüleyici dünyasına adım atalım ve mutfağı mis gibi kokutalım!

Porsiyon: 4 Kişilik
Hazırlık Süresi: 20 dakika (Marinasyon için ekstra minimum 30 dakika)
Pişirme Süresi: 25 dakika

Neden Butter Chicken? (Murgh Makhani)

Butter chicken, ya da orijinal adıyla Murgh Makhani, Hint mutfağının dünyaya sunduğu en büyük hediyelerden biri. Neden mi bu kadar seviliyor? Çünkü acı ile kremsi dokunun, asit ile yağın mükemmel dengesini sunuyor. Tavuklar yoğurtla marine edildiği için lokum gibi yumuşuyor, sosundaki tereyağı ve krema ise baharatların o keskin köşelerini yumuşatarak damakta adeta bir şölen yaratıyor. Bu dengeli lezzet profili, onu Hint yemekleri dünyasına giriş yapmak isteyenler için en ideal tarif haline getiriyor.

Gerekli Malzemeler

Malzeme listesi gözünüzü korkutmasın; çoğu zaten dolabınızda olan, bulamadıklarınızı da kolayca ikame edebileceğiniz şeyler. Örneğin kaju alerjiniz varsa kullanmayabilir, tavuk but yerine tavuk göğsü de tercih edebilirsiniz.

Marinasyon İçin:

  • Tavuk: 700 gram kemiksiz tavuk but (göğüs eti de olur ama but eti çok daha sulu ve lezzetli kalacaktır)
  • Yoğurt: 4 yemek kaşığı süzme yoğurt (tavuğu yumuşatan sihirli asit kaynağımız)
  • Sarımsak ve Zencefil: 1’er yemek kaşığı rendelenmiş (Hint yemeklerinin olmazsa olmaz ikilisi)
  • Limon suyu: 1 yemek kaşığı
  • Baharatlar: 1 tatlı kaşığı toz kırmızı biber, 1 çay kaşığı zerdeçal, 1 tatlı kaşığı garam masala, 1 çay kaşığı tuz

Sos İçin (Gravy):

  • Tereyağı: 2 yemek kaşığı (veya tereyağının Hint versiyonu olan ghee)
  • Sıvı yağ: 1 yemek kaşığı (tereyağının yanmasını önlemek için)
  • Soğan: 1 adet büyük boy (piyazlık doğranmış)
  • Domates: 4 adet rendelenmiş (veya pratiklik açısından 1 kutu domates püresi)
  • Kaju: 10-12 adet çiğ kaju (sosu koyulaştırır ve orijinal bir kremsilik katar, yoksa yerine krema miktarını artırabilirsiniz)
  • Krema: Yarım su bardağı sıvı krema (heavy cream)
  • Baharatlar: 1 tatlı kaşığı toz kırmızı biber, 1 tatlı kaşığı garam masala, 1 çay kaşığı kimyon, 1 tatlı kaşığı şeker (asiditeyi dengelemek için)

Adım Adım Butter Chicken Yapılışı

Adımları sırayla takip ettiğinizde her şeyin ne kadar pratik ilerlediğini göreceksiniz. İşte evde Hint mutfağı deneyiminin aşamaları:

  1. Tavukları Marine Edin: Doğranmış tavukları yoğurt, sarımsak, zencefil, limon suyu ve baharatlarla iyice harmanlayın. Buzdolabında en az 30 dakika (vaktiniz varsa 2 saat) dinlenmeye bırakın.
  2. Tavukları Mühürleyin: Geniş bir tavada 1 yemek kaşığı tereyağı ve sıvı yağı kızdırın. Tavukları yüksek ateşte, dışı hafifçe karamelize olana kadar (yaklaşık 5-7 dakika) pişirin ve kenara alın. (İçinin tam pişmesine gerek yok, sosta pişecek).
  3. Sos Tabanını Hazırlayın: Aynı tavaya biraz daha yağ ekleyin. Soğanları yumuşayana kadar soteleyin. Ardından sarımsak, zencefil ve kalan baharatları ekleyip kokusu çıkana kadar 1-2 dakika kavurun.
  4. Domates ve Kajuyu Ekleyin: Domates püresini ve kajuları tavaya ilave edin. Kısık ateşte domatesler suyunu çekip koyulaşana kadar yaklaşık 10 dakika pişmeye bırakın.
  5. Pürüzsüzleştirin (En Önemli Adım!): Hazırladığınız bu sos karışımını ocaktan alın. El blenderı yardımıyla tamamen pürüzsüz, kadife gibi bir kıvama gelene kadar çekin. (Gerekirse sosu açmak için yarım çay bardağı sıcak su ekleyebilirsiniz).
  6. Buluşma Zamanı: Pürüzsüz sosu tekrar tavaya alın. Üzerine mühürlediğiniz tavukları ekleyin. Kısık ateşte tavuklar tamamen yumuşayana kadar 8-10 dakika pişirin.
  7. Son Dokunuş: Ocağın altını kapatın. Sıvı kremayı ve kalan tereyağını ekleyip karıştırın. İşte o muhteşem turuncu renk ve ipeksi doku hazır!

İşin Sırrı: Butter Chicken Püf Noktaları

Püf noktası: Butter chicken’ın o restoranlardaki derin ve hafif tütsü aromalı tadını yakalamak istiyorsanız, tavukları tavada pişirirken hafifçe “yakmaktan” korkmayın. Tavukların üzerindeki o kahverengi-siyahımsı karamelize noktalar (char), sosa otantik bir lezzet katacaktır. Ayrıca sosu blenderdan geçirdikten sonra ince bir süzgeçten süzerseniz, tam anlamıyla ipeksi (velvety) bir kıvama ulaşırsınız.

Yanına yapacağınız tane tane dökülen bir basmati pirinç pilavı veya sıcacık bir naan (Hint ekmeği) ile bu akşam kendinizi Yeni Delhi’de hissedeceksiniz. Şimdiden ellerinize sağlık ve afiyet olsun!

Category: Genel | LEAVE A COMMENT
Mayıs 26 2026

Bernina Express ve Ötesi: İsviçre Alpleri’ni Trenle Keşfetme Rehberi

İsviçre denince akla hemen cep yakan fiyatlar, steril sokaklar ve lüks saatler gelir. Ancak Alplerin kucağında, pencereden süzülen kar manzaraları eşliğinde yapacağınız bir isvicre tren turu, hayatınızda bir kez yaşamanız gereken o benzersiz, masalsı deneyimlerden biridir. Bu maceranın tam kalbinde ise kırmızı vagonlarıyla dağları aşan, UNESCO Dünya Mirası listesindeki ünlü bernina express yer alıyor. Peki, bu rüya rotayı cebimizi tamamen boşaltmadan, turistik klişelere teslim olmadan bir lokal gibi nasıl deneyimleriz? Gelin, tren seyahati tutkunlarının kutsal kasesi olan bu yola birlikte çıkalım ve Alplerin gerçek yüzünü keşfedelim.

Landwasser’den Poschiavo’ya: Bir Trenden Fazlası

Chur istasyonundan hareket ettiğinizde, modern dünyanın gürültüsü ve hızı yavaşça geride kalır. Tren, yaklaşık dört saatlik bir yolculukla kuzeydeki heybetli buzullardan güneydeki İtalya sınırına, Tirano’nun palmiye ağaçlarına doğru süzülür. Bu rotanın en ikonik anı, şüphesiz 65 metre yükseklikteki Landwasser Viaduct üzerinden geçiş anıdır. Lokomotif karanlık tünele girmeden hemen önce, tren penceresinden dışarıya süzülen o kırmızı kavis, size neden otoyolları değil de demir ağları seçtiğinizi fısıldar. Bu anı yaşarken acele etmeyin, sadece akışa ve mühendisliğin doğayla uyumuna odaklanın.

Yolculuk ilerledikçe vadi daralır, dağlar üzerinize doğru geliyormuş gibi hissettirir. Ospizio Bernina istasyonuna vardığınızda, tren yolculuğunun en yüksek noktasına, tam 2253 metreye ulaşırsınız. Burası adeta başka bir gezegendir. Lago Bianco (Beyaz Göl) kışın tamamen buzla kaplıyken, bahar aylarında adını aldığı o sütlü beyaz tonuyla parıldar. Tren buradan sonra dik bir inişe geçer. Sadece bir saat içinde, karların içinden sıyrılıp palmiye ağaçlarının ve İtalyan mimarisinin hakim olduğu Tirano’ya inersiniz. İklimin ve kültürün bu kadar kısa sürede bu denli radikal bir şekilde değişmesi, insanda adeta bir zaman makinesinde seyahat ediyormuş hissi uyandırır.

Bütçe Dostu Devrim: Bölgesel Tren Sırrı

Gelelim kertenkerem.net usulü en önemli bütçe tüyomuza. Bernina Express olarak adlandırılan o meşhur kırmızı, panoramik pencereli trenler harikadır, ancak koltuk rezervasyon ücreti adı altında ekstra bir bedel ödemeniz gerekir. Bu bedel sezonuna göre 20 ile 26 CHF arasında değişir. Üstelik bu vagonların pencereleri açılmaz, bu da fotoğraf çekerken camdaki yansımalarla boğuşacağınız anlamına gelir. Seyahati daha samimi kılmak ve bütçeyi korumak için aynı rayları kullanan sarı logolu RhB bölgesel trenlerini tercih edin.

Bölgesel trenlerde rezervasyon ücreti ödemezsiniz, kalabalıktan uzak kalırsınız ve en önemlisi, pencereleri aşağı kaydırıp Alplerin o buz gibi, taze havasını içinize çekerek temiz fotoğraflar çekebilirsiniz. Aynı manzarayı, aynı raylar üzerinde yarı fiyatına ve çok daha özgürce izlemek işte bu kadar basittir.

**Kertenkerem Tüyosu:** Bölgesel trenlerde seyahat ederken trenin en arkasındaki vagona geçmeye çalışın. Virajları dönerken trenin gövdesini ve Alplerin manzarasını aynı kadraja almak, bölgesel trenlerin açılan pencereleri sayesinde çok daha kolaydır. Üstelik bu trenler saat başı çalışır, yani dilediğiniz istasyonda inip bir sonrakine binebilirsiniz.

Klişelerden Uzak İsviçre Gezilecek Yerler

Çoğu turist St. Moritz’de inip pahalı kafelerde vakit geçirmeyi tercih eder. Ancak gerçek bir gezgin için isvicre gezilecek yerler listenin en değerli incileri, trenin durduğu o küçük ve sessiz istasyonlarda saklıdır. Örneğin Alp Grüm istasyonu bunlardan biridir. Deniz seviyesinden 2091 metre yükseklikte yer alan bu istasyona sadece trenle ya da zorlu bir yürüyüş rotasıyla ulaşabilirsiniz. İstasyonun hemen yanındaki taş binada yer alan restoranda sıcak bir çorba içip Palü Buzulu’nu izlemek, lüks bir kayak merkezinde harcayacağınız zamandan çok daha değerlidir.

Yolculuğun devamında karşınıza çıkan, İtalyanca konuşulan Poschiavo kasabası ise taş evleri ve dar sokaklarıyla size İsviçre’de olduğunuzu unutturacak bir sakinlik sunar. Burada büyük turist otobüsleri göremezsiniz; sadece yerel halkın sakin yaşamına tanıklık eder, meydandaki küçük fırından taze bir hamur işi alıp nehir kenarında yiyebilirsiniz. İşte gerçek İsviçre deneyimi tam olarak burada başlar.

Pratik Bilgiler ve Rezervasyon Tüyoları

Bu rüya gibi tren seyahati için planlama yaparken biletinizi son dakikaya bırakmamalısınız. İsviçre’de ulaşım pahalıdır ancak sistemi çözerseniz bütçenizi koruyabilirsiniz. Chur ile Tirano arasında tek yön bilet fiyatı normal şartlarda yaklaşık 63 CHF civarındadır. Ancak İsviçre Federal Demiryolları mobil uygulamasını indirip bir-iki ay öncesinden “Saver Day Pass” kovalarsanız, tüm gün geçerli sınırsız ulaşım biletini 52 CHF gibi çok daha uygun bir fiyata yakalayabilirsiniz. Eğer ülkede birkaç gün geçirecekseniz ve farklı şehirlere de seyahat edecekseniz, Swiss Travel Pass almak en mantıklı çözümdür; çünkü bu kart bölgesel trenleri tamamen ücretsiz hale getirir.

**Zamanlama Tüyosu:** En güzel manzaralar için trenin gidiş yönüne göre sağ tarafına oturmaya özen gösterin. Alp Grüm ve Lago Bianco manzaraları sağ tarafta çok daha büyüleyicidir. Seyahatinizi mayıs veya ekim aylarında planlarsanız, hem karlı zirveleri hem de yeşeren vadileri aynı anda görebilirsiniz.

Yolculuğa Hazırlık: Yanınıza Ne Almalı?

Alplerde hava durumu hızla değişebilir. Vadide sıcaklık 20 dereceyken, zirveye çıktığınızda kendinizi sıfır derecede bulabilirsiniz. Bu yüzden yanınıza mutlaka katman katman giyebileceğiniz kıyafetler alın. Ayrıca tren istasyonlarındaki marketler pahalı olduğundan, yolculuk öncesinde büyük süpermarketlerden sandviç, yerel İsviçre çikolatası ve suyunuzu alıp sırt çantanıza atmak bütçenizi büyük ölçüde rahatlatacaktır. Kendi pikniğinizi dağların zirvesinde yapmak, en lüks restorandan daha keyiflidir.

Sonuçta İsviçre Alpleri’ni trenle keşfetmek sadece bir noktadan diğerine gitmek değil, yolun kendisini bir yaşam biçimi haline getirmektir. Pencereden dışarı bakarken zamanın nasıl yavaşladığını hissedecek, hız çağında yavaşlamanın lüksünü tadacaksınız. Valizinizi hazırlayın, biletinizi erkenden alın ve Alplerin kalbine doğru giden o demir yollarının sesine kulak verin.

Category: Genel | LEAVE A COMMENT
Mayıs 22 2026

HAProxy ile Yüksek Erişilebilirlik: Keepalived ve Health Check

Modern mikroservis mimarilerinde veya yüksek trafikli web uygulamalarında kesintisiz hizmet sunmak artık bir lüks değil, zorunluluk. Tam da bu noktada, haproxy ve keepalived ikilisi, linux sunucularınız üzerinde kurabileceğiniz, kurumsal sınıfta, maliyetsiz ve son derece güvenilir bir aktif-pasif ha (high availability) loadbalancer çözümü olarak imdadımıza yetişiyor. Peki ama bu iki canavarı prod ortamında birbirine küstürmeden, arkadaki servislerin sağlık durumlarına (health check) ve gelen isteğin içeriğine (ACL) göre nasıl kusursuzca dans ettireceğiz? Bu yazıda lafı hiç dolandırmadan, doğrudan production ortamında hırpalanmış senaryolardan süzülen pratik bir mimariyi ayağa kaldıracağız.

Neden Sadece HAProxy Yetmiyor? (SPOF Nedir?)

HAProxy, performansına ve stabilitesine şapka çıkardığımız harika bir load balancer. Ancak ne kadar güçlü olursa olsun, tek bir sunucu üzerinde çalıştığı sürece sisteminizde bir SPOF (Single Point of Failure) yani tek hata noktası oluşturur. HAProxy’nin üzerinde çalıştığı Linux sunucunun donanımı çökerse, network kartı yanarsa ya da kernel panik yaparsa tüm sisteminiz karanlığa gömülür.

İşte bu riski bertaraf etmek için Keepalived devreye giriyor. Keepalived, VRRP (Virtual Router Redundancy Protocol) protokolünü kullanarak iki farklı load balancer sunucusunun tek bir Sanal IP (Virtual IP – VIP) arkasında çalışmasını sağlar. Aktif olan sunucu çöktüğünde, pasif durumdaki yedek sunucu VIP’yi milisaniyeler içinde üzerine alır. Kullanıcılar bu failover sürecini ruhları bile duymadan atlatırlar.

Altyapı Hazırlığı ve Olmazsa Olmaz Kernel Parametresi

Kuruluma başlamadan önce topolojimizi netleştirelim. Elimizde iki adet Linux (Ubuntu/Debian tabanlı kabul ediyoruz) sunucu olduğunu varsayalım:

  • LB01 (Master): 192.168.1.10
  • LB02 (Backup): 192.168.1.11
  • Sanal IP (VIP): 192.168.1.100

Şimdi kıdemli bir sistemcinin asla atlamayacağı o kritik kernel ayarına gelelim: net.ipv4.ip_nonlocal_bind. Varsayılan olarak Linux, sunucu üzerinde fiziksel olarak tanımlanmamış bir IP adresine servislerin bind olmasını (yani o IP’yi dinlemesini) engeller. VIP, pasif sunucuda o an aktif olmadığı için backup sunucudaki HAProxy servisi başlatılamaz ve çöker. Bunun önüne geçmek için her iki sunucuda da şu komutu koşturuyoruz:

echo "net.ipv4.ip_nonlocal_bind=1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

Bu sihirli dokunuş sayesinde HAProxy, sunucuda henüz tanımlanmamış olan 192.168.1.100 IP’sini hiç çekinmeden dinlemeye başlayacaktır.

Keepalived ile Aktif-Pasif VIP Kurulumu

Her iki sunucuya da keepalived paketini kuralım:

sudo apt update && sudo apt install keepalived -y

Şimdi konfigürasyon zamanı. En kritik nokta, master sunucu çöktüğünde VIP’nin pasif sunucuya geçmesi, ancak master geri geldiğinde (eğer istemiyorsak) gereksiz yere VIP’yi geri alıp ufak da olsa bir kesinti yaratmamasıdır. Buna “non-preemptive” yapılandırma denir. Ancak biz bu örnekte klasik aktif-pasif öncelik yapısını kuracağız.

Master (LB01) Konfigürasyonu

/etc/keepalived/keepalived.conf dosyasını oluşturun ve aşağıdaki gibi düzenleyin:

vrrp_script check_haproxy {
    script "killall -0 haproxy" # HAProxy çalışıyor mu kontrol et
    interval 2                  # Her 2 saniyede bir çalıştır
    weight 2                    # Başarılıysa önceliğe (priority) 2 ekle
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0              # Network arayüzünüzün adı (ip a ile kontrol edin)
    virtual_router_id 51        # İki sunucuda da AYNI olmalı
    priority 101                # Master daha yüksek önceliğe sahip
    advert_int 1

    authentication {
        auth_type PASS
        auth_pass GizliSifre123  # İki sunucuda da aynı olmalı
    }

    virtual_ipaddress {
        192.168.1.100/24         # Paylaşılan Sanal IP (VIP)
    }

    track_script {
        check_haproxy
    }
}

Backup (LB02) Konfigürasyonu

Backup sunucumuzda ise dosya neredeyse aynıdır, sadece state ve priority değerleri değişir:

vrrp_script check_haproxy {
    script "killall -0 haproxy"
    interval 2
    weight 2
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 100                # Master'dan daha düşük
    advert_int 1

    authentication {
        auth_type PASS
        auth_pass GizliSifre123
    }

    virtual_ipaddress {
        192.168.1.100/24
    }

    track_script {
        check_haproxy
    }
}

Konfigürasyonları kaydettikten sonra her iki sunucuda da servisi başlatalım:

sudo systemctl enable --now keepalived

Eğer her şey yolunda gittiyse, LB01 üzerinde ip a show eth0 komutunu verdiğinizde secondary IP olarak 192.168.1.100 adresini görmelisiniz. LB02’de ise bu IP görünmemelidir.

HAProxy Kurulumu ve Sağlık Kontrolü (Health Check) Sanatı

Sıra geldi yük dengeleme katmanımıza. HAProxy’yi kuralım:

sudo apt install haproxy -y

Bir load balancer’ı akıllı kılan şey, arkasındaki uygulama sunucularının (backend) gerçekten yaşayıp yaşamadığını bilmesidir. Sadece TCP portunun açık olması (Layer 4) uygulamanın sağlıklı çalıştığı anlamına gelmez. Uygulama veritabanına bağlanamadığı için HTTP 500 hatası veriyor olabilir ama TCP portu hala ayaktadır. Bu yüzden her zaman HTTP tabanlı (Layer 7) health check tercih etmelisiniz.

Gelin, hem gelişmiş health check mekanizmasını hem de VIP binding konseptini barındıran örnek bir /etc/haproxy/haproxy.cfg dosyası hazırlayalım:

global
    log /dev/log local0
    log /dev/log local1 notice
    chroot /var/lib/haproxy
    user haproxy
    group haproxy
    daemon

defaults
    log     global
    mode    http
    option  httplog
    option  dontlognull
    timeout connect 5000ms
    timeout client  50000ms
    timeout server  50000ms

frontend http_front
    bind 192.168.1.100:80 # Sadece VIP üzerinden gelen istekleri dinle
    mode http
    default_backend app_backend

backend app_backend
    mode http
    balance roundrobin
    
    # Layer 7 Health Check Yapılandırması
    option httpchk GET /healthz HTTP/1.1\r\nHost:\ myapp.local
    http-check expect status 200
    
    # Backend Sunucuları
    server app01 192.168.1.20:8080 check inter 3000 rise 2 fall 3
    server app02 192.168.1.21:8080 check inter 3000 rise 2 fall 3

Burada Neler Döndü? (Detaylı “Neden” Analizi)

  • bind 192.168.1.100:80: HAProxy’ye sadece VIP adresini dinlemesini söyledik. Bu, trafiğin kontrolsüz şekilde doğrudan nodeların kendi IP’leri üzerinden akmasını engeller.
  • option httpchk GET /healthz: HAProxy, backend sunucularına her 3 saniyede bir (inter 3000) HTTP GET isteği gönderir.
  • http-check expect status 200: Gelen yanıtın HTTP 200 OK olması durumunda sunucu “sağlıklı” kabul edilir.
  • rise 2 fall 3: Bir sunucu ardışık 3 kez başarısız health check yanıtı verirse (fall), trafik ona gönderilmez (out of rotation). Ne zaman ki ardışık 2 başarılı yanıt verir (rise), o zaman tekrar gruba dahil edilir.

Gelişmiş ACL (Access Control List) Tabanlı Routing

Prod ortamlarında genellikle tek bir domain arkasında birden fazla mikroservis barındırırız. Örneğin /api ile başlayan isteklerin API servislerine, statik dosyaların ise başka bir backende gitmesini isteriz. HAProxy’nin ACL mekanizması bu konuda tam bir canavardır.

Aşağıdaki konfigürasyon örneğinde, path ve domain bazlı yönlendirmeyi nasıl yapacağımızı görelim:

frontend http_front_advanced
    bind 192.168.1.100:80
    mode http

    # ACL Tanımları
    acl is_api path_beg -i /api
    acl is_static path_end -i .jpg .png .css .js
    acl host_admin hdr_beg(host) -i admin.

    # Yönlendirme Kuralları (Routing Rules)
    use_backend api_backend if is_api
    use_backend static_backend if is_static
    use_backend admin_backend if host_admin
    
    # Varsayılan Backend
    default_backend web_backend

backend web_backend
    server web01 192.168.1.30:80 check

backend api_backend
    server api01 192.168.1.40:8080 check

backend static_backend
    server storage01 192.168.1.50:80 check

backend admin_backend
    server admin01 192.168.1.60:80 check

Bu yapıyla birlikte, tek bir load balancer IP’si üzerinden gelen istekleri, url path’ine veya HTTP host header’ına göre ayıklayıp tamamen farklı sunucu gruplarına sıfır performans kaybıyla dağıtabiliyoruz.

Failover Testi: Fişi Çektiğimizde Ne Oluyor?

Kurulumumuzu tamamladık ve servislerimizi başlattık (sudo systemctl enable --now haproxy). Peki sistemimiz gerçekten yüksek erişilebilir mi? Bunu test etmenin en vahşi (ve keyifli) yolu canlı ortamda simülasyon yapmaktır.

Öncelikle master sunucumuzda (LB01) IP adresini izleyelim:

ip addr show eth0

Burada 192.168.1.100 IP’sini görmeliyiz. Şimdi master sunucu üzerinde HAProxy servisini durdurarak Keepalived’ın bu durumu fark etmesini sağlayalım:

sudo systemctl stop haproxy

Hemen ardından pasif sunucuya (LB02) geçip logları izleyelim:

tail -f /var/log/syslog | grep Keepalived

Loglarda şuna benzer bir satır görmelisiniz:

Keepalived_vrrp[1234]: VRRP_Instance(VI_1) Entering MASTER STATE

Ve ip addr show eth0 çalıştırdığınızda, VIP’nin saniyeden daha kısa bir sürede LB02’ye göç ettiğini göreceksiniz. Kullanıcılarınız, veritabanına veri yazmaya ve web sitenizde gezinmeye kesintisiz olarak devam edecektir. İşte gerçek HA kalitesi!

Sonuç ve Pro-Tip

HAProxy ve Keepalived ikilisi, karmaşık cloud mimarilerine veya pahalı donanımsal load balancer cihazlarına ihtiyaç duymadan, Linux’un gücüyle scale olabilen harika bir çözümdür.

Son bir prod tavsiyesi: Keepalived loglarını mutlaka merkezi bir izleme aracına (Elasticsearch, Loki vb.) yönlendirin ve VIP geçişlerinde (state transitions) ekibinize Slack veya Teams üzerinden alert atacak bir script tetikleyin (bunun için Keepalived’ın notify_master ve notify_backup direktiflerini araştırabilirsiniz). VIP’nin sessiz sedasız sürekli yer değiştirmesi, altyapınızda sinsi bir network dalgalanması olduğunun habercisi olabilir.

Category: Genel | LEAVE A COMMENT