Yandex Cloud
  • Сервисы
  • Решения
  • Почему Yandex Cloud
  • Сообщество
  • Тарифы
  • Документация
  • Связаться с нами
Подключиться
Language / Region
Проект Яндекса
© 2023 ООО «Яндекс.Облако»
Yandex Managed Service for Kubernetes
  • Сопоставление с другими сервисами Yandex Cloud
  • Начало работы
  • Пошаговые инструкции
  • Практические руководства
    • Все руководства
    • Создание нового Kubernetes-проекта в Yandex Cloud
    • Интеграция с Container Registry
    • Подпись и проверка Docker-образов Container Registry
    • Сканирование уязвимостей Container Registry при непрерывном развертывании приложений с помощью GitLab
    • Запуск рабочих нагрузок с GPU
    • Установка Ingress-контроллера NGINX с Let's Encrypt®
    • Установка Ingress-контроллера NGINX с сертификатом из Certificate Manager
    • Резервное копирование в Object Storage
    • Горизонтальное масштабирование приложения в кластере
    • Вертикальное масштабирование приложения в кластере
    • Развертывание и нагрузочное тестирование gRPC-сервиса с масштабированием
    • Работа со снапшотами
    • Интеграция с корпоративной зоной DNS
    • Автоматическое масштабирование DNS по размеру кластера
    • Настройка локального кеширования DNS
    • Проверка DNS Challenge для сертификатов Let's Encrypt®
    • Мониторинг кластера с помощью Prometheus и Grafana
    • Непрерывное развертывание контейнеризованных приложений с помощью GitLab
    • Изменение параметров сервера метрик (Metrics Server)
    • Использование продуктов Cloud Marketplace
      • Интеграция с Argo CD
      • Интеграция с Crossplane
      • Синхронизация с секретами Yandex Lockbox
      • Настройка Fluent Bit для работы с Cloud Logging
      • Настройка Gateway API
      • Настройка Application Load Balancer Ingress-контроллера
      • Использование Jaeger для трассировки запросов в Managed Service for YDB
      • Настройка Kyverno & Kyverno Policies
      • Использование Metrics Provider для трансляции метрик
  • Концепции
  • Управление доступом
  • Правила тарификации
  • Справочник API
  • Вопросы и ответы
  1. Практические руководства
  2. Использование продуктов Cloud Marketplace
  3. Настройка Application Load Balancer Ingress-контроллера

Настройка Ingress-контроллера Application Load Balancer

Статья создана
Yandex Cloud
  • Перед началом работы
  • Настройте Ingress-контроллер и тестовые приложения
  • Убедитесь в доступности приложений кластера Kubernetes через Application Load Balancer
  • Удалите созданные ресурсы

Сервис Yandex Application Load Balancer используется для балансировки нагрузки и распределения трафика между приложениями. Чтобы с его помощью управлять трафиком к приложениям, запущенным в кластере Managed Service for Kubernetes, необходим Ingress-контроллер.

Чтобы настроить доступ к запущенным в кластере приложениям через Application Load Balancer:

  1. Настройте Ingress-контроллер и тестовые приложения.
  2. Убедитесь в доступности приложений кластера Kubernetes через Application Load Balancer.

Перед началом работы

  1. Зарегистрируйте публичную доменную зону и делегируйте домен.

  2. Если у вас уже есть сертификат для доменной зоны, добавьте сведения о нем в сервис Yandex Certificate Manager. Или создайте новый сертификат от Let's Encrypt®.

  3. Создайте кластер Managed Service for Kubernetes с настройкой Публичный адрес: Автоматически.

  4. Создайте группу узлов любой подходящей конфигурации.

  5. Настройте группы безопасности кластера и группы узлов. Группа безопасности группы узлов должна разрешать входящие TCP-соединения к портам 10501 и 10502 из подсетей балансировщика или из его группы безопасности (позже подсети и группу нужно будет указать для создания Ingress-контроллера).

  6. Установите Ingress-контроллер Application Load Balancer.

  7. Убедитесь, что вы можете подключиться к кластеру с помощью kubectl:

    kubectl cluster-info
    

Настройте Ingress-контроллер и тестовые приложения

В качестве рабочей нагрузки Ingress-контроллера могут выступать сервисы Kubernetes, целевые группы Application Load Balancer или бакеты Yandex Object Storage.

Перед началом работы получите идентификатор добавленного ранее TLS-сертификата:

