Настройка Ingress-контроллера Application Load Balancer
Сервис Yandex Application Load Balancer используется для балансировки нагрузки и распределения трафика между приложениями. Чтобы с его помощью управлять трафиком к приложениям, запущенным в кластере Managed Service for Kubernetes, необходим Ingress-контроллер.
Чтобы настроить доступ к запущенным в кластере приложениям через Application Load Balancer:
- Настройте Ingress-контроллер и тестовые приложения.
- Убедитесь в доступности приложений кластера Kubernetes через Application Load Balancer.
Перед началом работы
-
Зарегистрируйте публичную доменную зону и делегируйте домен.
-
Если у вас уже есть сертификат для доменной зоны, добавьте сведения о нем в сервис Yandex Certificate Manager. Или создайте новый сертификат от Let's Encrypt®.
-
Создайте кластер Managed Service for Kubernetes с настройкой Публичный адрес:
Автоматически
. -
Создайте группу узлов любой подходящей конфигурации.
-
Настройте группы безопасности кластера и группы узлов. Группа безопасности группы узлов должна разрешать входящие TCP-соединения к портам 10501 и 10502 из подсетей балансировщика или из его группы безопасности (позже подсети и группу нужно будет указать для создания Ingress-контроллера).
-
Убедитесь, что вы можете подключиться к кластеру с помощью
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 |
+-----------------+-------+----------------+---------------------+----------+--------+
-
В отдельной директории создайте файлы приложений
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.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.
-
-
Создайте 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.