Modern Yazılım Altyapısı: Konteyner Mimarisi, Docker ve Kubernetes Teknolojilerine Giriş ve Derinlemesine Teknik Rehber
Yazılım geliştirme dünyasında, kod yazan mühendisler (Developer) ile o kodun çalışacağı sunucuları yöneten sistem yöneticileri (SysAdmin/Ops) arasında yıllardır süregelen, çözümsüz gibi görünen ve projelere maliyet olarak yansıyan efsanevi bir sorun vardır. Geliştirici, yazdığı kodu teslim ederken büyük bir özgüvenle “Benim bilgisayarımda sorunsuz çalışıyordu” der. Ancak o kod, test ortamına veya canlı sunucuya (Production) atıldığında hata verir, çöker, veritabanına bağlanamaz veya hiç çalışmaz. Sorun nerede? Sorun genellikle kodda değil; kodun çalıştığı “ortamdadır”. Geliştiricinin bilgisayarındaki kütüphane versiyonu (Örn: Python 3.8) ile sunucudaki versiyon (Python 3.6) farklıdır. İşletim sistemi yamaları, ağ ayarları veya konfigürasyon dosyaları farklıdır. İşte bu “Ortam Uyuşmazlığı” (Environment Matrix Hell), projelerin haftalarca gecikmesine, bütçelerin aşılmasına ve ekipler arası gerilime neden olur.
Ancak son 10 yılda, bu kaosu sona erdiren, yazılımın taşınabilirliğini ve yönetilebilirliğini kökten değiştiren, bilişim tarihinin en büyük devrimlerinden biri gerçekleşti: Konteynerizasyon (Containerization). Tıpkı lojistik sektöründe, içine ne koyarsanız koyun (araba, gıda, tekstil) her gemiye, her tıra ve her vince uyan standart “Çelik Konteynerlerin” icadı gibi; yazılım dünyasında da uygulamanın her ortamda (Laptop, Sunucu, Bulut) aynı şekilde çalışmasını sağlayan “Yazılım Konteynerleri” icat edildi. Bu devrimin bayrak taşıyıcıları ve endüstri standardı haline gelen isimleri ise şüphesiz docker ve kubernetes teknolojileri oldu.
Everest Teknoloji olarak, Tuzla, Gebze, Kocaeli ve İstanbul genelindeki kurumsal müşterilerimize sunduğumuz “Dijital Dönüşüm, Cloud Native Dönüşüm ve DevOps” danışmanlığında şunu net bir şekilde görüyoruz: Geleneksel “Monolitik” (Tek parça) uygulamalar ve hantal Sanal Makineler (VM), günümüzün hızına, ölçeğine ve müşteri beklentilerine yetişemiyor. Müşterilerimiz, Black Friday gibi yoğun dönemlerde saniyeler içinde büyüyen (Scale-Up), bir parçasında hata olduğunda tüm sistemi çökertmeden kendi kendini iyileştiren (Self-Healing) ve güncellemelerin kullanıcılara hissettirilmeden (Zero Downtime) yapıldığı sistemler istiyor. Bu talepleri karşılamanın tek yolu, altyapıyı docker ve kubernetes teknolojileri üzerine inşa etmektir.
Bu kapsamlı ve teknik rehberde, Sanal Makinelerden Konteynerlere geçişin nedenlerini, Docker’ın katmanlı dosya yapısını, Kubernetes’in (K8s) bu konteynerleri nasıl bir orkestra şefi gibi yönettiğini, ağ ve depolama katmanlarını ve docker ve kubernetes teknolojileri ile işletmenizin yazılım altyapısını nasıl geleceğe taşıyacağınızı en ince detayına kadar inceleyeceğiz. Hazırsanız, yazılımın modern ve çevik çağına adım atıyoruz.

