Kubernetes — Nginx Ingress
Bu makalemde Ingress kavramından ve Kubernetes’de Nginx Ingress’in kurulumundan bahsedeceğim. Ajandamız aşağıdaki gibi olacak?
- Ingress nedir?
- Ingress tipleri nelerdir?
- Nginx ingress ile Azure Kubernetes Services’de örnek
Ingress uygulamalarımız için load balancing, SSL Termination, reverse proxy gibi özellikleri sunmaktadır. Ingress cluster içerisindeki services’leri dışarıya HTTP/HTTPS olarak açmamızı sağlıyor diyebiliriz.
Ingress Controller’lar ise bu Ingress’I gerçekleştirmemiz gerekli olan yazılımlardır genellikle load balancer çözümleri olan yazılımlardır.
Ingress Controller’lardan bazıları aşağıdaki gibidir;
- Nginx
- Azure Kubernetes Services — Application Gateway Ingress Controller
- AWS Application Load Balancer Ingress controller
- Contour
- Istio Ingress Traffic
- Traefik
Ingress oluşturmaya bakmadan önce ingress tiplerinden bahsedelim.
- Single Service Ingress: Service’imizi expose etmemizi sağlayan ingress tipidir.
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: test-ingress
spec:
backend:
serviceName: testsvc
servicePort: 80
Single Service ingress’a alternatif olarak podumuzu oluştururken de ingress tanımlayabiliriz. Örneğin aşağıdaki örnekte LoadBalancer tipinde bir service oluşturuyoruz.
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 9376
clusterIP: 10.0.171.239
type: LoadBalancer
status:
loadBalancer:
ingress:
- ip: 192.0.2.127
- Simple Fanout: Fanout configurasyonu tek IP adresinden birden fazla Service trafiği yönlendirmemizi sağlıyor, böylece load balancer sayımızı azaltmış oluyoruz.
Örneğin mywebsite.com’için mywebsite.com/reports ve mywebsite.com/users farklı farklı service’lere yönlendirmek istediğimizde aşağıdaki şekilde ingress oluşturabiliriz.
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: simple-fanout-example
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: mywebsite.com
http:
paths:
- path: /reports
backend:
serviceName: service1
servicePort: 8080
- path: /users
backend:
serviceName: service2
servicePort: 8080
- Name based virtual hosting: Birden fazla hostname’miz var ve aynı IP adrese gidiyorlar ve biz hostname’e göre gelen trafiği yönlendirmek istiyorsak kullanacağımız ingress tipidir.
Örneğin mywebsite.com ve myotherwebsite.com’un aynı ip’ye geldiğini ve hostname’e göre farklı farklı service’lere trafiği yönlendirelim.
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: name-virtual-host-ingress
spec:
rules:
- host: mywebsite.com
http:
paths:
- backend:
serviceName: service1
servicePort: 80
- host: myotherwebsite.com
http:
paths:
- backend:
serviceName: service2
servicePort: 80
- TLS: TLS private key ve sertifika kullanarak trafiği yönlendirebilirsiniz.
Ingress işlemleri için bir ingress controller seçmemiz gerekiyor. Bu makalemde nginx ile nasıl yapabileceğimizi inceleyeğiz. Bunun için öncelikle bir Secret oluşturmamız ve secret içerisinde tls.crt ve tls.key değerlerini tutmamız gerekiyor.
apiVersion: v1
kind: Secret
metadata:
name: testsecret-tls
namespace: default
data:
tls.crt: base64 encoded cert
tls.key: base64 encoded key
type: kubernetes.io/tls
Secret’I oluşturduktan sonra oluşturduğumuz ingress’in içerisine tls hostname ve secretName bilgilerini ekliyoruz.
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: tls-example-ingress
spec:
tls:
- hosts:
- sslexample.foo.com
secretName: testsecret-tls
rules:
- host: sslexample.foo.com
http:
paths:
- path: /
backend:
serviceName: service1
servicePort: 80
Öncellikle ingress-nginx’I kurmamız gerekiyor. Güncel kurulum bilgilerine https://kubernetes.github.io/ingress-nginx/deploy/ adresinden erişebilirsiniz. Helm ile nginx-ingress kurulumunu gerçekleştirebiliriz. Sonrasında ingress’in özelliklerini ve bunları nasıl kullanabileceğimizi inceleyeceğiz.
# Create a namespace for your ingress resources
kubectl create namespace ingress-basic
# Add the official stable repository
helm repo add stable https://kubernetes-charts.storage.googleapis.com/
# Use Helm to deploy an NGINX ingress controller
helm install nginx-ingress stable/nginx-ingress \
— namespace ingress-basic \
— set controller.replicaCount=2 \
— set controller.nodeSelector.”beta\.kubernetes\.io/os”=linux \
— set defaultBackend.nodeSelector.”beta\.kubernetes\.io/os”=linux