Kubernetes, modern dağıtık uygulamaları yönetmek ve ölçeklendirmek için kullanılan güçlü bir platformdur. Kubernetes üzerinde çalışan uygulamalar genellikle dış dünyadan erişilebilmesi için belirli portlar üzerinden iletişim kurar. Bu portların doğru bir şekilde yönlendirilmesi, uygulamanın erişilebilirliği ve güvenliği açısından kritik öneme sahiptir. Bu makalede, Kubernetes üzerinde port yönlendirme işlemlerinin nasıl yapıldığını, kubectl port-forward
, Kubernetes Servisleri (Services), ve Ingress gibi farklı yöntemlerle bu işlemlerin nasıl gerçekleştirildiğini inceleyeceğiz.
Port Yönlendirme (Port Forwarding) Nedir?
Port yönlendirme, belirli bir port üzerinden gelen trafiğin, Kubernetes kümesi içinde çalışan bir uygulamaya iletilmesini sağlar. Bu işlem, özellikle yerel geliştirme ortamlarında veya dış dünyaya açılmamış bir Kubernetes Pod’una erişim sağlamak için kullanılır. Port yönlendirme, doğrudan bir Pod’a veya Servise yönlendirme yapılabilir.
1. kubectl port-forward
Kullanımı
kubectl port-forward
, bir yerel makine portunu Kubernetes kümesinde çalışan bir Pod veya Servis’e yönlendirmek için kullanılan basit ama güçlü bir komuttur. Bu yöntem, genellikle geliştirme veya test amaçlıdır ve Kubernetes kümesine erişim gerektirir.
1.1. Bir Pod’a Port Yönlendirme
Bir Pod’a port yönlendirmek için kubectl port-forward
komutunu kullanabilirsiniz. Aşağıdaki örnekte, yerel makinenizdeki 8080 portunu, my-pod
adlı Pod’daki 80 portuna yönlendiriyoruz:
kubectl port-forward pod/my-pod 8080:80
Bu komut, localhost üzerinde 8080 portundan gelen istekleri Kubernetes kümesindeki my-pod
Pod’undaki 80 portuna yönlendirir.
1.2. Bir Servis’e Port Yönlendirme
Benzer şekilde, bir Servis’e port yönlendirme yapmak için:
kubectl port-forward service/my-service 8080:80
Bu komut, my-service
adlı Servis’e yönlendirme yapar ve bu Servis’e gelen trafiği ilgili Pod’lara iletir.
2. Kubernetes Servisleri ile Port Yönlendirme
Kubernetes Servisleri, Kubernetes içindeki Pod’lar arasındaki iletişimi ve dış dünya ile olan bağlantıları yöneten soyutlama katmanıdır. Servisler, uygulamalarınızın Kubernetes kümesi içinde ve dışında erişilebilir olmasını sağlar.
2.1. ClusterIP Servisi
ClusterIP
, Kubernetes’te varsayılan Servis türüdür. Bu Servis, sadece küme içinden erişilebilen bir sanal IP adresi oluşturur.
apiVersion: v1
kind: Service
metadata:
name: my-clusterip-service
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 8080
Yukarıdaki YAML tanımında, my-clusterip-service
adlı bir ClusterIP Servisi oluşturulmuştur. Bu Servis, Kubernetes kümesi içinde yalnızca diğer Pod’lar tarafından erişilebilir.
2.2. NodePort Servisi
NodePort
, Kubernetes kümesinin dışından bir Pod’a erişim sağlamanın en basit yoludur. Bu Servis, her Node’da belirli bir port açar ve bu porta gelen trafiği ilgili Pod’lara iletir.
apiVersion: v1
kind: Service
metadata:
name: my-nodeport-service
spec:
type: NodePort
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 8080
nodePort: 30007
Yukarıdaki YAML tanımında, my-nodeport-service
adlı bir NodePort Servisi oluşturulmuştur. Bu Servis, Node’un 30007 portunu kullanarak gelen trafiği 80 portu üzerinden ilgili Pod’a yönlendirir.
2.3. LoadBalancer Servisi
LoadBalancer
, dış dünyadan Kubernetes kümesi içinde çalışan uygulamalara erişim sağlamak için kullanılan bir Servis türüdür. Bu Servis, bulut sağlayıcılarıyla entegre çalışarak bir yük dengeleyici oluşturur.
apiVersion: v1
kind: Service
metadata:
name: my-loadbalancer-service
spec:
type: LoadBalancer
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 8080
Bu tanım, my-loadbalancer-service
adlı bir LoadBalancer Servisi oluşturur ve bu Servis, Kubernetes kümesine dış dünyadan gelen trafiği yönetir.
3. Ingress ile Port Yönlendirme
Ingress, Kubernetes’te dış dünyadan gelen HTTP(S) trafiğini yönetmek için kullanılan bir kaynak türüdür. Ingress, genellikle birden fazla Servis’i tek bir giriş noktasından yönetmek için kullanılır.
3.1. Ingress Tanımı
Bir Ingress kaynağı tanımlamak, dış dünyadan belirli yollar (path) veya alan adları (host) üzerinden gelen trafiği Kubernetes içindeki Servis’lere yönlendirmeyi sağlar.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
spec:
rules:
- host: myapp.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-service
port:
number: 80
Bu örnekte, myapp.example.com
alan adına gelen tüm trafiğin my-service
adlı Servis’e yönlendirilmesi sağlanır.
3.2. Ingress Kontrolcüsü
Ingress kaynaklarının çalışabilmesi için bir Ingress Kontrolcüsü gereklidir. NGINX, Traefik ve HAProxy gibi popüler Ingress kontrolcülerini kullanarak trafiği yönlendirebilirsiniz.
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml
Bu komut, NGINX Ingress Kontrolcüsünü Kubernetes kümenize yükler ve yönetir.
4. İleri Düzey Port Yönlendirme
4.1. IP Whitelisting (Beyaz Liste)
Bazı durumlarda, belirli IP adreslerinden gelen trafiği kabul etmek isteyebilirsiniz. Bu durumda, Ingress veya Servis kaynaklarında IP whitelisting kullanarak sadece belirli IP adreslerinden gelen trafiğe izin verebilirsiniz.
4.2. TLS/SSL Termination
Ingress ile SSL/TLS sonlandırma yaparak trafiğinizi şifreleyebilirsiniz. Bu, özellikle güvenli bir şekilde veri aktarımı yapmak istediğiniz durumlarda önemlidir.
Kubernetes üzerinde port yönlendirme, uygulamalarınızın erişilebilirliğini ve güvenliğini yönetmenin kritik bir parçasıdır. Bu makalede, kubectl port-forward
, Kubernetes Servisleri ve Ingress gibi çeşitli yöntemlerle port yönlendirme işlemlerinin nasıl gerçekleştirileceğini inceledik. Kubernetes ortamında port yönlendirme işlemlerini doğru bir şekilde yapılandırarak, uygulamalarınızın hem içeriden hem de dışarıdan erişilebilirliğini sağlarken güvenliğini de kontrol altına alabilirsiniz.