Kubernetes’te Ingress-NGINX ile TCP Portu Açmak

Kubernetes ortamında genellikle web servisleri (HTTP/HTTPS) için Ingress kullanılır. Ancak bazen, bir veritabanı ya da başka bir TCP servisinin de dış dünyaya açılması gerekir. Ingress-NGINX ile sadece HTTP/HTTPS değil, TCP ve UDP portlarını da expose edebilirsin.

Aşağıda, Ingress-NGINX ile bir TCP servisini dışarıya açmanın adımlarını bulacaksın.


1. Ingress-NGINX’in TCP/UDP Özelliği

Ingress-NGINX, kendi konfigürasyonu sayesinde istenen portları publish edebiliyor. Bunun için ConfigMap kullanıyorsun.

Örneğin; bir MySQL servisini (port 3306) dış dünyaya açmak istiyorsan:


2. Gerekli YAML Dosyası Oluştur

Önce Ingress-NGINX’in konfigürasyonunda TCP portlarını tanımlayan bir ConfigMap oluşturman gerekiyor:

apiVersion: v1
kind: ConfigMap
metadata:
  name: tcp-services
  namespace: ingress-nginx
data:
  "3306": "default/mysql-service:3306"
  • "3306": Dışarı açmak istediğin port.
  • default/mysql-service:3306: Hangi namespace’deki, hangi servise yönlenecek.
    (Burada “default” namespace’te, mysql-service adlı servisin 3306 portuna yönlendirme yapılacak.)

3. Ingress-NGINX Deployment’ına ConfigMap’i Tanımla

Ingress-NGINX deployment’ında ConfigMap yolunu belirlemen gerekiyor.
Eğer helm ile kurulum yaptıysan, genelde şöyle olur:

controller:
  extraArgs:
    tcp-services-configmap: "ingress-nginx/tcp-services"

Veya doğrudan Deployment’ta (arg olarak):

- --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services

4. Port Mapping

Ingress-NGINX’in deployment’ındaki Service tanımında ilgili portu da eklemelisin.
Genelde NGINX Controller’ın Service’i type: LoadBalancer’dır.

Service manifestinde örneğin:

apiVersion: v1
kind: Service
metadata:
  name: ingress-nginx-controller
  namespace: ingress-nginx
spec:
  type: LoadBalancer
  ports:
    - name: http
      port: 80
      targetPort: http
    - name: https
      port: 443
      targetPort: https
    - name: mysql
      port: 3306
      targetPort: 3306

5. Controller’ı Yeniden Başlat

ConfigMap’i ekledikten ve Service’e portu tanımladıktan sonra Ingress-NGINX Controller’ı restart etmen gerekebilir.
Küme yönetimine göre:

kubectl rollout restart deployment ingress-nginx-controller -n ingress-nginx

6. Dışarıdan Erişim

Artık cloud provider’ın (veya MetalLB’nin verdiği LoadBalancer IP) üzerinden, açtığın port ile (örneğin 3306) TCP bağlantısı kurabilirsin.

mysql -h <loadbalancer-ip> -P 3306 -u root -p

Ingress-NGINX ile sadece web trafiği değil, ihtiyacın olan diğer TCP servislerini de expose edebilirsin.
Küçük not: Üretimde bu tür port açma işlemlerinde güvenlik adımlarını unutma!

Daha fazla detay için Ingress-NGINX TCP/UDP User Guide adresine göz atabilirsin.