Создание Ingress

Правила Ingress (Kubernetes Ingress) открывают HTTP/HTTPS маршруты снаружи кластера для внутренней маршрутизации (Kubernetes Service), что позволяет контролировать внешний доступ к вычислительным компонентам.

Создайте Ingress для управления внешним HTTP/HTTPS доступом к Service.

WARNING

При создании нескольких ingress в одном и том же namespace разные ingress НЕ ДОЛЖНЫ иметь одинаковые Domain, Protocol и Path (то есть дублирование точек доступа не допускается).

Содержание

Метод реализации

Правила Ingress зависят от реализации Ingress Controller, который отвечает за отслеживание изменений в Ingress и Service. После создания нового правила Ingress внутри Ingress Controller автоматически создаётся правило переадресации, соответствующее правилу Ingress. Когда Ingress Controller получает запрос, он сопоставляет правило переадресации с правилом Ingress и распределяет трафик по указанным внутренним маршрутам, как показано на схеме ниже.

NOTE

Для протокола HTTP Ingress поддерживает только порт 80 в качестве внешнего порта. Для протокола HTTPS Ingress поддерживает только порт 443 в качестве внешнего порта. Балансировщик нагрузки платформы автоматически добавит порты 80 и 443 для прослушивания.

Быстрый старт

Далее мы используем community-версию Ingress-NGINX, чтобы продемонстрировать, как получить доступ к вашему приложению с помощью контроллера NGINX.

  1. Разверните контроллер Ingress-NGINX.

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

    После выполнения этой команды автоматически создаются следующие ресурсы:

    ВидИмяОписание
    Namespaceingress-nginxРесурсы для изоляции контроллеров
    ServiceAccountingress-nginxСервисный аккаунт для контроллера
    ClusterRoleingress-nginxРазрешения на уровне кластера
    ClusterRoleBindingingress-nginxПривязка ClusterRole к SA
    ConfigMapingress-nginx-controllerНастройка поведения контроллера (например, уровни логирования, таймаут прокси и т.д.)
    ValidatingWebhookConfigingress-nginx-admissionВебхук для проверки легитимности конфигурации Ingress (опционально)
    Service (TCP/UDP)ingress-nginx-controllerТип по умолчанию LoadBalancer, можно изменить на NodePort.
    Deploymentingress-nginx-controller
    Podingress-nginx-controller-xxx
    Role/RoleBindingсвязанные с admissionПоддержка вебхука
    Jobingress-nginx-admission-createРегистрация вебхука

    Если вы хотите изменить адрес реестра по умолчанию, можно скачать YAML-файл с помощью curl, изменить его и затем применить.

    curl -O https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.12.2/deploy/static/provider/cloud/deploy.yaml

    Ожидайте запуска Pod ingress-nginx-controller-xxx.

  2. Локальное тестирование

    • Создайте простой веб-сервер и связанный с ним сервис:

      kubectl create deployment demo --image=nginx --port=80
      kubectl expose deployment demo
    • Создайте ресурс ingress. В этом примере используется хост, который сопоставляется с localhost:

      kubectl create ingress demo-localhost --class=nginx \
        --rule="demo.local/*=demo:80"
    • Пробросьте локальный порт к контроллеру ingress:

      kubectl port-forward --namespace=ingress-nginx service/ingress-nginx-controller 8080:80
    • Получите доступ к вашему развертыванию с помощью curl:

      curl --resolve demo.local:8080:127.0.0.1 http://demo.local:8080

      Примечание: Этот параметр временно разрешает доменное имя demo.local в IP 127.0.0.1 и используется на порту 8080. При посещении http://demo.local:8080 вы фактически посещаете http://127.0.0.1:8080 . С другой стороны, следует настроить hosts:

      echo "127.0.0.1 demo.local" | sudo tee -a /etc/hosts

      В итоге вы должны увидеть HTML-ответ с текстом вроде "Welcome to nginx!".

      После этого вы можете получить доступ к сайту по адресу http://demo.local:8080/.

    INFO

    Тип по умолчанию для ingress-nginx-controllerLoadBalancer. Если поле EXTERNAL-IP показывает pending, это означает, что вашему Kubernetes кластеру не удалось создать балансировщик нагрузки.

    Если вы интегрируетесь с провайдером, который поддерживает указание IP-адресов балансировщика нагрузки для Service через (специфичные для провайдера) аннотации, рекомендуется использовать этот способ.

  3. Онлайн-тестирование

    Когда у вашего ingress-nginx-controller (Service типа LoadBalancer) появляется EXTERNAL-IP, вы можете создать ресурс ingress. В следующем примере предполагается, что вы настроили DNS-запись для www.developer.io:

    kubectl create ingress demo --class=nginx \
      --rule="www.developer.io/*=demo:80"

    Вы можете получить доступ к http://www.developer.io и увидеть тот же вывод.

Предварительные требования

  • В текущем namespace должен быть доступен Service.

  • Убедитесь у администратора, что для проекта, связанного с текущим namespace, выделено используемое доменное имя.

  • Для доступа к домену через HTTPS необходимо предварительно сохранить HTTPS-сертификат в виде TLS-секрета.

Пример Ingress:

# nginx-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-ingress
  namespace: k-1
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx
  rules:
    - host: demo.local
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: nginx-service
                port:
                  number: 80
  1. Для получения дополнительных настроек смотрите nginx-configuration.
  2. Используется контроллер ingress-nginx.
  3. Если вы хотите запускать ingress только локально, предварительно настройте hosts.

Создание Ingress через веб-консоль

  1. Зайдите в Container Platform.

  2. В левой навигационной панели выберите Network > Ingress.

  3. Нажмите Create Ingress.

  4. Используйте инструкции ниже для настройки параметров.

    ПараметрОписание
    Ingress ClassIngress может реализовываться разными контроллерами с разными именами IngressClass. Если на платформе доступно несколько ingress контроллеров, пользователь может выбрать нужный с помощью этого параметра.
    Domain NameХосты могут быть точными совпадениями (например, foo.bar.com) или шаблонами с подстановочными знаками (например, *.foo.com). Доступные доменные имена выделяются администратором платформы.
    CertificatesTLS-секрет или сертификаты, выделенные администратором платформы.
    Match Type и Path
    • Prefix: Совпадение по префиксу пути, например, /abcd совпадает с /abcd/efg или /abcde.
    • Exact: Совпадение по точному пути, например, /abcd.
    • Implementation specific: Если вы используете кастомный Ingress контроллер для управления правилами Ingress, можно позволить контроллеру решать самостоятельно.
    ServiceВнешний трафик будет перенаправлен на этот Service.
    Service PortУкажите порт Service, на который будет перенаправлен трафик.
  5. Нажмите Create.

Создание Ingress через CLI

kubectl apply -f nginx-ingress.yaml
NOTE

Если у ingress отсутствует Ingress Class, все ALB-инстансы, выделенные этому проекту, будут обрабатывать этот ingress.