yc certificate-manager certificate list

Результат выполнения команды:

+-----------------+-------+----------------+---------------------+----------+--------+
|       ID        | NAME  |    DOMAINS     |      NOT AFTER      |   TYPE   | STATUS |
+-----------------+-------+----------------+---------------------+----------+--------+
| <идентификатор> | <имя> | <доменное имя> | 2022-01-06 17:19:37 | IMPORTED | ISSUED |
+-----------------+-------+----------------+---------------------+----------+--------+
Ingress-контроллер для сервисов Kubernetes
Ingress-контроллер для группы бэкендов
  1. В отдельной директории создайте файлы приложений demo-app-1.yaml и demo-app-2.yaml:

    demo-app1.yaml
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: alb-demo-1
    data:
      nginx.conf: |
        worker_processes auto;
        events {
        }
        http {
          server {
            listen 80 ;
            location = /_healthz {
              add_header Content-Type text/plain;
              return 200 'ok';
            }
            location / {
              add_header Content-Type text/plain;
              return 200 'Index';
            }
            location = /app1 {
              add_header Content-Type text/plain;
              return 200 'This is APP#1';
            }
          }
        }
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: alb-demo-1
      labels:
        app: alb-demo-1
        version: v1
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: alb-demo-1
      strategy:
        type: RollingUpdate
        rollingUpdate:
          maxSurge: 1
          maxUnavailable: 0
      template:
        metadata:
          labels:
            app: alb-demo-1
            version: v1
        spec:
          terminationGracePeriodSeconds: 5
          volumes:
            - name: alb-demo-1
              configMap:
                name: alb-demo-1
          containers:
            - name: alb-demo-1
              image: nginx:latest
              ports:
                - name: http
                  containerPort: 80
              livenessProbe:
                httpGet:
                  path: /_healthz
                  port: 80
                initialDelaySeconds: 3
                timeoutSeconds: 2
                failureThreshold: 2
              volumeMounts:
                - name: alb-demo-1
                  mountPath: /etc/nginx
                  readOnly: true
              resources:
                limits:
                  cpu: 250m
                  memory: 128Mi
                requests:
                  cpu: 100m
                  memory: 64Mi
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: alb-demo-1
    spec:
      selector:
        app: alb-demo-1
      type: NodePort
      ports:
        - name: http
          port: 80
          targetPort: 80
          protocol: TCP
          nodePort: 30081
    
    demo-app2.yaml
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: alb-demo-2
    data:
      nginx.conf: |
        worker_processes auto;
        events {
        }
        http {
          server {
            listen 80 ;
            location = /_healthz {
              add_header Content-Type text/plain;
              return 200 'ok';
            }
            location / {
              add_header Content-Type text/plain;
              return 200 'Add app#';
            }
            location = /app2 {
              add_header Content-Type text/plain;
              return 200 'This is APP#2';
            }
          }
        }
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: alb-demo-2
      labels:
        app: alb-demo-2
        version: v1
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: alb-demo-2
      strategy:
        type: RollingUpdate
        rollingUpdate:
          maxSurge: 1
          maxUnavailable: 0
      template:
        metadata:
          labels:
            app: alb-demo-2
            version: v1
        spec:
          terminationGracePeriodSeconds: 5
          volumes:
            - name: alb-demo-2
              configMap:
                name: alb-demo-2
          containers:
            - name: alb-demo-2
              image: nginx:latest
              ports:
                - name: http
                  containerPort: 80
              livenessProbe:
                httpGet:
                  path: /_healthz
                  port: 80
                initialDelaySeconds: 3
                timeoutSeconds: 2
                failureThreshold: 2
              volumeMounts:
                - name: alb-demo-2
                  mountPath: /etc/nginx
                  readOnly: true
              resources:
                limits:
                  cpu: 250m
                  memory: 128Mi
                requests:
                  cpu: 100m
                  memory: 64Mi
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: alb-demo-2
    spec:
      selector:
        app: alb-demo-2
      type: NodePort
      ports:
        - name: http
          port: 80
          targetPort: 80
          protocol: TCP
          nodePort: 30082
    
  2. В той же директории создайте файл ingress.yaml и укажите в нем делегированное ранее доменное имя, идентификатор сертификата и настройки для Application Load Balancer:

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: alb-demo-tls
      annotations:
        ingress.alb.yc.io/subnets: <список идентификаторов подсетей>
        ingress.alb.yc.io/security-groups: <список идентификаторов групп безопасности>
        ingress.alb.yc.io/external-ipv4-address: <auto или статический IP-адрес>
        ingress.alb.yc.io/group-name: <имя Ingress-группы>
    spec:
      tls:
        - hosts:
            - <доменное имя>
          secretName: yc-certmgr-cert-id-<идентификатор TLS-сертификата>
      rules:
        - host: <доменное имя>
          http:
            paths:
              - path: /app1
                pathType: Prefix
                backend:
                  service:
                    name: alb-demo-1
                    port:
                      number: 80
              - path: /app2
                pathType: Prefix
                backend:
                  service:
                    name: alb-demo-2
                    port:
                      number: 80
              - pathType: Prefix
                path: "/"
                backend:
                  service:
                    name: alb-demo-2
                    port:
                      name: http
    

    Где:

    • ingress.alb.yc.io/subnets — одна или несколько подсетей, с которыми будет работать Application Load Balancer.

    • ingress.alb.yc.io/security-groups — одна или несколько групп безопасности для Application Load Balancer. Если параметр не задан, используется группа безопасности по умолчанию. Хотя бы одна из групп безопасности должна разрешать исходящие TCP-соединения к портам 10501 и 10502 в подсети группы узлов или в ее группу безопасности.

    • ingress.alb.yc.io/external-ipv4-address — предоставление публичного доступа к Application Load Balancer из интернета. Укажите заранее полученный IP-адрес, либо установите значение auto, чтобы получить новый.

      Если вы указали значение auto, то при удалении Ingress-контроллера IP-адрес также будет удален из облака. Чтобы избежать этого, используйте имеющийся зарезервированный адрес.

    • ingress.alb.yc.io/group-name — объединение ресурсов Kubernetes Ingress в группы, каждая их которых обслуживается отдельным экземпляром Application Load Balancer. Укажите имя группы.

    (Опционально) Укажите дополнительные настройки контроллера:

    • ingress.alb.yc.io/internal-ipv4-address — предоставление внутреннего доступа к Application Load Balancer. Укажите внутренний IP-адрес, либо установите значение auto, чтобы получить IP-адрес автоматически.

      Примечание

      Вы можете одновременно использовать только один тип доступа к Application Load Balancer: ingress.alb.yc.io/external-ipv4-address или ingress.alb.yc.io/internal-ipv4-address.

    • ingress.alb.yc.io/internal-alb-subnet — подсеть для размещения внутреннего IP-адреса Application Load Balancer. Обязательный параметр, если выбран параметр ingress.alb.yc.io/internal-ipv4-address.

    • ingress.alb.yc.io/protocol — протокол соединений между балансировщиком и бэкендами:

      • http — HTTP/1.1. Значение по умолчанию.
      • http2 — HTTP/2.
      • grpc — gRPC.
    • ingress.alb.yc.io/transport-security — протокол шифрования соединений между балансировщиком и бэкендами:

      • tls — TLS без проверки сертификата.

      Если аннотация не указана, балансировщик соединяется с бэкендами без шифрования.

    • ingress.alb.yc.io/prefix-rewrite — замена пути на указанное значение.

    • ingress.alb.yc.io/upgrade-types — допустимые значения HTTP-заголовка Upgrade, например, websocket.

    • ingress.alb.yc.io/request-timeout — максимальный период, на который может быть установлено соединение.

    • ingress.alb.yc.io/idle-timeout — максимальный период, в течение которого соединение может простаивать без передачи данных.

      Значения для request-timeout и idle-timeout следует указывать с единицами измерения, например: 300ms, 1.5h. Допустимые единицы измерения:

      • ns — наносекунды.
      • us — микросекунды.
      • ms — миллисекунды.
      • s — секунды.
      • m — минуты.
      • h — часы.

      Примечание

      Настройки действуют только на хосты этого контроллера, но не на всю группу Ingress.

  3. Создайте Ingress-контроллер и приложения:

    kubectl apply -f .
    
  4. Дождитесь создания Ingress-контроллера и получения им публичного IP-адреса, это может занять несколько минут:

    kubectl get ingress alb-demo-tls
    

    Результат — непустое значение в поле ADDRESS для созданного Ingress-контроллера:

    NAME          CLASS   HOSTS           ADDRESS     PORTS    AGE
    alb-demo-tls  <none>  <доменное имя>  <IP-адрес>  80, 443  15h
    

    По конфигурации Ingress-контроллера будет автоматически развернут L7-балансировщик.

