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-сервере):

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

