Настройка логирования для L7-балансировщика Yandex Application Load Balancer с помощью Ingress-контроллера
Вы можете задать настройки логирования для L7-балансировщиков, созданных с помощью Ingress-контроллеров
Из этой статьи вы узнаете, как создать три L7-балансировщика с различными настройками логирования:
- Запись в лог-группу по умолчанию.
- Запись в пользовательскую лог-группу.
- Без записи логов.
Чтобы задать настройки для L7-балансировщиков:
- Создайте тестовое приложение.
- Создайте ресурсы Ingress.
- Задайте настройки для групп ресурсов Ingress.
- Проверьте результат.
Если созданные ресурсы вам больше не нужны, удалите их.
Перед началом работы
Подготовьте инфраструктуру
Если у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.
По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра --folder-name
или --folder-id
.
-
Создайте сервисные аккаунты для кластера Managed Service for Kubernetes:
-
Сервисный аккаунт для ресурсов с ролями
k8s.clusters.agent
иvpc.publicAdmin
на каталог, в котором создается кластер Managed Service for Kubernetes. -
Сервисный аккаунт для узлов с ролью container-registry.images.puller на каталог с реестром Docker-образов. От его имени узлы будут скачивать из реестра необходимые Docker-образы.
-
Сервисный аккаунт для работы Ingress-контроллера Application Load Balancer с ролями:
- alb.editor — для создания необходимых ресурсов.
- vpc.publicAdmin — для управления внешней связностью.
- certificate-manager.certificates.downloader — для работы с сертификатами, зарегистрированными в сервисе Yandex Certificate Manager.
- compute.viewer — для использования узлов кластера Managed Service for Kubernetes в целевых группах балансировщика.
Вы можете использовать один и тот же сервисный аккаунт для всех операций.
-
-
Создайте авторизованный ключ для сервисного аккаунта Ingress-контроллера в формате JSON и сохраните его в файл
key.json
:yc iam key create \ --service-account-name <имя_сервисного_аккаунта_для_Ingress-контроллера> \ --output key.json
Данные ключа необходимы для установки приложения ALB Ingress Controller.
-
Создайте группы безопасности для кластера Managed Service for Kubernetes и входящих в него групп узлов.
Также настройте группы безопасности, необходимые для работы Application Load Balancer.
Важно
От настройки групп безопасности зависит работоспособность и доступность кластера, а также запущенных в нем сервисов и приложений.
-
Создайте кластер Managed Service for Kubernetes. При создании задайте настройки:
- Укажите ранее созданные сервисный аккаунт для ресурсов и группы безопасности.
- Если вы планируете работать с кластером в пределах сети Yandex Cloud, выделять кластеру публичный IP-адрес не нужно. Для подключений извне предоставьте кластеру публичный адрес.
-
Создайте группу узлов. При создании задайте настройки:
- Укажите ранее созданные сервисный аккаунт для узлов и группы безопасности.
- Выделите публичный IP-адрес, чтобы предоставить группе узлов доступ в интернет и возможность скачивать Docker-образы и компоненты.
-
Если у вас еще нет Terraform, установите его.
-
Получите данные для аутентификации. Вы можете добавить их в переменные окружения или указать далее в файле с настройками провайдера.
-
Настройте и инициализируйте провайдер. Чтобы не создавать конфигурационный файл с настройками провайдера вручную, скачайте его
. -
Поместите конфигурационный файл в отдельную рабочую директорию и укажите значения параметров. Если данные для аутентификации не были добавлены в переменные окружения, укажите их в конфигурационном файле.
-
Скачайте в ту же рабочую директорию файл конфигурации k8s-and-registry-for-alb.tf
.В этом файле описаны:
-
Сеть.
-
Кластер Managed Service for Kubernetes.
-
Группы безопасности, которые содержат необходимые правила для кластера Managed Service for Kubernetes и входящих в него групп узлов.
Часть правил необходима для работы Application Load Balancer.
Важно
От настройки групп безопасности зависит работоспособность и доступность кластера, а также запущенных в нем сервисов и приложений.
-
Сервисный аккаунт для ресурсов и узлов Managed Service for Kubernetes.
-
Сервисный аккаунт для работы Ingress-контроллера Application Load Balancer.
-
Пользовательская лог-группа Cloud Logging.
-
Авторизованный ключ для сервисного аккаунта Ingress-контроллера.
-
Создание локального файла
key.json
с данными авторизованного ключа. Данные ключа необходимы для установки приложения ALB Ingress Controller.
-
-
Укажите в файле
k8s-and-registry-for-alb.tf
:- Идентификатор каталога.
- Версию Kubernetes для кластера и групп узлов Managed Service for Kubernetes.
- Имя сервисного аккаунта для ресурсов и узлов Kubernetes.
- Имя сервисного аккаунта для работы Ingress-контроллера Application Load Balancer.
- Имя пользовательской лог-группы Cloud Logging.
-
Проверьте корректность файлов конфигурации Terraform с помощью команды:
terraform validate
Если в файлах конфигурации есть ошибки, Terraform на них укажет.
-
Создайте необходимую инфраструктуру:
-
Выполните команду для просмотра планируемых изменений:
terraform plan
Если конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.
-
Если вас устраивают планируемые изменения, внесите их:
-
Выполните команду:
terraform apply
-
Подтвердите изменение ресурсов.
-
Дождитесь завершения операции.
-
В указанном каталоге будут созданы все требуемые ресурсы. Проверить появление ресурсов и их настройки можно в консоли управления
. -
Подготовьтесь к работе с кластером Managed Service for Kubernetes
-
Установите kubectl
и настройте его на работу с созданным кластером.Если для кластера не предоставлен публичный адрес и
kubectl
настроен через внутренний адрес кластера, выполняйте командыkubectl
на ВМ Yandex Cloud, находящейся в одной сети с кластером.
Зарегистрируйте доменную зону
Зарегистрируйте публичную доменную зону и делегируйте домен.
Установите Ingress-контроллер Application Load Balancer
Установите приложение ALB Ingress Controller согласно инструкции. При установке используйте данные ключа key.json
из раздела Подготовьте инфраструктуру.
Создайте тестовое приложение
Создайте объекты ConfigMap
-
Создайте файл приложения
app.yaml
:app.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
-
Создайте приложение:
kubectl apply -f app.yaml
Результат:
configmap/alb-demo-1 created deployment.apps/alb-demo-1 created service/alb-demo-1 created
Создайте ресурсы Ingress
Создайте три ресурса Ingress
-
Создайте файл
ingress.yaml
и укажите в нем настройки балансировщиков и доменное имя:apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: logs-demo-nondefault annotations: ingress.alb.yc.io/group-name: non-default ingress.alb.yc.io/subnets: <список_идентификаторов_подсетей> ingress.alb.yc.io/security-groups: <список_идентификаторов_групп_безопасности> ingress.alb.yc.io/group-settings-name: non-default-settings ingress.alb.yc.io/external-ipv4-address: auto spec: rules: - host: <доменное_имя> http: paths: - pathType: Prefix path: "/" backend: service: name: alb-demo-1 port: name: http --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: logs-demo-disabled annotations: ingress.alb.yc.io/group-name: logs-disabled ingress.alb.yc.io/subnets: <список_идентификаторов_подсетей> ingress.alb.yc.io/security-groups: <список_идентификаторов_групп_безопасности> ingress.alb.yc.io/group-settings-name: logs-disabled-settings ingress.alb.yc.io/external-ipv4-address: auto spec: rules: - host: <доменное_имя> http: paths: - pathType: Prefix path: "/" backend: service: name: alb-demo-1 port: name: http --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: logs-demo-default annotations: ingress.alb.yc.io/group-name: default ingress.alb.yc.io/subnets: <список_идентификаторов_подсетей> ingress.alb.yc.io/security-groups: <список_идентификаторов_групп_безопасности> ingress.alb.yc.io/external-ipv4-address: auto spec: rules: - host: <доменное_имя> http: paths: - pathType: Prefix path: "/" backend: service: name: alb-demo-1 port: name: http
Где:
-
ingress.alb.yc.io/group-name
— имя группы. Ресурсы Ingress объединяются в группы, каждая из которых обслуживается отдельным L7-балансировщиком Application Load Balancer. -
ingress.alb.yc.io/subnets
— одна или несколько подсетей, в которых будет расположен балансировщик. -
ingress.alb.yc.io/security-groups
— одна или несколько групп безопасности для балансировщика. Если параметр не задан, используется группа безопасности по умолчанию. -
ingress.alb.yc.io/external-ipv4-address
— предоставление публичного доступа к балансировщику из интернета. Укажите заранее полученный IP-адрес либо установите значениеauto
, чтобы получить новый.Если вы указали значение
auto
, то при удалении балансировщика из облака также будет удален его IP-адрес. Чтобы избежать этого, используйте имеющийся зарезервированный адрес. -
ingress.alb.yc.io/group-settings-name
— имя для настроек группы ресурсов Ingress, которые должны быть описаны в дополнительном ресурсеIngressGroupSettings
.
(Опционально) Укажите дополнительные настройки контроллеров.
Примечание
Перечисленные ниже настройки будут применены только к виртуальным хостам для ресурса Ingress, в котором заданы аннотации, соответствующие этим настройкам.
К виртуальным хостам остальных ресурсов Ingress в группе эти настройки применены не будут.
-
ingress.alb.yc.io/internal-ipv4-address
— предоставление внутреннего доступа к балансировщику. Укажите внутренний IP-адрес, либо установите значениеauto
, чтобы получить IP-адрес автоматически.Примечание
Вы можете одновременно использовать только один тип доступа к балансировщику:
ingress.alb.yc.io/external-ipv4-address
илиingress.alb.yc.io/internal-ipv4-address
. -
ingress.alb.yc.io/internal-alb-subnet
— подсеть, в которой нужно разместить балансировщик. Обязательный параметр, если выбран параметр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
— протокол шифрования соединений между балансировщиком и бэкендами.Важно
В ALB Ingress Controller версии 0.2.0 и позднее аннотация используется только в объекте Service.
Если указать аннотацию в ресурсах
Ingress
, где используется один сервис с одинаковыми настройками для групп бэкендов, аннотация применится корректно. Но такой механизм устарел, в дальнейшем он не будет поддерживаться.Допустимое значение:
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.
-
-
Создайте ресурсы Ingress:
kubectl apply -f ingress.yaml
Результат:
ingress.networking.k8s.io/logs-demo-nondefault created ingress.networking.k8s.io/logs-demo-disabled created ingress.networking.k8s.io/logs-demo-default created
По конфигурациям ресурсов Ingress будут автоматически развернуты три L7-балансировщика.
Задайте настройки для групп ресурсов Ingress
Создайте ресурс IngressGroupSettings
с настройками логирования для групп ресурсов Ingress:
non-default-settings
— запись в пользовательскую лог-группу, созданную ранее, с определенными правилами.logs-disabled-settings
— запись логов отключена.
Для записи в лог-группу по умолчанию настройки не указываются.
-
Создайте файл
settings.yaml
и укажите в нем идентификатор лог-группы:apiVersion: alb.yc.io/v1alpha1 kind: IngressGroupSettings metadata: name: non-default-settings logOptions: logGroupID: <идентификатор_пользовательской_лог-группы> discardRules: - discardPercent: 50 grpcCodes: - OK - CANCELLED - UNKNOWN - discardPercent: 67 httpCodeIntervals: - HTTP_1XX - discardPercent: 20 httpCodes: - 200 - 404 --- apiVersion: alb.yc.io/v1alpha1 kind: IngressGroupSettings metadata: name: logs-disabled-settings logOptions: disable: true
-
Создайте ресурсы:
kubectl apply -f settings.yaml
Результат:
ingressgroupsettings.alb.yc.io/non-default-settings created ingressgroupsettings.alb.yc.io/logs-disabled-settings created
Настройки, указанные в этих ресурсах, применятся к группам ресурсов Ingress в соответствии с аннотациями ingress.alb.yc.io/group-settings-name
, указанными для ресурсов Ingress.
Проверьте результат
Получите идентификаторы лог-групп для созданных L7-балансировщиков и убедитесь, что они соответствуют настройкам в файле settings.yaml
:
- Для одного балансировщика должна быть выбрана созданная пользовательская лог-группа с определенными правилами.
- Для другого — лог-группа по умолчанию.
- Для третьего запись логов должна быть отключена.
Удалите созданные ресурсы
Некоторые ресурсы платные. Чтобы за них не списывалась плата, удалите ресурсы, которые вы больше не будете использовать:
- Удалите кластер Managed Service for Kubernetes.
- Если вы зарезервировали для кластера публичный статический IP-адрес, удалите его.
- Удалите сервисные аккаунты.
- Удалите лог-группу.
-
В терминале перейдите в директорию с планом инфраструктуры.
Важно
Убедитесь, что в директории нет Terraform-манифестов с ресурсами, которые вы хотите сохранить. Terraform удаляет все ресурсы, которые были созданы с помощью манифестов в текущей директории.
-
Удалите ресурсы:
-
Выполните команду:
terraform destroy
-
Подтвердите удаление ресурсов и дождитесь завершения операции.
Все ресурсы, которые были описаны в Terraform-манифестах, будут удалены.
-