Для настройки группы бэкендов используйте CustomResourceDefinition HttpBackendGroup. В качестве бэкенда может выступать целевая группа Application Load Balancer или бакет Object Storage.

Чтобы настроить Application Load Balancer на работу с группой бэкендов:

  1. Создайте группу бэкендов с бакетом:

    1. Создайте публичный бакет в Object Storage.
    2. Настройте главную страницу сайта и страницу ошибки.
  2. Создайте конфигурационный файл приложения demo-app-1.yaml:

    demo-app1.yaml
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: alb-demo-1
    data:
      nginx.conf: |
        worker_processes auto;
        events {
        }
        http {
          server {
            listen 80 ;
            location = /_healthz {
              add_header Content-Type text/plain;
              return 200 'ok';
            }
            location / {
              add_header Content-Type text/plain;
              return 200 'Index';
            }
            location = /app1 {
              add_header Content-Type text/plain;
              return 200 'This is APP#1';
            }
          }
        }
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: alb-demo-1
      labels:
        app: alb-demo-1
        version: v1
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: alb-demo-1
      strategy:
        type: RollingUpdate
        rollingUpdate:
          maxSurge: 1
          maxUnavailable: 0
      template:
        metadata:
          labels:
            app: alb-demo-1
            version: v1
        spec:
          terminationGracePeriodSeconds: 5
          volumes:
            - name: alb-demo-1
              configMap:
                name: alb-demo-1
          containers:
            - name: alb-demo-1
              image: nginx:latest
              ports:
                - name: http
                  containerPort: 80
              livenessProbe:
                httpGet:
                  path: /_healthz
                  port: 80
                initialDelaySeconds: 3
                timeoutSeconds: 2
                failureThreshold: 2
              volumeMounts:
                - name: alb-demo-1
                  mountPath: /etc/nginx
                  readOnly: true
              resources:
                limits:
                  cpu: 250m
                  memory: 128Mi
                requests:
                  cpu: 100m
                  memory: 64Mi
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: alb-demo-1
    spec:
      selector:
        app: alb-demo-1
      type: NodePort
      ports:
        - name: http
          port: 80
          targetPort: 80
          protocol: TCP
          nodePort: 30081
    
  3. В отдельной директории создайте файл http-group.yaml, содержащий настройки объекта HttpBackendGroup:

    apiVersion: alb.yc.io/v1alpha1
    kind: HttpBackendGroup
    metadata:
      name: example-backend-group
    spec:
      backends: # Список бэкендов.
        - name: alb-demo-1
          weight: 70 # Относительный вес бэкенда при распределении трафика. Нагрузка будет распределяться пропорционально весам других бэкендов из группы. Укажите вес, даже если в группе один бэкенд.
          service:
             name: alb-demo-1
             port:
               number: 80
        - name: bucket-backend
          weight: 30
          storageBucket:
            name: <имя бакета>
    

    (Опционально) Укажите дополнительные настройки контроллера:

    • spec.backends.useHttp2 — режим использования протокола HTTP/2.
    • spec.backends.tls — сертификат удостоверяющего центра, которому балансировщик будет доверять при установке безопасного соединения с эндпоинтами бэкендов. Укажите содержимое сертификата в поле trustedCa в открытом виде.

    Подробнее см. в разделе Группы бэкендов.

  4. Создайте файл ingress-http.yaml и укажите в нем делегированное ранее доменное имя, идентификатор сертификата и настройки для Application Load Balancer:

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: alb-demo-tls
      annotations:
        ingress.alb.yc.io/subnets: <список идентификаторов подсетей> # Одна или несколько подсетей, с которыми будет работать Application Load Balancer.
        ingress.alb.yc.io/security-groups: <список идентификаторов групп безопасности> # Одна или несколько групп безопасности для Application Load Balancer. Если параметр не задан, используется группа безопасности по умолчанию.
        ingress.alb.yc.io/external-ipv4-address: <auto или статический IP-адрес> # Предоставление публичного доступа к Application Load Balancer из интернета. Укажите заранее полученный IP-адрес, либо установите значение `auto`, чтобы получить новый.
        ingress.alb.yc.io/group-name: <имя Ingress-группы> # Объединение ресурсов Kubernetes Ingress в группы, каждая их которых обслуживается отдельным экземпляром Application Load Balancer.
    spec:
      tls:
        - hosts:
          - <доменное имя>
          secretName: yc-certmgr-cert-id-<идентификатор TLS-сертификата>
      rules:
        - host: <доменное имя>
          http:
            paths:
              - path: /app1
                pathType: Exact
                backend:
                  resource:
                    apiGroup: alb.yc.io
                    kind: HttpBackendGroup
                    name: example-backend-group
    

    (Опционально) Укажите дополнительные настройки контроллера:

    • ingress.alb.yc.io/internal-ipv4-address — предоставление внутреннего доступа к Application Load Balancer. Укажите внутренний IP-адрес, либо установите значение auto, чтобы получить IP-адрес автоматически.

      Примечание

      Вы можете одновременно использовать только один тип доступа к Application Load Balancer: ingress.alb.yc.io/external-ipv4-address или ingress.alb.yc.io/internal-ipv4-address.

    • ingress.alb.yc.io/internal-alb-subnet — подсеть для размещения внутреннего IP-адреса Application Load Balancer. Обязательный параметр, если выбран параметр ingress.alb.yc.io/internal-ipv4-address.

    • ingress.alb.yc.io/protocol — протокол соединений между балансировщиком и бэкендами:

      • http — HTTP/1.1. Значение по умолчанию.
      • http2 — HTTP/2.
      • grpc — gRPC.
    • ingress.alb.yc.io/prefix-rewrite — замена пути на указанное значение.

    • ingress.alb.yc.io/upgrade-types — допустимые значения HTTP-заголовка Upgrade, например, websocket.

    • ingress.alb.yc.io/request-timeout — максимальный период, на который может быть установлено соединение.

    • ingress.alb.yc.io/idle-timeout — максимальный период, в течение которого соединение может простаивать без передачи данных.

      Значения для request-timeout и idle-timeout следует указывать с единицами измерения, например: 300ms, 1.5h. Допустимые единицы измерения:

      • ns — наносекунды.
      • us — микросекунды.
      • ms — миллисекунды.
      • s — секунды.
      • m — минуты.
      • h — часы.

    Примечание

    Настройки действуют только на хосты этого контроллера, но не на всю группу Ingress.

  5. Создайте Ingress-контроллер, объект HttpBackendGroup и приложение Kubernetes:

    kubectl apply -f .
    
  6. Дождитесь создания Ingress-контроллера и получения им публичного IP-адреса, это может занять несколько минут:

    kubectl get ingress alb-demo-tls
    

    Результат — непустое значение в поле ADDRESS для созданного Ingress-контроллера:

    NAME          CLASS   HOSTS           ADDRESS     PORTS    AGE
    alb-demo-tls  <none>  <доменное имя>  <IP-адрес>  80, 443  15h
    

    По конфигурации Ingress-контроллера будет автоматически развернут L7-балансировщик.

