Установка сетевого стека#

Установка NIGINX Ingress#

Установить через манифест:

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.10.1/deploy/static/provider/cloud/deploy.yaml

Проверить установку:

# Проверить ingress-nginx namespace
kubectl get pods -n ingress-nginx

# Проверить службы
kubectl get svc -n ingress-nginx

# Долждаться перехода подов в Running
kubectl wait --namespace ingress-nginx \
  --for=condition=ready pod \
  --selector=app.kubernetes.io/component=controller \
  --timeout=120s

Настройка firewalld#

Необходимо открыть порты:

# на ВСЕХ узлах (master и worker)
sudo firewall-cmd --permanent --add-port=80/tcp
sudo firewall-cmd --permanent --add-port=443/tcp
sudo firewall-cmd --permanent --add-port=10254/tcp  # NGINX Ingress controller metrics
sudo firewall-cmd --reload
sudo firewall-cmd --list-ports

Настройка внешнего адреса для Ingress#

Для кластера из одного узла подойдёт быстрый хак в виде команды:

kubectl patch svc ingress-nginx-controller -p '{"spec":{"externalIPs":["10.0.2.100"]}}' -n ingress-nginx

Представим, что у нас кластер с узлами:

kcs-master-node = 172.16.9.106 
kcs-node1 = 172.16.9.107 
kcs-node2 = 172.16.9.108 
kcs-node3 = 172.16.9.109

Для кластера из множества узлов метод выше не подойдёт, и есть 2 варианта.

Вариант 1 - NodePort#

Проверяем тип сервиса и патчим его:

kubectl get svc -n ingress-nginx

kubectl patch svc ingress-nginx-controller -n ingress-nginx -p '{"spec":{"type":"NodePort"}}'

Получаем номер порта:

kubectl get svc -n ingress-nginx ingress-nginx-controller -o jsonpath='{.spec.ports[0].nodePort}'

Увидим номер - 32000 или похожий.

Доступ к ingress теперь будет по IP узла и его по NodePort:

http://172.16.9.106:32000/my-service
http://172.16.9.107:32000/my-service
http://172.16.9.108:32000/my-service
http://172.16.9.109:32000/my-service

Далее, заводим все IP-адреса как A-записи в DNS, получаем общий адрес в дальнейшем, например, для консоли Kaspersky Container Security в таком виде: http://kcs.my-domain.local:32000/

Вариант 2 - Балансировка с MetalLB#

Установка MetalLB#

Создать namespace и через манифест поставить:

kubectl create namespace metallb-system

kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.12/config/manifests/metallb-native.yaml

Дождаться готовности metallb:

kubectl wait --namespace metallb-system \
  --for=condition=ready pod \
  --selector=app=metallb \
  --timeout=90s

Настроить множество адресов IP для балансировщика#

Необходим неиспользуемый набор адресов IP из внешней сети. Например:

cat <<EOF | kubectl apply -f -
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: first-pool
  namespace: metallb-system
spec:
  addresses:
  - 172.16.9.200-172.16.9.220  # свободный диапазон адресов
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: l2-advert
  namespace: metallb-system
spec:
  ipAddressPools:
  - first-pool
EOF

В минимуме взять хотя бы 2 адреса.

Поменять ingress controller на LoadBalancer#

Пропатчить контроллер:

kubectl patch svc ingress-nginx-controller -n ingress-nginx -p '{"spec":{"type":"LoadBalancer"}}'

# Получить EXTERNAL-IP:
kubectl get svc -n ingress-nginx ingress-nginx-controller -w