Tarihsel Dönüşüm: Sanallaştırmadan Konteynerizasyona
Docker’ı ve modern altyapıyı anlamak için önce neyin yerini aldığını ve neden bu değişime ihtiyaç duyulduğunu anlamak gerekir.
1. Bare Metal Dönemi (Fiziksel Sunucular)
Eskiden her uygulama için bir fiziksel sunucu alınırdı. Bir sunucuya veritabanı, diğerine web sunucusu kurulurdu. Ancak sunucuların kaynakları (CPU, RAM) verimli kullanılamazdı. %10 kapasiteyle çalışan devasa sunucular, elektrik ve soğutma israfıydı.
2. Sanallaştırma Dönemi (Virtual Machines – VM)
Sonra VMware ve Hyper-V gibi teknolojilerle “Sanallaştırma” geldi. Bir fiziksel sunucuyu (Host) hipervizör katmanıyla böldük ve içine birden fazla Sanal Makine (VM) kurduk. Kaynak kullanımı arttı ama VM’lerin ciddi bir sorunu vardı: Her VM, kendi içinde tam bir İşletim Sistemi (Guest OS) barındırır.
10 tane mikroservis uygulamanız varsa, 10 tane ayrı Windows veya Linux işletim sistemi kurmanız gerekir.
Her işletim sistemi lisans maliyeti, disk alanı (GB’larca) ve RAM (Her biri için en az 2-4 GB) tüketir.
Bir VM’in açılması (Boot) dakikalar sürer.
3. Konteyner Dönemi (Containerization)
Konteynerler ise “İşletim Sistemini” sanallaştırmaz; “İşletim Sistemi Çekirdeğini” (Kernel) paylaşır.
Ana makinenin (Host OS) çekirdeğini kullanır.
İçinde sadece uygulamanın çalışması için gereken kütüphaneler (Libs/Bins) ve kodun kendisi vardır.
Boyutları MB seviyesindedir (VM’ler GB seviyesindedir).
Saniyeler içinde, hatta milisaniyeler içinde açılır.
İşte docker ve kubernetes teknolojileri, bu hafif, hızlı ve taşınabilir yapının üzerine kuruludur ve VM’lerin hantallığını ortadan kaldırır.
Docker: Yazılımın Standart Paketi ve Çalışma Mantığı
Docker, 2013 yılında Solomon Hykes tarafından piyasaya sürüldüğünde, aslında var olan bir Linux teknolojisini (LXC – Linux Containers, cgroups, namespaces) herkesin kullanabileceği kadar basitleştirdi ve standartlaştırdı. Docker’ın temel felsefesi şudur: “Bir kere yaz, her yerde çalıştır.” (Build once, run anywhere).
Docker Mimarisi ve Bileşenleri
Docker ve kubernetes teknolojileri ekosisteminde Docker, genellikle “Runtime” (Çalıştırma Ortamı) ve “Paketleme” aracı olarak görev yapar.
Dockerfile (Reçete): Bu bir talimat dosyasıdır. Geliştirici, uygulamasının nasıl çalışacağını buraya yazar.
FROM python:3.9-alpine(Bana Python yüklü çok hafif bir Linux ver)COPY . /app(Kodlarımı içine kopyala)RUN pip install -r requirements.txt(Gerekli kütüphaneleri kur)CMD ["python", "app.py"](Uygulamayı başlat)
Docker Image (İmaj – Kalıp): Dockerfile’ın derlenmiş (Build edilmiş) halidir. Docker imajları “Katmanlı Dosya Sistemi” (Layered File System) kullanır. Her komut yeni bir katman oluşturur. Bu yapı, disk alanından tasarruf sağlar ve güncellemeleri hızlandırır. İmajlar salt okunurdur (Read-only).
Docker Container (Konteyner): İmajın “çalışan” ve “yazılabilir” halidir. Bir imajdan (Örn: Nginx imajı) saniyeler içinde binlerce konteyner başlatabilirsiniz. Her konteyner birbirinden izoledir.
Docker Registry (Depo): İmajların saklandığı yerdir. (Örn: Docker Hub, Google Container Registry veya şirketinizin özel Private Registry’si).
Everest Teknoloji olarak, yazılım ekiplerinize Docker eğitimi vererek, geliştirme ortamı ile canlı ortam arasındaki farkları sıfıra indiriyoruz. Docker ve kubernetes teknolojileri sayesinde, “lokalde çalışıyordu” bahanesi tarihe karışıyor.
Neden Sadece Docker Yetmez? (Orkestrasyon İhtiyacı)
Docker harika bir teknolojidir. Bir konteyneri başlatmak için terminale docker run yazarsınız ve çalışır. Peki ya prodüksiyon ortamında 10 farklı mikroservisiniz ve toplamda 500 konteyneriniz varsa? Büyük bir e-ticaret sitesi veya bankacılık uygulaması yönettiğinizi düşünün.
Kampanya döneminde (Black Friday) trafiğiniz 10 kat arttı. 500 konteyner daha açmanız gerekiyor (Scaling). Bunu manuel mi yapacaksınız?
Gece 03:00’te ödeme sistemini taşıyan konteynerlerden biri bellek hatası verip çöktü. Kim uyanıp yeniden başlatacak? (Health Check & Self-Healing).
Yeni versiyon çıkacaksınız, sistem kesilmeden (Downtime olmadan) 1000 konteyneri nasıl güncelleyeceksiniz? (Rolling Update).
Konteynerler hangi sunucuda çalışacak? Hangi sunucuda boş RAM var? (Scheduling).
İşte burada “Konteyner Orkestrasyonu” devreye girer. Docker tek başına bir müzisyendir; kemanı harika çalar. Ancak 100 müzisyeni (konteyneri) uyum içinde yönetmek, senkronize etmek ve hataları düzeltmek için bir “Orkestra Şefi”ne ihtiyacınız vardır. O şefin adı Kubernetes’tir. Docker ve kubernetes teknolojileri bu noktada birbirini tamamlar; Docker paketi oluşturur, Kubernetes o paketi yönetir.
Kubernetes (K8s): Modern Altyapının İşletim Sistemi
Kubernetes (K8s), Yunanca “Dümenci” veya “Pilot” anlamına gelir. Google’ın kendi iç sistemlerinde (Borg) milyarlarca konteyneri yönetmek için geliştirdiği teknolojinin, 2014 yılında açık kaynak kodlu olarak dünyaya sunulmuş ve Cloud Native Computing Foundation (CNCF) tarafından sahiplenilmiş halidir. Bugün bulut bilişimin standart işletim sistemi kabul edilir.
Kubernetes, docker ve kubernetes teknolojileri ikilisinin “Yönetim ve Otomasyon” bacağını oluşturur. Temel görevleri şunlardır:
Service Discovery & Load Balancing: Trafiği konteynerler arasında otomatik dağıtır. Bir konteyner ölürse trafiği ona göndermeyi keser.
Storage Orchestration: Disk alanlarını (Local, Cloud, NAS, SAN) otomatik olarak konteynerlere bağlar (Mount eder).
Automated Rollouts/Rollbacks: Yeni güncellemeyi parça parça yayar. Hata olursa (Örn: Web sitesi açılmıyor) otomatik olarak eski versiyona geri döner.
Self-Healing (Kendi Kendini İyileştirme): Çöken konteyneri yeniden başlatır, yanıt vermeyeni öldürür ve yerine yenisini koyar.
Bin Packing (Kaynak Yönetimi): Konteynerleri sunucuların CPU ve RAM durumuna göre en verimli şekilde yerleştirir.
Kubernetes Mimarisi: Kaputun Altında Ne Var?
Kubernetes karmaşık ama çok güçlü bir mimariye sahiptir. Everest Teknoloji olarak kurduğumuz Kubernetes kümelerinde (Cluster) şu bileşenler bulunur:
1. Master Node (Control Plane) – Beyin
Kümenin yönetim merkezidir. Kararları burası verir, işçileri burası yönetir.
API Server: Kümenin giriş kapısıdır. Tüm komutlar (kubectl), kullanıcılar ve otomasyon araçları buraya istek atar. REST protokolünü kullanır.
Etcd: Kümenin hafızasıdır. Tüm konfigürasyon verilerinin, konteyner durumlarının tutulduğu, çok hızlı ve tutarlı bir anahtar-değer (Key-Value) veritabanıdır.
Scheduler (Zamanlayıcı): Yeni oluşturulan bir konteynerin (Pod) hangi sunucuda (Node) çalışacağına karar verir. Sunucuların doluluk oranına, donanım özelliklerine bakar. (Örn: “Bu uygulama GPU istiyor, GPU’lu sunucuya gönder”).
Controller Manager: Sistemin “İstenen Durum”da (Desired State) olup olmadığını kontrol eder. (Örn: “Sen 5 tane web sunucusu olsun istedin, şu an 4 tane var, 1 tane daha aç”).
2. Worker Nodes (İşçiler) – Kas Gücü
Uygulamaların fiilen çalıştığı fiziksel veya sanal sunuculardır.
Kubelet: Master’dan gelen emirleri uygular. “Çalış” derse çalışır, “Dur” derse durur. Node’un ajanıdır.
Kube-Proxy: Ağ kurallarını yönetir. Dışarıdan gelen trafiğin doğru konteynere gitmesini sağlar.
Container Runtime (CRI): Konteynerleri çalıştıran motordur (Genellikle Docker, containerd veya CRI-O). Docker ve kubernetes teknolojileri entegrasyonu burada gerçekleşir.
Kubernetes Objeleri ve Kavramları
Kubernetes’i anlamak için onun dilini konuşmak gerekir.
Pod (Kapsül): Kubernetes’in yönettiği en küçük birimdir. Kubernetes doğrudan konteynerleri yönetmez, onları “Pod” adı verilen kapsüllerin içine koyar. Bir Pod’un içinde genelde 1, bazen yardımcı (Sidecar – Log toplayıcı vb.) konteynerlerle birlikte 2-3 konteyner olabilir. Podlar ölümlüdür; ölürlerse yenisi doğar, IP adresi değişir.
Deployment: Podların nasıl çalışacağını, kaç kopya (Replica) olacağını ve nasıl güncelleneceğini tanımlayan, Podları yöneten üst katmandır.
Service: Podlar ölüp dirildikçe IP adresleri değişir. “Service” objesi, bu değişken Pod grubuna sabit bir IP ve DNS adı verir. Trafiği Podlara dağıtır (Load Balancer).
Ingress: Küme dışından (İnternetten) gelen HTTP/HTTPS trafiğini içeriye, ilgili servislere yönlendiren akıllı yönlendiricidir. (Örn:
api.sirket.com-> API Servisine,www.sirket.com-> Web Servisine).ConfigMap & Secret: Uygulama ayarlarını (Veritabanı IP’si, Şifreler) kodun içinden çıkarıp Kubernetes’te saklamayı sağlar. Docker ve kubernetes teknolojileri ile uygulama ve konfigürasyon ayrıştırılır.

