Настройка Yandex Application Load Balancer Ingress-контроллера
- Перед началом работы
- Создайте пространство имен для Application Load Balancer Ingress-контроллера
- Установите Application Load Balancer Ingress-контроллер
- Создайте Ingress-контроллер и тестовые приложения
- Убедитесь в доступности приложений кластера Kubernetes через Application Load Balancer
- Удалите созданные ресурсы
Сервис Application Load Balancer используется для балансировки нагрузки и распределения трафика между приложениями. Чтобы с его помощью управлять трафиком к приложениям, запущенным в кластере Managed Service for Kubernetes, необходим Ingress-контроллер.
Чтобы настроить доступ к запущенным в кластере приложениям через Application Load Balancer:
- Создайте пространство имен для Application Load Balancer Ingress-контроллера.
- Установите Application Load Balancer Ingress-контроллер.
- Создайте Ingress-контроллер и тестовые приложения.
- Убедитесь в доступности приложений кластера Kubernetes через Application Load Balancer.
Перед началом работы
-
Если у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.
По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра
--folder-name
или--folder-id
. -
Создайте сервисный аккаунт, необходимый для работы Ingress-контроллера.
-
alb.editor
— для создания необходимых ресурсов.vpc.publicAdmin
— для управления внешней связностью.certificate-manager.certificates.downloader
— для работы с сертификатами, зарегистрированными в сервисе Yandex Certificate Manager.compute.viewer
— для использования узлов кластера Managed Service for Kubernetes в целевых группах балансировщика.
-
Создайте для него авторизованный ключ и сохраните в файл
sa-key.json
:yc iam key create \ --service-account-name <имя сервисного аккаунта для Ingress-контроллера> \ --output sa-key.json
-
-
Зарегистрируйте публичную доменную зону и делегируйте домен.
-
Если у вас уже есть сертификат для доменной зоны, добавьте сведения о нем в сервис Certificate Manager. Или создайте новый сертификат от Let's Encrypt®.
-
Создайте кластер Managed Service for Kubernetes с настройками:
- Версия Kubernetes: не ниже 1.19.
- Публичный адрес:
Автоматически
.
-
Создайте группу узлов любой подходящей конфигурации с версией Kubernetes не ниже 1.19.
-
Настройте группы безопасности кластера и группы узлов. Группа безопасности группы узлов должна разрешать входящие TCP-соединения к портам 10501 и 10502 из подсетей балансировщика или из его группы безопасности (позже подсети и группу нужно будет указать для создания Ingress-контроллера).
-
Установите менеджер пакетов Helm версии не ниже 3.7.0.
-
Установите kubectl и настройте его на работу с созданным кластером.
-
Убедитесь, что вы можете подключиться к кластеру с помощью
kubectl
:kubectl cluster-info
Создайте пространство имен для Application Load Balancer Ingress-контроллера
Чтобы создать пространство имен, выполните следующую команду:
kubectl create namespace yc-alb-ingress
Установите Application Load Balancer Ingress-контроллер
Для установки Helm-чарта с Ingress-контроллером выполните команды:
export HELM_EXPERIMENTAL_OCI=1 && \
cat sa-key.json | helm registry login cr.yandex --username 'json_key' --password-stdin && \
helm pull oci://cr.yandex/yc/yc-alb-ingress-controller-chart \
--version=v0.1.0 \
--untar && \
helm install \
--namespace yc-alb-ingress \
--set folderId=<идентификатор каталога> \
--set clusterId=<идентификатор кластера> \
--set-file saKeySecretKey=sa-key.json \
yc-alb-ingress-controller ./yc-alb-ingress-controller-chart/
Идентификатор кластера можно получить со списком кластеров в каталоге.
Создайте 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.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
, чтобы получить новый.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.
-
В том же каталоге создайте файлы приложений
demo-app-1.yaml
иdemo-app-2.yaml
:demo-app1.yamlapiVersion: 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.yamlapiVersion: 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
-
Создайте Ingress-контроллер и приложения:
kubectl apply -f .
-
Дождитесь создания 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 на работу с группой бэкендов:
-
Создайте группу бэкендов с бакетом:
-
Создайте конфигурационный файл приложения
demo-app-1.yaml
:demo-app1.yamlapiVersion: 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
-
В отдельном каталоге создайте файл
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
в открытом виде.
Подробнее см. в разделе Группы бэкендов.
-
Создайте файл
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.
-
-
Создайте Ingress-контроллер, объект
HttpBackendGroup
и приложение Kubernetes:kubectl apply -f .
-
Дождитесь создания 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
-
Добавьте A-запись в зону вашего домена. В поле Значение укажите публичный IP-адрес Ingress-контроллера.
-
Проверьте работу 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.
Удалите созданные ресурсы
Если созданные ресурсы вам больше не нужны, удалите их:
- Удалите кластер Managed Service for Kubernetes.
- Удалите целевые группы Application Load Balancer.
- Удалите бакет Object Storage.