Установка сетевого стека#
Установка 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