Mikroservis Mimarisi ve Konteynerler
Geleneksel yazılımlar “Monolitik”tir. Yani veritabanı bağlantısı, kullanıcı arayüzü, ödeme sistemi, stok yönetimi hepsi tek bir devasa kod bloğundadır (Spagetti Kod). Bir yerde (Örn: Stok modülü) hata olursa tüm sistem çöker. Docker ve kubernetes teknolojileri, “Mikroservis” mimarisinin temel taşıdır. Mikroservis yapısında uygulama küçük, bağımsız parçalara bölünür:
Ödeme Servisi (Ayrı bir konteyner grubu)
Ürün Kataloğu (Ayrı bir konteyner grubu)
Kullanıcı Yönetimi (Ayrı bir konteyner grubu)
Bu sayede:
Ödeme servisinde hata olursa, kullanıcılar ürünleri gezmeye devam edebilir. Tüm sistem çökmez.
Kampanya zamanı sadece “Sipariş Servisi”ne yük binerse, sadece o servisi çoğaltırsınız (Auto-Scaling), tüm sistemi değil. Kaynak tasarrufu sağlar.
Farklı servisler farklı dillerle (Python, Java, Go) yazılabilir.
Everest Teknoloji, monolitik uygulamalarınızı mikroservislere dönüştürme (Refactoring) ve docker ve kubernetes teknolojilerine taşıma sürecinde mimari danışmanlık verir.
CI/CD Süreçlerinde Docker ve Kubernetes
Modern yazılım geliştirme süreci “DevOps” kültürü üzerine kuruludur. Sürekli Entegrasyon (CI) ve Sürekli Dağıtım (CD) hatları (Pipeline), docker ve kubernetes teknolojileri olmadan düşünülemez.
Tipik bir Everest Teknoloji CI/CD akışı şöyledir:
Geliştirici kodu yazar ve Git deposuna gönderir (Push).
Jenkins, GitLab CI veya Azure DevOps devreye girer, kodu çeker.
Otomatik testleri (Unit Test) çalıştırır.
Koddan bir Docker Image üretir (Build).
Bu imajı güvenlik taramasından geçirir ve güvenli depoya (Registry) yükler.
Kubernetes’e “Yeni imaj geldi, Pod’ları güncelle” emrini verir (Deploy).
Kubernetes, eski Podları teker teker kapatıp yenilerini açar (Rolling Update). Kullanıcı kesinti hissetmez.
Tüm bu süreç el değmeden, dakikalar içinde gerçekleşir. Docker ve kubernetes teknolojileri, yazılım teslimat hızını (Time to Market) artırır.
YAML Dosyaları: Altyapı Kod Olarak (Infrastructure as Code)
Kubernetes’te hiçbir şeyi fare ile tıklayarak yapmazsınız. Her şey “YAML” uzantılı metin dosyalarında tanımlıdır. Bu yaklaşıma “Infrastructure as Code” (IaC) denir. Bir deployment.yaml dosyasına şunları yazarsınız:
“Bana ‘nginx’ uygulamasından 3 kopya (Replica) ver.”
“Her birine en fazla 512 MB RAM limiti koy.”
“Bu uygulamayı 80 portundan dışarı aç.”
Bu dosyayı Kubernetes’e verdiğinizde (kubectl apply -f deployment.yaml), o durumu yaratır. Bu sayede altyapınızın yedeğini almak, sadece bu metin dosyalarını Git üzerinde saklamaktır. Sunucu bozulursa, dosyaları yeni sunucuda çalıştırırsınız ve her şey geri gelir. Docker ve kubernetes teknolojileri, altyapıyı “programlanabilir” hale getirir.
Güvenlik (DevSecOps): Konteynerler Güvenli mi?
Konteynerler, VM’lere göre çekirdeği paylaştığı için izolasyon seviyesi daha düşüktür. Bir saldırgan konteynerden kaçıp (Container Breakout) ana sunucuya erişebilir. Bu yüzden docker ve kubernetes teknolojileri kullanılırken güvenlik “sonradan eklenen” değil, “baştan tasarlanan” bir süreç olmalıdır (DevSecOps).
Everest Teknoloji olarak güvenlik standartlarımız:
Image Scanning: Docker imajlarını güvenlik açıklarına karşı (Vulnerability Scan – Trivy, Clair) sürekli tararız.
Least Privilege: Konteynerleri asla “Root” (Yönetici) yetkisiyle çalıştırmayız.
Network Policies: Kubernetes içinde hangi Pod’un hangi Pod ile konuşabileceğini kısıtlarız. (Örn: Web sunucusu Veritabanına erişsin ama İK servisine erişemesin).
Secrets Management: Şifreleri, API anahtarlarını kodun içine gömmeyiz, Kubernetes Secrets veya HashiCorp Vault içinde şifreli saklarız.
RBAC (Role Based Access Control): Hangi geliştiricinin hangi kaynağa erişebileceğini sınırlarız.
Ağ (Networking) ve Depolama (Storage) Zorlukları
Kubernetes’in en karmaşık kısımları Ağ (CNI) ve Depolama (CSI) katmanlarıdır.
CNI (Container Network Interface): Podların birbiriyle konuşmasını sağlayan ağ eklentisidir (Calico, Flannel, Cilium). Doğru CNI seçimi, performans ve güvenlik için kritiktir.
Persistent Storage (Kalıcı Veri): Konteynerler “Stateless” (Durumsuz) yapıdadır. Yani bir konteyner silindiğinde içindeki veriler de silinir. Ancak veritabanları (MySQL, PostgreSQL) veriyi saklamak zorundadır. Docker ve kubernetes teknolojileri ile veri yönetimi için “Persistent Volume” (PV) ve “Persistent Volume Claim” (PVC) yapıları kullanılır. Everest Teknoloji, verilerinizi konteynerin geçici diskinde değil; dışarıdaki güvenli ve yedekli depolama ünitelerinde (SAN, NAS, Cloud Storage – AWS EBS, Azure Disk) tutacak şekilde yapılandırır. Böylece konteyner çökse, silinse veya başka sunucuya taşınsa bile veriniz kaybolmaz ve peşinden gelir.
Neden Everest Teknoloji?
Docker ve kubernetes teknolojileri son derece güçlüdür ama öğrenme eğrisi (Learning Curve) çok diktir. Yanlış yapılandırılmış, güvenlik ayarları yapılmamış bir Kubernetes kümesi, yönetilmesi imkansız, kaynakları tüketen ve güvenlik açıklarıyla dolu bir canavara dönüşebilir.
Everest Teknoloji olarak biz, bu karmaşık teknolojiyi sizin için basitleştiriyoruz:
Analiz ve Mimari: Uygulamanızın konteynerizasyona uygunluğunu analiz ediyor, monolitikten mikroservise geçiş planını çiziyoruz.
Kurulum ve Yönetim: İster kendi sunucularınızda (On-Premise – Rancher, OpenShift), ister bulutta (AWS EKS, Azure AKS, Google GKE) yönetilen Kubernetes kurulumunu yapıyoruz.
Migrasyon: Mevcut .NET, Java, PHP uygulamalarınızı Dockerize ediyoruz.
Eğitim: Yazılım ve sistem ekiplerinize uygulamalı docker ve kubernetes teknolojileri eğitimi veriyoruz.
7/24 Bakım: Kümelerinizi izliyor (Prometheus, Grafana), güncellemelerini yapıyor ve sorunlara müdahale ediyoruz.
Gelecek: Serverless ve Edge Computing
Docker ve kubernetes teknolojileri, sadece bugünün değil, geleceğin de standardıdır. Artık sunucunun bile olmadığı “Serverless Container” (Sunucusuz Konteyner – AWS Fargate, Google Cloud Run) yapıları ve verinin kaynağında işlendiği “Edge Computing” (Uç Bilişim), konteynerler üzerinde çalışmaktadır. 5G teknolojisi ve Nesnelerin İnterneti (IoT) ile birlikte, fabrikalardaki makinelerin içinde veya akıllı şehir sensörlerinde minik Kubernetes kümeleri (K3s, MicroK8s) çalışacaktır.
Dönüşümü Başlatın
Yazılım dünyasında “Hız” artık bir lüks değil, hayatta kalma koşuludur. Rakipleriniz yeni bir özelliği günde 10 kez canlıya alırken, siz ayda bir güncelleme yapmakla uğraşıyor ve her güncellemede “Acaba sistem çökecek mi?” korkusu yaşıyorsanız geride kalırsınız. Docker ve kubernetes teknolojileri, size Google, Netflix, Uber veya Amazon gibi teknoloji devlerinin kullandığı altyapı gücünü, esnekliğini ve hızını verir.
Hantal sanal makinelerden, “benim makinemde çalışıyordu” bahanelerinden, manuel işlemlerden ve gece yarısı sunucu göçmelerinden kurtulun. Everest Teknoloji‘nin uzmanlığıyla tanışın, yazılımınızı özgürleştirin. Konteyner mimarisine ve docker ve kubernetes teknolojilerine geçiş yol haritanızı belirlemek, dijital dönüşümünüzü hızlandırmak için bugün bizimle iletişime geçin. Altyapınız yük olmasın, gücünüz olsun.

