Webinar Serisi: Kubernetes ile Başlangıç
Günümüzün hızla değişen teknoloji dünyasında, uygulamaların hızlı bir şekilde geliştirilmesi, dağıtılması ve ölçeklendirilmesi, işletmelerin rekabet gücünü koruması için hayati önem taşımaktadır. Monolitik mimarilerden mikroservislere geçiş ve konteyner teknolojilerinin yükselişiyle birlikte, bu karmaşık ortamları verimli bir şekilde yönetmek için yeni araçlara ve yaklaşımlara ihtiyaç duyulmuştur. İşte tam bu noktada, konteyner orkestrasyon platformlarının lideri olan Kubernetes devreye girer. Google tarafından geliştirilen ve Cloud Native Computing Foundation (CNCF) bünyesinde açık kaynaklı bir proje olarak evrilen Kubernetes, modern bulut yerel (cloud-native) uygulamaların omurgasını oluşturmaktadır.
Bu makale, “Webinar Serisi: Kubernetes ile Başlangıç” kapsamında ele alınan konuları derinlemesine inceleyerek, Kubernetes’in temel prensiplerini, mimarisini, temel bileşenlerini ve kullanım alanlarını kapsamlı bir şekilde açıklamayı hedeflemektedir. İster bir geliştirici, ister bir DevOps mühendisi, isterse de bulut teknolojilerine ilgi duyan bir BT uzmanı olun, bu yazı Kubernetes’in dünyasına sağlam bir giriş yapmanız için gerekli temel bilgileri sunacaktır. Konteyner orkestrasyonunun neden bu kadar kritik hale geldiğini anlayacak, Kubernetes’in temel yapı taşlarını tanıyacak ve kendi uygulamalarınızı Kubernetes üzerinde çalıştırmak için ilk adımları nasıl atacağınızı öğreneceksiniz.
Modern Uygulama Geliştirme ve Dağıtım Ortamları
Geleneksel olarak, uygulamalar genellikle tek bir büyük kod tabanına sahip monolitik yapılar olarak geliştirilirdi. Bu yapılar, başlangıçta basit görünse de, zamanla karmaşıklaşır, ölçeklendirmesi zorlaşır ve yeni özelliklerin eklenmesi veya hataların giderilmesi uzun süreçler gerektirirdi. Bu durum, özellikle büyük ve hızla büyüyen uygulamalar için ciddi darboğazlar oluşturmaktaydı.
Monolitik Yapıdan Mikroservislere Geçiş
Monolitik mimarinin dezavantajlarını aşmak amacıyla, uygulamalar daha küçük, bağımsız ve birbirleriyle ağ üzerinden iletişim kuran servis parçalarına ayrılmaya başlandı. Bu yaklaşım, mikroservis mimarisi olarak adlandırılır. Mikroservisler, farklı ekipler tarafından bağımsız olarak geliştirilebilir, dağıtılabilir ve ölçeklendirilebilir. Bu da geliştirme hızını artırır, hata izolasyonunu sağlar ve farklı teknolojilerin bir arada kullanılmasına olanak tanır.
Konteynerizasyonun Yükselişi: Docker
Mikroservislerin her birini izole edilmiş ortamlarda çalıştırmak ve dağıtım süreçlerini standartlaştırmak için konteyner teknolojisi vazgeçilmez hale geldi. Docker, konteynerizasyonun en popüler aracıdır. Docker konteynerleri, bir uygulamanın çalışması için gerekli tüm kodları, çalışma zamanını, sistem araçlarını, kütüphanelerini ve ayarları içeren hafif, taşınabilir ve kendi kendine yeten paketlerdir. Bu, “benim makinemde çalışıyor” sorununu ortadan kaldırarak, geliştirme, test ve üretim ortamları arasında tutarlılık sağlar.
Konteyner Orkestrasyonuna Neden İhtiyaç Duyuldu?
Tek bir konteyneri yönetmek kolaydır, ancak yüzlerce, hatta binlerce konteynerin olduğu karmaşık bir mikroservis uygulamasını yönetmek manuel olarak neredeyse imkansızdır. Konteynerlerin yaşam döngüsünü (başlatma, durdurma, yeniden başlatma), ölçeklendirmeyi, ağ yapılandırmasını, depolama yönetimini, yük dengelemeyi ve hata durumunda otomatik iyileşmeyi otomatikleştirmek için bir araca ihtiyaç duyulmuştur. İşte bu noktada konteyner orkestrasyon platformları devreye girer ve Kubernetes bu alandaki tartışmasız liderdir.
Kubernetes Nedir?
Kubernetes (Yunanca’da dümenci veya pilot anlamına gelen “κυβερνήτης” kelimesinden türemiştir ve genellikle K8s olarak kısaltılır), dağıtılmış konteynerli uygulamaları otomatik olarak dağıtmak, ölçeklendirmek ve yönetmek için kullanılan açık kaynaklı bir platformdur. Google’ın dahili olarak kullandığı Borg sistemi temel alınarak geliştirilmiş ve 2014 yılında açık kaynak olarak duyurulmuştur. Kubernetes, uygulamaların yüksek kullanılabilirlik, ölçeklenebilirlik ve esneklik ile çalışmasını sağlamak için tasarlanmıştır.
Temel amacı, uygulama dağıtımını ve yönetimini basitleştirmektir. Geliştiricilerin ve operasyon ekiplerinin altyapı karmaşıklığı yerine, uygulamaların kendisine odaklanmasını sağlar. Kubernetes, konteynerlerinizi belirli bir duruma (örneğin, uygulamanızın 3 kopyası her zaman çalışır durumda olmalı) getirmek ve bu durumu korumak için deklaratif bir yaklaşım kullanır. Eğer bir konteyner çökerse, Kubernetes onu otomatik olarak yeniden başlatır; eğer trafik artarsa, daha fazla konteyner örneği oluşturarak yükü dengeleyebilir.
Kubernetes’in Temel Bileşenleri
Bir Kubernetes kümesi, uygulamaları çalıştıran bir dizi makineden (düğüm) oluşur. Bu düğümler iki ana kategoriye ayrılır: Kontrol Düzlemi (Control Plane) ve İşçi Düğümleri (Worker Nodes). Her birinin belirli görevleri ve bileşenleri vardır.
Kontrol Düzlemi (Control Plane)
Kontrol düzlemi, Kubernetes kümesinin beyni gibidir. Kümenin genel durumunu yönetir, işçi düğümlerini ve üzerlerindeki iş yüklerini koordine eder. Genellikle yüksek kullanılabilirlik için birden fazla sunucuda çalışır.
kube-apiserver
Kubernetes API sunucusu, kontrol düzleminin ön yüzüdür ve küme ile etkileşim kurmak için tek erişim noktasıdır. Tüm dahili ve harici iletişimler bu API sunucusu üzerinden geçer. Kullanıcılar ve diğer bileşenler, kubectl komut satırı aracı veya REST API aracılığıyla kümeyle konuşur.
etcd
etcd, Kubernetes kümesinin tüm konfigürasyon verilerini, durum bilgilerini ve meta verilerini depolayan dağıtılmış, tutarlı ve yüksek oranda erişilebilir bir anahtar-değer deposudur. Kümenin “tek doğruluk kaynağı”dır.
kube-scheduler
Zamanlayıcı, yeni oluşturulan Pod’ları (Kubernetes’teki en küçük dağıtılabilir birim) izler ve onları çalıştırmak için uygun işçi düğümlerini seçer. Kaynak gereksinimleri, politikalar, etiketler ve düğüm kısıtlamaları gibi faktörleri dikkate alarak en iyi düğümü belirler.
kube-controller-manager
Kontrolör yöneticisi, çeşitli kontrolörleri çalıştıran bir bileşendir. Bu kontrolörler, kümenin mevcut durumunu etcd’den okur ve istenen durumu elde etmek için değişiklikler yapar. Örneğin, bir ReplicaSet kontrolörü, belirtilen sayıda Pod kopyasının her zaman çalışır durumda olmasını sağlar. Bir düğüm çökerse, bu kontrolörler düşen Pod’ları diğer düğümlere taşır.
cloud-controller-manager (İsteğe Bağlı)
Bu bileşen, Kubernetes’i belirli bir bulut sağlayıcısının API’leriyle entegre eder. Örneğin, bir bulut denetleyici yöneticisi, LoadBalancer servisleri için bulut sağlayıcısının yük dengeleyicilerini provizyon edebilir veya bulut sağlayıcısının depolama birimlerini yönetebilir.
İşçi Düğümleri (Worker Nodes)
İşçi düğümleri, uygulamaların (Pod’ların) gerçekte çalıştığı makinelerdir. Her işçi düğümü, konteynerleri çalıştırmak ve kontrol düzlemiyle iletişim kurmak için gerekli bileşenleri içerir.
kubelet
Her işçi düğümünde çalışan bir ajandır. Kontrol düzleminden gelen talimatları alır ve Pod’ların düğümde çalışmasını sağlar. Konteynerleri başlatır, durdurur ve Pod’ların durumunu API sunucusuna rapor eder.
kube-proxy
Her düğümde çalışan bir ağ proxy’sidir. Kubernetes servisleri için ağ kurallarını yönetir ve Pod’lara dışarıdan ve içeriden erişimi sağlar. Yük dengeleme işlevini yerine getirir.
Container Runtime
Konteyner çalışma zamanı, konteynerleri gerçekten çalıştıran yazılımdır. Docker en popüler seçenek olsa da, containerd veya CRI-O gibi diğer çalışma zamanları da kullanılabilir. Kubernetes, Container Runtime Interface (CRI) aracılığıyla çeşitli çalışma zamanlarıyla entegre olabilir.
Kubernetes Temel Kavramları
Kubernetes ile çalışmaya başlamadan önce anlamanız gereken birkaç temel soyutlama ve kavram bulunmaktadır. Bu kavramlar, uygulamalarınızı nasıl tanımlayacağınızı, dağıtacağınızı ve yöneteceğinizi belirler.
Pod
Pod, Kubernetes’teki en küçük ve dağıtılabilir birimdir. Bir veya daha fazla konteyneri barındırır. Bir Pod içerisindeki konteynerler aynı ağ adresi ve depolama kaynaklarını paylaşır. Genellikle, bir Pod tek bir uygulama örneğini veya yakından ilişkili birkaç yardımcı servisi çalıştırır. Pod’lar geçicidir; ölürlerse veya yeniden başlatılırlarsa, yeni bir Pod oluşturulur.
Deployment
Deployment, deklaratif bir şekilde Pod’ları ve ReplicaSet’leri yönetmenin bir yoludur. Bir Deployment ile, uygulamanızın kaç kopyasının çalışmasını istediğinizi (ReplicaSet aracılığıyla) ve hangi konteyner imajını kullanacağınızı belirtirsiniz. Deployment’lar, uygulamanızın yeni sürümlerini yayınlamak (rolling updates) ve gerektiğinde önceki sürümlere geri dönmek (rollbacks) gibi işlemleri kolaylaştırır.
Service
Service, bir grup Pod’a kararlı bir ağ erişimi sağlar. Pod’lar geçici olduğu ve IP adresleri değişebileceği için, Service, Pod’ların önünde bir soyutlama katmanı oluşturur. Bu sayede, diğer Pod’lar veya dış istemciler, Pod’ların IP adreslerini bilmek zorunda kalmadan Service üzerinden uygulamaya erişebilir. Service’ler, yük dengeleme işlevini de yerine getirir.
Namespace
Namespace’ler, bir Kubernetes kümesindeki kaynakları (Pod’lar, Deployment’lar, Service’ler vb.) sanal olarak izole etmek için kullanılır. Büyük ekiplerin veya birden fazla projenin aynı kümeyi güvenli ve düzenli bir şekilde paylaşmasını sağlar. Varsayılan olarak default, kube-system ve kube-public gibi Namespace’ler bulunur.
Volume
Pod’lar geçici olduğundan, Pod’ların silinmesi durumunda verilerin kalıcı olması için Volume’lara ihtiyaç duyulur. Volume’lar, bir Pod’un yaşam döngüsünden bağımsız olarak verileri depolamak için kullanılır. Çeşitli Volume türleri bulunur: boş bir dizin (emptyDir), ana bilgisayarın dosya sistemi (hostPath), bulut sağlayıcısına özgü depolama (AWS EBS, Google Persistent Disk) ve ağ depolama (NFS, CephFS) gibi.
ConfigMap ve Secret
Uygulama konfigürasyonlarını koddan ayırmak ve Pod’lara enjekte etmek için ConfigMap’ler kullanılır. Hassas veriler (veritabanı şifreleri, API anahtarları vb.) için ise Secret’lar kullanılır. Secret’lar, ConfigMap’lerden farklı olarak verileri base64 ile kodlanmış olarak saklar ve daha güvenli bir şekilde yönetilir.
Ingress
Ingress, küme dışından küme içindeki Service’lere HTTP ve HTTPS trafiğini yönlendirmek için bir API nesnesidir. Bir Ingress Controller (örneğin Nginx Ingress Controller) ile birlikte çalışarak, sanal ana bilgisayar tabanlı yönlendirme, URL tabanlı yönlendirme ve SSL sonlandırma gibi gelişmiş yönlendirme kuralları tanımlamanıza olanak tanır.
ReplicaSet
ReplicaSet, belirli bir Pod şablonuna göre belirli sayıda Pod kopyasının her zaman çalışır durumda olmasını sağlayan bir kontrolördür. Genellikle doğrudan kullanılmaz; Deployment’lar ReplicaSet’leri yönetir.
Kubernetes ile Çalışmaya Başlamak
Kubernetes’in teorik yapısını anladıktan sonra, pratik uygulamalarla bu bilgileri pekiştirmek önemlidir. Başlangıç için kullanabileceğiniz birkaç araç ve temel kubectl komutları bulunmaktadır.
Geliştirme Ortamları
Minikube
Minikube, yerel makinenizde tek düğümlü bir Kubernetes kümesi çalıştırmanıza olanak tanıyan bir araçtır. Geliştirme ve test amaçlı kullanım için idealdir. Sanal bir makine veya Docker konteyneri içinde çalışabilir.
Docker Desktop (Kubernetes Entegrasyonu)
Docker Desktop, Windows ve macOS üzerinde Docker ve isteğe bağlı olarak yerleşik bir Kubernetes kümesi çalıştırmanıza olanak tanır. Geliştiriciler için kurulumu ve kullanımı oldukça kolaydır.
K3s
K3s, Rancher Labs tarafından geliştirilen hafif bir Kubernetes dağıtımıdır. Kaynak kısıtlı ortamlar (IoT cihazları, edge computing) veya geliştirme ortamları için mükemmeldir. Kurulumu son derece basittir.
Temel CLI Komutları (kubectl)
kubectl, Kubernetes kümesiyle etkileşim kurmak için kullanılan komut satırı aracıdır. Kümedeki kaynakları oluşturmak, güncellemek, silmek ve durumlarını kontrol etmek için kullanılır.
kubectl get pods: Kümedeki tüm Pod’ları listeler.kubectl get deployments: Kümedeki tüm Deployment’ları listeler.kubectl get services: Kümedeki tüm Service’leri listeler.kubectl describe pod: Belirli bir Pod hakkında detaylı bilgi gösterir (olaylar, durum, konteyner bilgileri).kubectl apply -f: Bir YAML manifest dosyasında tanımlanan kaynakları oluşturur veya günceller.kubectl delete -f: Bir YAML manifest dosyasında tanımlanan kaynakları siler.kubectl logs: Bir Pod’daki konteynerin günlüklerini gösterir.kubectl exec -it: Bir Pod’daki konteynerin içine bir shell oturumu açar.-- bash
YAML Manifest Dosyaları
Kubernetes kaynakları, genellikle YAML (YAML Ain’t Markup Language) veya JSON formatında tanımlanan manifest dosyaları aracılığıyla deklaratif olarak oluşturulur. İşte basit bir Pod, Deployment ve Service örneği:
Basit Bir Pod Tanımı Örneği:
apiVersion: v1
kind: Pod
metadata:
name: benim-nginx-podum
spec:
containers:
- name: nginx-container
image: nginx:latest
ports:
- containerPort: 80
Basit Bir Deployment Tanımı Örneği:
apiVersion: apps/v1
kind: Deployment
metadata:
name: benim-nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx-container
image: nginx:latest
ports:
- containerPort: 80
Basit Bir Service Tanımı Örneği:
apiVersion: v1
kind: Service
metadata:
name: benim-nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: LoadBalancer # Bulut ortamında harici bir IP sağlar
Kubernetes’in Avantajları
Kubernetes, modern uygulama geliştirme ve dağıtım süreçlerine birçok önemli avantaj sunar:
- Otomatik Ölçeklendirme: Yük arttığında veya azaldığında Pod’ları otomatik olarak ölçeklendirebilir (Horizontal Pod Autoscaler) veya düğümleri ekleyip çıkarabilir (Cluster Autoscaler).
- Kendi Kendini İyileştirme (Self-healing): Başarısız konteynerleri yeniden başlatır, düğümler çöktüğünde Pod’ları başka düğümlere taşır, sağlık kontrolü başarısız olan konteynerleri öldürür.
- Yük Dengeleme: Gelen trafiği Pod’lar arasında otomatik olarak dağıtır, uygulamanın yüksek kullanılabilirliğini sağlar.
- Kolay Dağıtımlar ve Geri Dönüşler: Rolling updates stratejisiyle uygulamaların yeni sürümlerini kesintisiz bir şekilde dağıtır ve bir sorun durumunda kolayca önceki sürüme geri dönülmesini sağlar.
- Kaynak Verimliliği: Kaynakları (CPU, bellek) daha verimli kullanarak altyapı maliyetlerini optimize eder.
- Bulut Sağlayıcı Bağımsızlığı: Hem şirket içi (on-premise) veri merkezlerinde hem de tüm büyük bulut sağlayıcılarında (AWS, Azure, GCP) çalışabilir, bu da satıcı kilitlenmesini (vendor lock-in) azaltır.
- Deklaratif Yönetim: Uygulamanın istenen durumunu tanımlarsınız ve Kubernetes bu durumu korumak için gerekli adımları atar.
Kubernetes’in Zorlukları ve Dikkat Edilmesi Gerekenler
Kubernetes’in sunduğu avantajlar yadsınamaz olsa da, beraberinde bazı zorlukları da getirir:
- Öğrenme Eğrisi: Kubernetes’in mimarisi ve kavramları oldukça geniştir ve yeni başlayanlar için dik bir öğrenme eğrisi sunar.
- Karmaşıklık: Küçük projeler için aşırı karmaşık olabilir. Kubernetes’in kendisi de yönetilmesi gereken bir dağıtılmış sistemdir.
- Kaynak Tüketimi (Overhead): Kontrol düzlemi ve diğer temel bileşenler, bir miktar sunucu kaynağı tüketir. Küçük kümeler için bu “overhead” önemli olabilir.
- Güvenlik: Kubernetes kümesinin ve üzerindeki uygulamaların doğru bir şekilde güvenliğinin sağlanması karmaşık bir konudur ve dikkatli bir yapılandırma gerektirir (RBAC, ağ politikaları, Secret yönetimi).
- Depolama Yönetimi: Kalıcı depolama yönetimi, Kubernetes’in zorlu alanlarından biridir. Farklı depolama çözümlerini entegre etmek ve yönetmek bilgi gerektirir.
- Ağ Yapılandırması: Kubernetes’in ağ modeli güçlüdür ancak anlaşılması ve doğru yapılandırılması zaman alabilir. CNI (Container Network Interface) eklentileri bu alanda önemli rol oynar.
İleri Konulara Giriş
Kubernetes ile temel seviyede rahat hissetmeye başladığınızda, yeteneklerini daha da genişletmek için keşfedebileceğiniz birçok ileri konu bulunmaktadır:
- Helm: Kubernetes uygulamaları için bir paket yöneticisidir. Karmaşık uygulamaları tek bir “chart” olarak tanımlamanıza, dağıtmanıza ve yönetmenize olanak tanır.
- CI/CD Entegrasyonu: Jenkins, GitLab CI/CD, Argo CD gibi araçlarla Kubernetes’i entegre ederek otomatik dağıtım boru hatları oluşturmak.
- Monitoring ve Logging: Prometheus ve Grafana ile küme ve uygulama metriklerini izlemek, ELK Stack (Elasticsearch, Logstash, Kibana) veya diğer log yönetim araçlarıyla logları toplamak ve analiz etmek.
- Service Mesh: Istio, Linkerd gibi servis ağları, mikroservisler arası iletişimi yönetmek, gözlemlenebilirlik, trafik yönetimi ve güvenlik özelliklerini geliştirmek için kullanılır.
- Operatörler: Kubernetes’in genişletilebilirliğini kullanarak, belirli bir uygulamanın (örneğin bir veritabanı) karmaşık operasyonel mantığını otomatikleştirmenizi sağlayan özel kontrolörlerdir.
Sonuç
Kubernetes, modern bulut yerel uygulama geliştirme ve dağıtımının temel taşı haline gelmiştir. Konteynerli iş yüklerini yönetme yeteneği, otomatik ölçeklendirme, kendi kendini iyileştirme ve bulut sağlayıcı bağımsızlığı gibi özellikleri sayesinde, işletmelerin çevikliklerini artırmalarına ve yenilikçi çözümleri pazara daha hızlı sunmalarına olanak tanır. Her ne kadar başlangıçta bir öğrenme eğrisi sunsa da, Kubernetes’e yapılan yatırımın uzun vadede sağladığı faydalar bu çabaya değerdir.
“Webinar Serisi: Kubernetes ile Başlangıç” bu güçlü platformun kapılarını aralamak, temel kavramlarını anlamak ve pratik uygulamalarla ilk adımları atmak için mükemmel bir fırsat sunmaktadır. Bu makalede ele alınan konular, serinin temelini oluşturarak, katılımcılara Kubernetes dünyasında güvenle ilerlemeleri için sağlam bir temel sağlamıştır. Unutmayın, Kubernetes sürekli gelişen bir ekosistemdir ve en güncel kalmak için sürekli öğrenmeye ve pratik yapmaya devam etmek esastır. Geleceğin bulut altyapısını şekillendiren bu teknolojiye hakim olmak, her BT profesyonelinin kariyerinde önemli bir avantaj sağlayacaktır.