Kubernetes Nedir ve Ne İşe Yarar?
Kubernetes, container tabanlı uygulamaların dağıtılmasını, yönetilmesini, ölçeklendirilmesini ve çalışır durumda tutulmasını sağlayan açık kaynaklı bir container orkestrasyon platformudur.
Özellikle Docker gibi teknolojilerle oluşturulan container imajlarının birden fazla sunucu üzerinde yönetilmesinde kullanılır.
Kubernetes sayesinde uygulamaların çalıştırılması, servisler arasındaki iletişim, yük dağıtımı, otomatik yeniden başlatma ve güncelleme işlemleri merkezi bir sistem üzerinden yönetilebilir.
Kubernetes Nedir?
Kubernetes, kısaca K8s olarak da adlandırılan açık kaynaklı bir container orkestrasyon sistemidir.
İlk olarak Google tarafından geliştirilen Kubernetes, 2014 yılında açık kaynak olarak duyurulmuştur. Günümüzde Cloud Native Computing Foundation (CNCF) bünyesinde geliştirilmektedir.
Kubernetes'in temel amacı, container içerisinde çalışan uygulamaların yaşam döngüsünü otomatik olarak yönetmektir.
Kubernetes ile gerçekleştirilebilen başlıca işlemler şunlardır:
-
Container tabanlı uygulamaları çalıştırmak
-
Birden fazla sunucuyu tek bir küme olarak yönetmek
-
Uygulamaları otomatik ölçeklendirmek
-
Hatalı container'ları yeniden başlatmak
-
Uygulama trafiğini servisler arasında dağıtmak
-
Yeni uygulama sürümlerini kontrollü şekilde yayınlamak
-
Uygulama yapılandırmalarını yönetmek
-
Kalıcı depolama kaynaklarını kullanmak
-
Uygulamaların çalışma durumunu izlemek
-
DevOps ve CI/CD süreçleriyle entegrasyon sağlamak
Kubernetes, özellikle birden fazla container ve sunucunun bulunduğu ortamlarda yönetim kolaylığı sağlayabilir.
Kubernetes Ne İşe Yarar?
Kubernetes, container tabanlı uygulamaların çalıştırılmasını ve yönetilmesini otomatikleştirmek için kullanılır.
Örneğin bir web uygulamasının aynı anda birden fazla container üzerinde çalıştırılması gerektiğinde Kubernetes bu container'ların yönetimini gerçekleştirebilir.
Bir container beklenmedik şekilde kapanırsa Kubernetes, tanımlanan istenen durumu yeniden sağlamak için yeni bir container oluşturulmasını sağlayabilir.
Uygulamanın daha fazla işlem kapasitesine ihtiyaç duyması durumunda uygun ölçeklendirme yapılandırmalarıyla çalışan uygulama kopyalarının sayısı artırılabilir.
Kubernetes ayrıca yeni uygulama sürümlerinin kontrollü şekilde dağıtılmasını destekler.
Kubernetes Nasıl Çalışır?
Kubernetes, bir veya birden fazla sunucudan oluşan cluster yapısı üzerinde çalışır.
Cluster içerisinde uygulamaları yöneten kontrol düzlemi ve uygulamaların çalıştırıldığı worker node sistemleri bulunur.
Kubernetes'in temel çalışma mantığı, istenen durumun tanımlanması ve sistemin bu duruma ulaşmaya çalışmasıdır.
Örneğin bir uygulamanın üç kopya halinde çalışması isteniyorsa Kubernetes bu durumu korumaya çalışır.
Genel çalışma süreci şöyledir:
-
Uygulama için container imajı hazırlanır.
-
Kubernetes yapılandırma dosyası oluşturulur.
-
Uygulamanın kaç kopya çalışacağı belirlenir.
-
Kubernetes uygun node sistemlerini seçer.
-
Pod'lar oluşturulur.
-
Container'lar başlatılır.
-
Uygulamanın durumu izlenir.
-
Hata veya değişiklik durumunda gerekli işlemler gerçekleştirilir.
Bu süreç Kubernetes kontrol bileşenleri tarafından yönetilir.
Kubernetes Cluster Nedir?
Kubernetes Cluster, Kubernetes tarafından yönetilen sunucu veya sanal makine grubudur.
Bir cluster genel olarak iki temel bölümden oluşur:
-
Control Plane
-
Worker Nodes
Control Plane Nedir?
Control Plane, Kubernetes kümesinin yönetiminden sorumlu bileşenleri içerir.
Görevleri arasında:
-
Kubernetes API isteklerini işlemek
-
Cluster durumunu yönetmek
-
Pod'ların hangi node üzerinde çalışacağını belirlemek
-
İstenen durumla mevcut durumu karşılaştırmak
-
Gerekli yönetim işlemlerini başlatmak
bulunur.
Worker Node Nedir?
Worker Node, uygulama container'larının çalıştırıldığı sistemdir.
Worker node üzerinde Kubernetes tarafından yönetilen Pod'lar bulunur.
Worker node sistemleri fiziksel sunucular veya sanal makineler olabilir.
Kubernetes Mimarisi ve Temel Bileşenleri
Kubernetes mimarisinde farklı görevleri yerine getiren bileşenler bulunur.
|
Bileşen |
Görevi |
|---|---|
|
API Server |
Kubernetes API isteklerini karşılar. |
|
etcd |
Cluster yapılandırmasını ve durum verilerini saklar. |
|
Scheduler |
Pod'ların uygun node'lara atanmasını sağlar. |
|
Controller Manager |
Çeşitli kontrol döngülerini çalıştırır. |
|
Kubelet |
Node üzerindeki Pod'ların çalışmasını yönetir. |
|
Kube-proxy |
Kullanılan ağ mimarisine göre servis trafiği kurallarını yönetir. |
|
Container Runtime |
Container'ların çalıştırılmasını sağlar. |
Kubernetes sisteminin sağlıklı çalışabilmesi için bu bileşenlerin uygun şekilde yapılandırılması gerekir.
Kubernetes Pod Nedir?
Pod, Kubernetes içerisinde oluşturulabilen ve dağıtılabilen en küçük çalışma birimidir.
Bir Pod içerisinde bir veya birden fazla container bulunabilir.
Aynı Pod içerisindeki container'lar:
-
Aynı ağ ad alanını paylaşır.
-
Birbirleriyle localhost üzerinden iletişim kurabilir.
-
Tanımlanan ortak volume kaynaklarını kullanabilir.
-
Aynı node üzerinde çalışır.
Örneğin bir web uygulaması container'ı ile ona yardımcı olan başka bir container aynı Pod içerisinde çalıştırılabilir.
Ancak her uygulama için birden fazla container içeren Pod kullanılması zorunlu değildir.
Kubernetes Deployment Nedir?
Deployment, Kubernetes üzerinde uygulamaların istenen sayıda Pod kopyasıyla çalıştırılmasını ve güncellenmesini yönetmek için kullanılan kaynaktır.
Deployment sayesinde:
-
Uygulama kopyaları oluşturulabilir.
-
Pod sayısı değiştirilebilir.
-
Yeni sürümler dağıtılabilir.
-
Önceki sürümlere geri dönülebilir.
-
İstenen çalışma durumu korunabilir.
Örneğin bir web uygulamasının üç kopya halinde çalıştırılması için Deployment tanımlanabilir.
Kubernetes Deployment Nasıl Oluşturulur?
Kubernetes yapılandırmaları genellikle YAML dosyaları üzerinden tanımlanır.
Örnek 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.27
ports:
- containerPort: 80
Bu yapılandırmada:
-
apiVersion: Kullanılan Kubernetes API sürümünü belirtir. -
kind: Oluşturulacak kaynak türüdür. -
metadata: Kaynağın adını ve diğer bilgilerini içerir. -
replicas: İstenen Pod kopyası sayısını belirtir. -
selector: Deployment tarafından yönetilecek Pod'ları seçer. -
template: Oluşturulacak Pod'ların yapısını tanımlar. -
containers: Pod içerisindeki container'ları belirtir.
Bu örnek, Nginx uygulamasının üç Pod kopyasıyla çalıştırılmasını hedefler.
Kubectl Nedir?
kubectl, Kubernetes cluster'larını komut satırından yönetmek için kullanılan araçtır.
Kubectl ile Kubernetes kaynakları oluşturulabilir, güncellenebilir, silinebilir ve incelenebilir.
Yaygın kullanılan komutlar:
kubectl get nodes
Cluster içerisindeki node'ları listeler.
kubectl get pods
Varsayılan namespace içerisindeki Pod'ları listeler.
kubectl get deployments
Deployment kaynaklarını görüntüler.
kubectl get services
Service kaynaklarını listeler.
kubectl get all
Bulunulan namespace içerisindeki yaygın kaynak türlerini görüntüler. Bütün Kubernetes kaynak türlerini kapsamaz.
Bu komutların çalışabilmesi için kubectl aracının kurulmuş ve erişilebilir bir Kubernetes cluster'ına uygun şekilde yapılandırılmış olması gerekir.
Kubernetes Üzerinde Uygulama Nasıl Çalıştırılır?
Hazırlanan YAML dosyası Kubernetes cluster'ına uygulanabilir.
kubectl apply -f deployment.yaml
Deployment durumunu kontrol etmek için:
kubectl get deployments
Pod'ları görüntülemek için:
kubectl get pods
Deployment hakkında ayrıntılı bilgi almak için:
kubectl describe deployment nginx-deployment
Uygulamanın çalışması için cluster üzerinde yeterli kaynak ve gerekli container imajına erişim bulunmalıdır.
Kubernetes Service Nedir?
Service, Kubernetes içerisinde Pod'lara ağ üzerinden erişim sağlamak için kullanılan kaynaktır.
Pod'lar yeniden oluşturulduğunda IP adresleri değişebilir.
Service, belirli Pod'lara ulaşmak için daha kararlı bir erişim noktası sağlar.
Kubernetes üzerinde yaygın Service türleri şunlardır:
|
Service Türü |
Açıklama |
|---|---|
|
ClusterIP |
Cluster içerisinden erişim sağlar. |
|
NodePort |
Node üzerindeki belirli bir port üzerinden erişim sağlayabilir. |
|
LoadBalancer |
Desteklenen altyapıda harici yük dengeleyici oluşturulmasını sağlar. |
|
ExternalName |
DNS adı üzerinden başka bir servise yönlendirme sağlar. |
Service türünün seçimi uygulamanın ağ gereksinimlerine bağlıdır.
Kubernetes Service Nasıl Oluşturulur?
Örnek service.yaml:
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
type: ClusterIP
selector:
app: nginx
ports:
- port: 80
targetPort: 80
Bu yapılandırma, app: nginx etiketine sahip uygun Pod'lara erişim sağlayan bir Service oluşturur.
Service'i oluşturmak için:
kubectl apply -f service.yaml
Oluşturulan Service'i görüntülemek için:
kubectl get services
Kubernetes Namespace Nedir?
Namespace, Kubernetes cluster içerisindeki kaynakları mantıksal olarak gruplandırmak için kullanılan yapıdır.
Örneğin farklı uygulama veya ortamlar için ayrı namespace'ler oluşturulabilir.
kubectl create namespace development
Namespace listesini görüntülemek için:
kubectl get namespaces
Belirli bir namespace içerisindeki Pod'ları listelemek için:
kubectl get pods -n development
Namespace kullanımı kaynakların düzenlenmesine yardımcı olur. Ancak tek başına tam güvenlik izolasyonu sağlamaz.
Kubernetes ConfigMap Nedir?
ConfigMap, uygulamaların gizli olmayan yapılandırma verilerini saklamak için kullanılan Kubernetes kaynağıdır.
Örneğin:
-
Uygulama ortamı
-
Servis adresleri
-
Yapılandırma seçenekleri
-
Uygulama ayarları
ConfigMap içerisinde tanımlanabilir.
Örnek:
apiVersion: v1
kind: ConfigMap
metadata:
name: uygulama-config
data:
APP_ENV: "production"
APP_DEBUG: "false"
ConfigMap, yapılandırma bilgilerinin container imajından ayrı yönetilmesine yardımcı olur.
Kubernetes Secret Nedir?
Secret, parola, token ve benzeri hassas verilerin Kubernetes üzerinde yönetilmesini sağlayan kaynaktır.
Örneğin:
-
Veritabanı parolaları
-
API anahtarları
-
Kimlik doğrulama bilgileri
-
TLS sertifikaları
Secret olarak saklanabilir.
Örnek Secret oluşturma komutu:
kubectl create secret generic db-secret \
--from-literal=DB_PASSWORD='ornek-parola'
Bu komuttaki parola yalnızca örnektir. Gerçek sistemlerde hassas bilgilerin komut satırı geçmişine veya işlem listelerine sızmasını önleyen yöntemler tercih edilmelidir.
Kubernetes Secret değerlerinin varsayılan olarak Base64 biçiminde saklanabilmesi, tek başına şifreleme anlamına gelmez.
Bu nedenle Secret verilerinin korunması için erişim yetkileri, etcd şifrelemesi ve uygun güvenlik politikaları ayrıca yapılandırılmalıdır.
Kubernetes Volume Nedir?
Container dosya sistemlerinde bulunan veriler, container yeniden oluşturulduğunda kaybolabilir.
Kubernetes, uygulamaların veri depolama ihtiyaçlarını karşılamak için volume yapıları sunar.
Yaygın kullanılan kavramlar:
-
Volume
-
PersistentVolume
-
PersistentVolumeClaim
-
StorageClass
PersistentVolume Nedir?
PersistentVolume, Kubernetes cluster'ında kullanılabilen kalıcı depolama kaynağını temsil eder.
PersistentVolumeClaim Nedir?
PersistentVolumeClaim, uygulamanın ihtiyaç duyduğu depolama kaynağı için oluşturduğu taleptir.
Bu yapılar özellikle veritabanları ve kalıcı veri gerektiren uygulamalarda kullanılabilir.
Kubernetes Autoscaling Nedir?
Autoscaling, uygulamaların veya altyapı kaynaklarının belirlenen koşullara göre ölçeklendirilmesini sağlayan yaklaşımdır.
Kubernetes farklı ölçeklendirme mekanizmalarını destekler.
Horizontal Pod Autoscaler (HPA)
Belirli metriklere göre Pod kopyası sayısını artırabilir veya azaltabilir.
Vertical Pod Autoscaler (VPA)
Uygulama Pod'larının CPU ve bellek kaynak taleplerini ayarlamak için kullanılabilen ayrı bir bileşendir.
Node Autoscaling
Desteklenen altyapı ve ilgili otomatik ölçeklendirme bileşenleriyle cluster node kapasitesinin artırılmasını veya azaltılmasını sağlar.
Otomatik ölçeklendirme için gerekli metriklerin ve altyapı bileşenlerinin uygun şekilde yapılandırılması gerekir.
Kubernetes Rolling Update Nedir?
Rolling Update, uygulamanın yeni sürümünün Pod'lar kademeli olarak değiştirilerek dağıtılmasını sağlayan güncelleme yöntemidir.
Bu yöntem, uygun yapılandırmalarda uygulamanın erişilebilirliğini koruyarak güncelleme yapılmasına yardımcı olabilir.
Örneğin Deployment imajını değiştirmek için:
kubectl set image deployment/nginx-deployment \
nginx=nginx:1.28
Bu komut Deployment içerisindeki nginx container'ının imajını değiştirir.
Güncelleme durumunu kontrol etmek için:
kubectl rollout status deployment/nginx-deployment
Önceki sürüme geri dönmek için:
kubectl rollout undo deployment/nginx-deployment
Geri alma işleminin çalışması, uygun Deployment geçmişinin bulunmasına bağlıdır.
Kubernetes ile Docker Arasındaki Farklar
|
Özellik |
Docker |
Kubernetes |
|---|---|---|
|
Temel amaç |
Container oluşturma ve çalıştırma araçları sunar. |
Container tabanlı uygulamaları orkestre eder. |
|
Container imajı oluşturma |
Destekler. |
Doğrudan temel görevi değildir. |
|
Çoklu sunucu yönetimi |
Tek başına temel Docker Engine görevi değildir. |
Cluster yönetimini destekler. |
|
Otomatik ölçeklendirme |
Ek araçlar gerektirebilir. |
Uygun bileşenlerle destekler. |
|
Hatalı Pod'ları yeniden oluşturma |
Kubernetes Pod kavramı bulunmaz. |
Destekler. |
|
Servis keşfi |
Docker ağ özellikleriyle sağlanabilir. |
Kubernetes Service ve DNS ile sağlanır. |
|
Rolling Update |
Orkestrasyon araçlarıyla sağlanabilir. |
Deployment ile desteklenir. |
Docker ve Kubernetes birbirinin doğrudan alternatifi değildir.
Docker, container oluşturma ve çalıştırma araçları sunarken Kubernetes container tabanlı uygulamaların orkestrasyonuna odaklanır.
Kubernetes, container çalıştırmak için Docker Engine kullanılmasını zorunlu kılmaz. Containerd ve CRI-O gibi uyumlu container runtime sistemleri kullanılabilir.
Kubernetes ile Docker Compose Arasındaki Farklar
Docker Compose, birden fazla container içeren uygulamaların tanımlanmasını ve çalıştırılmasını kolaylaştırır.
Kubernetes ise daha kapsamlı cluster yönetimi ve orkestrasyon özellikleri sunar.
|
Özellik |
Docker Compose |
Kubernetes |
|---|---|---|
|
Yapılandırma |
Compose YAML dosyası |
Kubernetes kaynak dosyaları |
|
Temel kullanım |
Çoklu container uygulamaları |
Container orkestrasyonu |
|
Cluster yönetimi |
Temel amacı değildir. |
Destekler. |
|
Otomatik ölçeklendirme |
Yerleşik HPA benzeri sistem bulunmaz. |
Uygun bileşenlerle destekler. |
|
Servis keşfi |
Docker ağları üzerinden |
Service ve DNS üzerinden |
|
Kurulum karmaşıklığı |
Genellikle daha düşüktür. |
Genellikle daha yüksektir. |
Küçük ve tek sunuculu projelerde Docker Compose yeterli olabilir.
Birden fazla node, otomatik ölçeklendirme ve gelişmiş dağıtım yönetimi gerektiren projelerde Kubernetes değerlendirilebilir.
Kubernetes ile DevOps Arasındaki İlişki
Kubernetes, DevOps süreçlerinde uygulamaların dağıtılması ve yönetilmesi için kullanılabilir.
Örneğin bir CI/CD süreci şu şekilde oluşturulabilir:
-
Geliştirici Git deposuna kod gönderir.
-
CI/CD sistemi otomatik testleri çalıştırır.
-
Uygulama için container imajı oluşturulur.
-
İmaj container kayıt sistemine gönderilir.
-
Kubernetes Deployment yapılandırması güncellenir.
-
Yeni Pod'lar oluşturulur.
-
Eski Pod'lar kontrollü şekilde kaldırılır.
-
Uygulamanın durumu izlenir.
GitHub Actions, GitLab CI/CD ve Jenkins gibi araçlar Kubernetes dağıtım süreçleriyle entegre edilebilir.
Kubernetes Kullanmanın Avantajları
Kubernetes kullanımının sağlayabileceği başlıca avantajlar şunlardır:
-
Container tabanlı uygulamaların merkezi yönetimi
-
Birden fazla sunucuda uygulama çalıştırma
-
Otomatik yeniden oluşturma mekanizmaları
-
Uygulama ölçeklendirme desteği
-
Servis keşfi ve ağ yönetimi
-
Kontrollü sürüm güncellemeleri
-
Yapılandırma ve Secret yönetimi
-
Kalıcı depolama desteği
-
CI/CD sistemleriyle entegrasyon
-
Farklı altyapılarda çalışabilme
Bu avantajların sağlanabilmesi için Kubernetes altyapısının doğru kurulması ve yönetilmesi gerekir.
Kubernetes Kullanmanın Dezavantajları
Kubernetes her proje için gerekli olmayabilir.
Karşılaşılabilecek zorluklar şunlardır:
-
Kurulum ve yönetim karmaşıklığı
-
Ek altyapı kaynaklarına ihtiyaç duyulması
-
Ağ ve depolama yapılandırmalarının öğrenilmesi
-
Güvenlik politikalarının yönetilmesi
-
İzleme ve loglama altyapısı gereksinimleri
-
Küçük projelerde gereksiz operasyonel yük oluşturabilmesi
Bu nedenle Kubernetes kullanımı projenin ölçeğine, ihtiyaçlarına ve yönetim kapasitesine göre değerlendirilmelidir.
Kubernetes Kullanırken Karşılaşılan Sorunlar
Pod Başlatılamıyor
Container imajı, kaynak talepleri, node durumu ve Pod olayları incelenmelidir.
kubectl describe pod POD_ADI
ImagePullBackOff Hatası
Container imajının adresi, etiketi ve registry erişim bilgileri kontrol edilmelidir.
CrashLoopBackOff Hatası
Container'ın tekrar tekrar başarısız olmasına neden olan uygulama veya yapılandırma sorunları incelenmelidir.
kubectl logs POD_ADI
Service Üzerinden Erişim Sağlanamıyor
Service selector, Pod etiketleri, port eşleştirmeleri ve ağ politikaları kontrol edilmelidir.
Pod Pending Durumunda Kalıyor
Node kaynakları, scheduling koşulları, depolama talepleri ve ilgili olaylar incelenmelidir.
Deployment Güncellenmiyor
Deployment durumu ve rollout kayıtları kontrol edilmelidir.
kubectl rollout status deployment/DEPLOYMENT_ADI
Kubernetes Güvenliği Nasıl Sağlanır?
Kubernetes cluster güvenliği için farklı katmanlarda önlem alınmalıdır.
Başlıca güvenlik uygulamaları:
-
Kubernetes sürümleri güncel tutulmalıdır.
-
RBAC ile erişim yetkileri sınırlandırılmalıdır.
-
Secret verileri uygun şekilde korunmalıdır.
-
Container'lar mümkün olduğunda root olmayan kullanıcılarla çalıştırılmalıdır.
-
NetworkPolicy ile ağ erişimleri sınırlandırılmalıdır.
-
Güvenilir container imajları kullanılmalıdır.
-
Container güvenlik taramaları yapılmalıdır.
-
Gereksiz ayrıcalıklar kaldırılmalıdır.
-
API Server erişimi korunmalıdır.
-
Cluster logları ve olayları izlenmelidir.
Güvenlik yapılandırmaları uygulamanın ve altyapının ihtiyaçlarına göre belirlenmelidir.
Kubernetes Hangi Projelerde Kullanılır?
Kubernetes farklı ölçeklerdeki uygulamalarda kullanılabilir.
Örnek kullanım alanları:
-
Mikroservis mimarileri
-
Büyük ölçekli web uygulamaları
-
API servisleri
-
Bulut tabanlı yazılımlar
-
Container tabanlı kurumsal sistemler
-
Otomatik ölçeklendirme gerektiren uygulamalar
-
Birden fazla sunucuda çalışan servisler
-
DevOps ve CI/CD altyapıları
Ancak basit bir web sitesi veya tek sunuculu küçük bir uygulama için Kubernetes zorunlu değildir.
Sonuç
Kubernetes, container tabanlı uygulamaların dağıtılmasını, yönetilmesini ve ölçeklendirilmesini sağlayan açık kaynaklı bir orkestrasyon platformudur.
Cluster, Node, Pod, Deployment, Service, Namespace, ConfigMap, Secret ve PersistentVolume gibi bileşenlerle uygulamaların çalışma ortamı yönetilebilir.
Kubernetes; otomatik ölçeklendirme, kontrollü güncelleme, servis keşfi ve hata sonrası yeniden oluşturma gibi özellikleri sayesinde özellikle çoklu container ve çoklu sunucu altyapılarında kullanılmaktadır.
Doğru yapılandırılmış bir Kubernetes ortamı, uygulamaların daha düzenli, izlenebilir ve yönetilebilir biçimde çalıştırılmasına yardımcı olur.







