Kubernetes Ağ yönetimi:
1. iptables & route tables → Linux’ta ağ trafiğini yönlendirir, Kubernetes otomatik yönetir.
2. kube-proxy → Gelen trafiği pod’lara yönlendirir, iptables veya IPVS ile kurallar oluşturur.
3. CNI (Container Networking Interface) → Pod’lara IP adresi atar, ağ bağlantısını sağlar.
4. CNI Plugin’ler (Calico, Flannel, AWS-VPC-CNI) → Ağ politikalarını ve yönlendirmeyi belirler.
• Calico → Güvenlik ve ağ politikaları ekler.
• Flannel → Basit yönlendirme yapar, IP tünelleme kullanır.
• AWS-VPC-CNI → AWS’de her pod’a gerçek VPC IP’si atar.
5. Node → Pod’ların çalıştığı fiziksel/sanal sunucudur.
6. Pod → İçinde bir veya birden fazla konteyner bulunan en küçük birimdir.
7. CIDR → Node’lara tahsis edilen IP bloklarıdır, pod’lar buradan IP alır.
Pod’lar Arası İletişim
• Her pod’un kendi IP adresi vardır ve node’un ağı üzerinden yönlendirilir.
- Pod’a atanmış IP’yi görmek için:
kubectl exec -it <pod> bash
ip a
• Node’da pod’un IP’sini görmek için:
ip route ls | grep <POD_IP>
Özetle
• Node, Kubernetes’te bir CIDR bloğuna sahiptir.
• Pod ayağa kalktığında, node bu CIDR bloğundan bir IP adresi seçer ve pod’a atar.
• Pod’un içinde bir sanal ağ arayüzü (eth0 gibi) oluşur ve bu IP buraya bağlanır.
• Node, kendi yönlendirme tablosunda (ip route) bu IP’nin hangi arayüzden geçtiğini gösterir.
Kubernetes Service & Örnek Senaryolar
Pod’lar ölçeklenirken veya yeniden başlatıldığında IP’leri değişebilir. Service, pod’ların sabit bir adres üzerinden erişilebilir olmasını sağlar.
1. ClusterIP (Varsayılan — İç Trafik)
📌 Senaryo: Bir e-ticaret sitesinin frontend kısmı, backend servisinden veri çekmek istiyor. Pod’ların IP’leri değişebileceğinden, ClusterIP kullanılarak backend sabit bir servis adıyla erişilebilir hale getirilir.
➡ Gerçek Hayatta Kullanım: Mikro servis mimarilerinde, arka plandaki servislerin (veritabanı, API’ler vb.) birbirine erişmesi gerektiğinde kullanılır.
2. NodePort (Dışarıdan Erişim — Belirli Node Portu Üzerinden)
📌 Senaryo: Kümede çalışan bir web uygulamasına, dış dünyadan herhangi bir node’un IP’si üzerinden erişmek istiyoruz. NodePort ile belirli bir port açılarak tüm node’lar üzerinden erişim sağlanır.
➡ Gerçek Hayatta Kullanım: Test ortamlarında dış dünyadan erişim gerektiğinde veya bir yük dengeleyici (Load Balancer) eklenmeden erişim sağlanmak istendiğinde kullanılır.
3. LoadBalancer (Dış Dünyaya Açık Servis)
📌 Senaryo: AWS veya GCP üzerinde çalışan bir REST API, internet üzerinden herkesin erişimine açılmalıdır. LoadBalancer türü kullanıldığında, cloud sağlayıcısı otomatik olarak bir dış IP adresi atar ve trafiği ilgili pod’lara yönlendirir.
➡ Gerçek Hayatta Kullanım: Gerçek dünya projelerinde, halka açık API’ler, web uygulamaları veya dış kullanıcıların bağlanması gereken hizmetler için kullanılır.
4. ExternalName (Harici Bir Servise DNS ile Yönlendirme)
📌 Senaryo: Kubernetes içindeki uygulamaların harici bir veritabanına (örneğin AWS RDS PostgreSQL) bağlanması gerekiyor. ExternalName, Kubernetes içindeki servisleri bir DNS adresine yönlendirerek, uygulamaların doğrudan bir dış kaynağa bağlanmasını sağlar.
➡ Gerçek Hayatta Kullanım: Kubernetes içindeki mikro servislerin, dış dünyadaki veritabanlarına veya hizmetlere sorunsuz erişmesini sağlamak için kullanılır.
ClusterIP → Servisler sadece küme içinden erişebilir (Mikro servisler arası iletişim).
• NodePort → Node’ların belirli bir portu açılarak dış erişim sağlanır (Test ortamları için kullanışlı).
• LoadBalancer → Cloud ortamında çalışan servisler dış dünyaya açılır (Web API’ler, web uygulamaları).
• ExternalName → Kubernetes içindeki servisler, harici bir servise DNS üzerinden yönlendirilir (Harici veritabanı veya API bağlantıları).