Простой вход с хоста с microk8s?

Я хотел бы сделать две вещи с MicroK8:

  1. Направьте порты хост-машины (Ubuntu 18.04) 80/443 на Microk8s
  2. Используйте что-то вроде простого входа, определенного в документах 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 ... 

Следовательно, чтобы работать с большинством примеров в Интернете, вам необходимо либо

  1. Удалить--ingress-class=public аргумент, поэтому по умолчанию nginx
  2. Обновите аннотации, например 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

Что в итоге?

  1. Ошибка сети
  2. Ошибка 404 или 503
  3. Работает!!

Если сетевая ошибка, то вам понадобится 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 я наконец наткнулся на это обучающее видео, которое открыло мне глаза.

https://www.youtube.com/watch?v=xYiYIjlAgHY

Чтобы установить 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 работал "из коробки" благодаря самоподписанным сертификатам, автоматически генерируемым контроллером входящего трафика.

Другие вопросы по тегам