Nginx Ingress Controller в Kubernetes

Nginx Ingress Controller в Kubernetes


Nginx Ingress Controller — это реализация контроллера входящего трафика (Ingress) для Nginx. Он умеет балансировать нагрузку не только на HTTP, но и на WebSocket, gRPC, TCP и UDP-приложения. Помимо этого он поддерживает стандартные возможности Ingress. Например маршрутизацию на основе контента и завершение TLS/SSL-соединений. Некоторые функции Nginx доступны как расширения к Ingress через аннотации и ресурс ConfigMap.

Кроме реализации Ingress, контроллер Nginx также поддерживает ресурсы VirtualServer и VirtualServerRoute. С ними можно например делить трафик между сервисами и задавать более сложные правила маршрутизации. Также доступна балансировка TCP, UDP и TLS Passthrough через ресурс TransportServer.

Общая схема с использованием Nginx Ingress выглядит примерно так:

Развернём свой небольшой стенд для экспериментов с ним.

Адреса control-plane и worker-нод:

  • 192.168.56.115
  • 192.168.56.116
  • 192.168.56.117

Адрес HAProxy, работающего как балансировщик:

  • 192.168.56.118

Ноды Kubernetes-кластера:

1) Устанавливаем Nginx Ingress Controller из nginx-ingress:

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.1.3/deploy/static/provider/baremetal/deploy.yaml
kubectl get all - namespace=ingress-nginx

Ingress-Nginx запущен (в нашем случае порт ingress — 30798):

2) На нодах, где будут находиться POD’ы (в нашем случае это node1 и node2) настроим директорию и раздадим соответствующие права:

DIRNAME="vol1"
mkdir -p /mnt/disk/$DIRNAME 
chcon -Rt svirt_sandbox_file_t /mnt/disk/$DIRNAME
chmod 777 /mnt/disk/$DIRNAME

3) Разворачиваем StorageClass, PV и PVC:

kubectl apply -f storageClass.yaml
kubectl apply -f persistentVolume.yaml
kubectl apply -f persistentVolume1.yaml
kubectl apply -f persistentVolumeClaim.yaml
kubectl apply -f persistentVolumeClaim1.yaml

4) Запускаем веб-приложения:

kubectl apply -f http-pod.yaml
kubectl apply -f http-pod1.yaml

Чтобы проверить, что всё работает — получаем IP пода и делаем запрос:

POD_IP=$(kubectl get pod www2-c5644ff98-trk4d -o yaml | grep podIP | awk '{print $2}'); echo $POD_IP
curl $POD_IP

5) Разворачиваем сервисы:

kubectl apply -f IngressService.yaml
kubectl apply -f IngressService1.yaml
 

6) Разворачиваем сам Ingress:

kubectl apply -f Ingress.yaml

Кстати говоря вы также можете защитить Nginx-ingress, используя Securing Nginx-ingress.

7) Конфигурация HAProxy как балансировщика (на 192.168.56.118):

sudo nano /etc/haproxy/haproxy.cfg 

8) DNS-запись (на DNS-сервере):

Image description

Итоговый результат:


Report Page