• Русский
  • Создание 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.