Yazılım geliştirme dünyasında çalışıyorsanız, Kubernetes'i mutlaka duymuşsunuzdur. Peki tam olarak nedir ve konteynerleştirilmiş uygulamaları yönetmek için neden fiili standart haline geldi? Bu rehber sizi temellerden temel kavramlara, pratik örnekler ve diyagramlarla götürecektir.
Kubernetes'ten Önce: Biraz Tarih
Kubernetes'in neden bu kadar devrimci olduğunu anlamak için bir adım geriye gidelim.
- Geleneksel Dağıtım: Başlangıçta uygulamalar fiziksel sunucularda çalıştırılıyordu. Bu yaklaşım pahalı, ölçeklenmesi zor ve kaynak çatışmalarına açıktı.
- Sanallaştırılmış Dağıtım: Sonra Sanal Makineler (VM'ler) geldi. VM'ler aynı donanımda birden fazla izole uygulamanın çalışmasını sağlayarak kaynak kullanımını ve güvenliği iyileştirdi. Ancak her VM tam bir işletim sistemi çalıştırır ve bu çok fazla kaynak tüketir.
- Konteynerleştirilmiş Dağıtım: Konteynerler (Docker gibi) bir sonraki evrimdir. Aynı ana bilgisayar işletim sistemini paylaşırlar ancak izole süreçler çalıştırırlar. Hafif, hızlı başlayan ve taşınabilirdirler.
Konteynerler taşınabilirlik sorununu çözdü ama başka bir sorun yarattı: üretim ortamında yüzlerce (veya binlerce) konteyneri nasıl yönetirsiniz? Her zaman çalıştıklarından, birbirleriyle iletişim kurabildiklerinden ve yüke göre ölçeklenebildiklerinden nasıl emin olursunuz?
İşte Kubernetes burada devreye girer.
Kubernetes Nedir?
Kubernetes (genellikle K8s olarak kısaltılır) konteyner orkestrasyonu için açık kaynaklı bir platformdur. Basit ifadeyle, konteynerleştirilmiş uygulamaların dağıtımını, ölçeklenmesini ve yönetimini otomatikleştirir. Google tarafından oluşturulan ve şu anda Cloud Native Computing Foundation (CNCF) tarafından bakımı yapılan Kubernetes, ölçekte mikroservislerle çalışan herkes için vazgeçilmez araç haline gelmiştir.
Kubernetes Cluster Mimarisi
Bir Kubernetes ortamına cluster denir. Cluster, uygulamalarımızı çalıştıran node adı verilen makinelerden oluşur. Mimari iki ana bölüme ayrılır: Control Plane ve Worker Nodes.
Control Plane
Control Plane, cluster'ın "beynidir". Küresel kararlar alır (zamanlama gibi) ve cluster olaylarını algılar ve yanıt verir. Ana bileşenleri şunlardır:
- API Server (
kube-apiserver): Cluster'ın kapısıdır. Kullanıcılar (kubectlaracılığıyla), cluster bileşenleri ve harici araçlar tarafından iletişim kurmak için kullanılan Kubernetes API'sini sunar. - etcd: Tutarlı ve yüksek erişilebilirlikli bir anahtar-değer veritabanıdır. Sistemin istenen ve mevcut durumunu temsil eden tüm cluster verilerini depolar.
- Scheduler (
kube-scheduler): Yeni oluşturulan Pods'ları kaynak gereksinimleri, politikalar ve diğer kısıtlamaları dikkate alarak uygun bir Worker Node'a atar. - Controller Manager (
kube-controller-manager): Cluster'ın durumunu izleyen ve onu istenen duruma getirmek için çalışan kontrol döngüleri olan controller'ları çalıştırır. Örneğin,Node Controllernode'ları yönetirken,Replication Controllerdoğru sayıda Pod'un çalıştığından emin olur.
Worker Node
Worker Nodes, uygulamaların gerçekte çalıştığı makinelerdir (fiziksel veya sanal). Her node Control Plane tarafından yönetilir ve şu bileşenleri içerir:
- Kubelet: Her node'da çalışan bir ajandır. Pods'ta tanımlanan konteynerlerin çalıştığından ve sağlıklı olduğundan emin olur.
- Kube-proxy: Node'larda ağ kurallarını yöneten bir ağ proxy'sidir. Cluster içinden veya dışından Pods'a ağ iletişimini sağlar.
- Container Runtime: Konteynerleri çalıştırmaktan sorumlu yazılımdır. Docker en ünlüsüdür, ancak Kubernetes
containerdveCRI-Ogibi diğer runtime'ları da destekler.
Temel Kubernetes Nesneleri
Kubernetes'te her şey nesneler ile temsil edilir. Bu nesneler "niyet kayıtlarıdır": bir nesne oluşturduğunuzda, Kubernetes sürekli olarak onun var olduğundan ve istenen durumla eşleştiğinden emin olmak için çalışır.
İşte en önemlileri:
Pod
Pod, Kubernetes'teki en küçük yürütme birimidir. Aynı node'da birlikte çalışan, ağ ve depolama gibi kaynakları paylaşan bir veya daha fazla konteyneri temsil eder.
Genellikle Pod başına yalnızca bir konteyner çalıştırırsınız, ancak gelişmiş senaryolarda (loglama veya izleme için "sidecar containers" gibi) daha fazlası olabilir.
Pod'ları neredeyse hiçbir zaman doğrudan oluşturmazsınız. Deployments gibi daha üst düzey soyutlamalar kullanırsınız.
Deployment
Deployment, en sık kullanacağınız nesnedir. Bir grup özdeş Pod için istenen durumu tanımlar. Deployment controller şunlardan sorumludur:
- Bir ReplicaSet oluşturma ve yönetme (bir Pod'un belirli sayıda kopyasının her zaman çalışmasını sağlayan başka bir nesne).
- Pod sayısını artırma veya azaltma olarak ölçekleme.
- Uygulama güncellemelerini kontrollü bir şekilde yönetme (örneğin, Rolling Update), kesinti olmadan.
3 NGINX sunucu kopyası çalıştıran bir Deployment için örnek YAML dosyası:
# nginx-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.14.2 ports: - containerPort: 80
Service
Kubernetes'teki Pods geçicidir: herhangi bir zamanda oluşturulabilir ve yok edilebilir. Her Pod'un kendi IP adresi vardır, ancak bu IP kararlı değildir. Peki uygulamamızı güvenilir bir şekilde nasıl sunabiliriz?
Bir Service ile. Service, bir dizi Pod'un mantıksal kümesini ve erişim politikasını tanımlayan bir soyutlamadır. Bir Pod grubuna kararlı bir erişim noktası (sanal bir IP adresi ve bir DNS adı) sağlar.
Service, trafiği yönlendirmesi gereken Pods'ları bulmak için labels tabanlı bir selector kullanır.
NGINX Deployment'ımız için nasıl bir Service oluşturulur:
# nginx-service.yaml apiVersion: v1 kind: Service metadata: name: nginx-service spec: selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 80 type: ClusterIP # Default - exposes the service only within the cluster
Farklı Service türleri vardır:
ClusterIP: Servisi cluster-içi bir IP'de sunar (varsayılan).NodePort: Servisi her Worker Node'da statik bir portta sunar.LoadBalancer: Bulut sağlayıcısında (örn. AWS, GCP) harici bir yük dengeleyici oluşturur ve servise genel bir IP atar.
Ingress
Bir LoadBalancer Service harikadır, ancak her servis için bir tane oluşturmak pahalı olabilir. Birden fazla HTTP/HTTPS servisini dış dünyaya sunmak için bir Ingress kullanılır.
Ingress, harici trafik için "akıllı bir yönlendirici" görevi görür. Host'a (örn. api.mysite.com) veya yola (örn. mysite.com/api) dayalı yönlendirme kuralları tanımlamanıza olanak tanır.
Bir Ingress örneği:
# example-ingress.yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: example-ingress spec: rules: - host: mysite.com http: paths: - path: /api pathType: Prefix backend: service: name: api-service port: number: 8080 - path: /ui pathType: Prefix backend: service: name: ui-service port: number: 3000
Diğer Faydalı Nesneler
- Namespace: Fiziksel bir cluster içinde "sanal cluster'lar" oluşturmanıza olanak tanır. Ortamları (örn.
development,staging,production) veya ekipleri izole etmek için faydalıdır. - ConfigMap ve Secret: Konteyner imajından ayrılmış yapılandırma verilerini ve gizli bilgileri (şifreler veya API anahtarları gibi) yönetmek için.
- StatefulSet: Deployment'a benzer, ancak kararlı ağ kimlikleri ve kalıcı depolama gerektiren durum bilgili uygulamalar (veritabanları gibi) için özeldir.
- PersistentVolume (PV) ve PersistentVolumeClaim (PVC): Cluster'daki kalıcı depolamayı yönetmek için.
Sonuç
Kubernetes inanılmaz güçlü bir araçtır, ancak öğrenme eğrisi dik olabilir. Bu rehber yalnızca yüzeyi çizmiştir, ancak temel kavramlar hakkında sağlam bir anlayış sağladığını umuyoruz.
Şimdi ne yapmalısınız?
- Yerel olarak deneyin: Bilgisayarınızda bir Kubernetes cluster'ı oluşturmak için Minikube veya Kind kurun.
kubectlkullanın: Cluster ile etkileşim kurmanız için ana aracınız olankubectlkomutuyla tanışın. Bu makaledeki NGINX Deployment ve Service'i oluşturmayı deneyin.- Resmi öğreticileri keşfedin: Kubernetes belgeleri örneklerle dolu harika bir kaynaktır.
Konteyner orkestrasyonu cloud-native dünyasında temel bir beceridir ve Kubernetes'te ustalaşmak bir olasılıklar dünyası açacaktır. İyi eğlenceler!