Убедитесь в доступности приложений кластера Kubernetes через Application Load Balancer

  1. Добавьте A-запись в зону вашего домена. В поле Значение укажите публичный IP-адрес Ingress-контроллера.

  2. Настройте группы безопасности балансировщика.

  3. Проверьте работу Application Load Balancer:

    Сервисы Kubernetes
    Группа бэкендов

    Откройте в браузере URI приложений:

    https://<ваш домен>/app1
    https://<ваш домен>/app2
    

    Убедитесь, что приложения доступны через Application Load Balancer и возвращают страницы с текстом This is APP#1 и This is APP#2 соответственно.

    Откройте в браузере URI приложения:

    https://<ваш домен>/app1
    

    Убедитесь, что целевые ресурсы доступны через Application Load Balancer.

Удалите созданные ресурсы

Некоторые ресурсы платные. Удалите ресурсы, которые вы больше не будете использовать, во избежание списания средств за них:

  1. Удалите кластер Managed Service for Kubernetes.
  2. Удалите целевые группы Application Load Balancer.
  3. Удалите бакет Object Storage.

Была ли статья полезна?

Language / Region
Проект Яндекса
© 2023 ООО «Яндекс.Облако»
В этой статье:
  • Перед началом работы
  • Настройте Ingress-контроллер и тестовые приложения
  • Убедитесь в доступности приложений кластера Kubernetes через Application Load Balancer
  • Удалите созданные ресурсы