Простой вход с хоста с microk8s?
Я хотел бы сделать две вещи с MicroK8:
- Направьте порты хост-машины (Ubuntu 18.04) 80/443 на Microk8s
- Используйте что-то вроде простого входа, определенного в документах kubernetes.io.
Моя конечная цель - создать кластер Kubernetes с одним узлом, который находится на хосте Ubuntu, а затем использовать вход для маршрутизации различных доменов к соответствующим им модулям внутри службы.
Я пытался сделать это с Microk8 в течение последних нескольких дней, но не могу обернуть голову вокруг этого.
Лучшее, что я получил, - это использование MetalLB для создания балансировщика нагрузки. Но для этого мне потребовалось использовать бесплатный IP-адрес, доступный в моей локальной сети, а не IP-адрес хост-машины.
Я также включил
default-http-backend
и попытался экспортировать и редактировать эти файлы конфигурации безуспешно.
В качестве примера это будет работать на Minikube
как только входное добавление включено, этот пример показывает образ базового сервера Nginx на порту 80 на IP-адресе кластера:
# ingress-service.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-service
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
# - host: nginx.ioo
- http:
paths:
- path: /
backend:
serviceName: nginx-cluster-ip-service
servicePort: 80
# nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 1
selector:
matchLabels:
component: nginx
template:
metadata:
labels:
component: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
# nginx-cluster-ip-service
apiVersion: v1
kind: Service
metadata:
name: nginx-cluster-ip-service
spec:
type: ClusterIP
selector:
component: nginx
ports:
- port: 80
targetPort: 80
8 ответов
TL; DR
Обновите аннотацию, чтобы она была
Почему
Для MicroK8s v1.21 работает
microk8s enable ingress
Создаст
DaemonSet
называется
nginx-ingress-microk8s-controller
в
ingress
пространство имен.
Если вы проверите это, есть флаг для установки входного класса:
- args:
... omitted ...
- --ingress-class=public
... omitted ...
Следовательно, чтобы работать с большинством примеров в Интернете, вам необходимо либо
- Удалить
--ingress-class=public
аргумент, поэтому по умолчаниюnginx
- Обновите аннотации, например
kubernetes.io/ingress.class: nginx
бытьkubernetes.io/ingress.class: public
Если я вас правильно понял, есть несколько способов, на которые вы могли бы смотреть.
Одним из них будет MetalLB, о котором вы уже упоминали.
MetalLB предоставляет реализацию балансировщика сетевой нагрузки для кластеров Kubernetes, которые не работают на поддерживаемом облачном провайдере, что позволяет эффективно использовать службы LoadBalancer в любом кластере.
Вы можете прочитать подробную реализацию Чистое программное решение: MetalLB
Другим способом было бы через службу NodePort
Этот подход имеет несколько других ограничений, о которых следует знать:
- IP-адрес источника
Сервисы типа NodePort выполняют трансляцию исходного адреса по умолчанию. Это означает, что исходным IP-адресом HTTP-запроса всегда является IP-адрес узла Kubernetes, который получил запрос с точки зрения NGINX.
Вы также можете использовать хост-сеть
В настройках, где нет внешнего балансировщика нагрузки, но использование NodePorts недоступно, можно настроить
ingress-nginx
Модули для использования сети хоста, на котором они работают, вместо выделенного сетевого пространства имен. Преимущество этого подхода заключается в том, что контроллер NGINX Ingress может связывать порты 80 и 443 непосредственно с сетевыми интерфейсами узлов Kubernetes без дополнительной трансляции сети, навязываемой службами NodePort.
Вы также должны помнить, что если вы редактируете конфигурацию внутри POD
, он исчезнет, если Pod будет перезапущен или он выйдет из строя.
Я надеюсь, что это поможет вам определить, в какую сторону идти своей идеей.
Утверждение "Лучшее, что я получил до сих пор, это использование MetalLB для создания балансировщика нагрузки". неправильно. Вы должны использовать входной уровень для маршрутизации трафика хоста.
В среде с нуля вам необходимо настроить MetalLB для разрешения входящих подключений от хоста к k8s.
Для начала нам понадобится тест:
curl -H "Host: nginx.ioo" http://HOST_IP
Что в итоге?
- Ошибка сети
- Ошибка 404 или 503
- Работает!!
Если сетевая ошибка, то вам понадобится MetalLB
microk8s.enable metallb:$(curl ipinfo.io/ip)-$(curl ipinfo.io/ip)
Снова запустите тест.
Если ошибка сети, значит, у вас что-то не так. Проверьте подключение к хосту.
Если ошибка 404 (иногда 503), то вам нужно правило входа.
# ingress-service.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-service
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: nginx.ioo
- http:
paths:
- path: /
backend:
serviceName: nginx-cluster-ip-service
servicePort: 80
Последний тест. Он должен работать.
Теперь вы можете использовать входящий трафик для маршрутизации различных доменов к соответствующим модулям внутри службы.
При использовании Microk8s 1.21+ конфигурация Ingress должна выглядеть после запуска.
microk8s enable ingress
:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: frontend-ingress
spec:
rules:
- host: staging.resplendentdata.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: frontend-service
port:
number: 80
ingressClassName: public
При использовании LoadBalancer (также известного как Metallb) почти во всех документах отсутствует важный шаг:
Входной контроллер должен быть выставлен на металлический LoadBalancer.
kubectl expose deploy nginx-deployment --port 80 --type LoadBalancer
Это также можно сделать с помощью yaml, но его проще использовать cli.
После нескольких дней поисков в Google я наконец наткнулся на это обучающее видео, которое открыло мне глаза.
Чтобы установить nginx так, чтобы он работал с
ingressClass=nginx
использовать:
#https://kubernetes.github.io/ingress-nginx/deploy/
helm upgrade --install ingress-nginx ingress-nginx \
--repo https://kubernetes.github.io/ingress-nginx \
--namespace ingress-nginx --create-namespace
Если вам нужно публично предоставить сервис с HTTPS и аутентификацией, это может стать довольно сложным, поскольку вам нужно настроить а) вход, б) службу сертификатов TLS, то есть использовать Lets Encrypt, в) прокси-сервер аутентификации, г) реализовать авторизацию пользователя в вашем приложении..
Если ваш кластер K8S работает на сервере без общедоступного IP-адреса, это создает дополнительные сложности, поскольку вам необходимо проникнуть через NAT.
https://github.com/gwrun/tutorials/tree/main/k8s/pod демонстрирует, как безопасно предоставить службу k8s, работающую в кластере microk8s без общедоступного IP-адреса, как общедоступный HTTPS с аутентификацией и авторизацией OAuth, используя в качестве примера панель управления Kubernetes. служба.
Изменение
ingress.class
из
nginx
к
public
предложенного здесь и настройки записи DNS (с помощью консоли моего внешнего провайдера) из
*
на мой общедоступный IP-адрес (а не имя хоста) были двумя достаточными условиями для репликации в стиле Openshift
route
(также известный как «виртуальный хостинг на основе имени») под
microk8s
установлен на металле.
- Больше информации
Балансировка нагрузки между всеми репликами подов работает нормально, несмотря на то, что MetalLB не установлен (как видно из выходных данных
gcr.io/google-samples/hello-app
). Даже HTTPS работал "из коробки" благодаря самоподписанным сертификатам, автоматически генерируемым контроллером входящего трафика.