Перейти к основному содержимому

Интеграция Traefik с Yandex Cloud при помощи провайдера HTTP конфигурации

· 2 мин. чтения

У Application Load Balancer в Yandex Cloud есть крутая фича — интеграция с Certificate Manager. Это позволяет автоматически получать SSL сертификаты для ваших доменов, а также обновлять их. Но иногда ALB может быть слишком дорогим. В таком случае можно использовать Traefik в качестве reverse proxy и WAF. В этой статье я покажу как настроить Traefik в Yandex Cloud и добавить интеграцию с Certificate Manager.

Провайдеры конфигурации Traefik

Traefik поддерживает различные провайдеры конфигурации. Один из них — HTTP. Он позволяет загружать конфигурацию по HTTP. Это удобно, так как можно использовать любой сервис для хранения конфигурации. Нужно лишь поднять сервер, который будет отдавать конфигурацию в формате JSON в соответствии со схемой динамической конфигурации Traefik.

Пока нам из всей конфигурации пригодится только часть, которая отвечает за TLS сертификаты. Вот пример:

{
"tls": {
"certificates": [
{
"certFile": "pathOrContent",
"keyFile": "pathOrContent"
}
]
}
}

Certificate Manager

В Yandex Cloud есть Certificate Manager, который позволяет автоматизировать получение и обновление SSL сертификатов. Для этого нужно добавить домен в сервис и подтвердить владение им. После этого Certificate Manager автоматически получит сертификаты и будет обновлять их.

Интеграция Traefik с Certificate Manager

схема

Для интеграции Traefik с Certificate Manager нам понадобится сервер, который будет отдавать конфигурацию. Код сервера можно посмотреть в репозитории.

Сервер написан на Go и использует библиотеку Go SDK, чтобы получить содержимое сертификатов из Certificate Manager.

Этот сервер может быть запущен в Yandex Cloud внутри виртуальной машины. Удобнее всего использовать Container Optimized Solution — образ виртуальной машины, упрощающий запуск контейнеров при помощи Docker Compose.

version: '3.7'
services:
traefik:
container_name: traefik
image: ${TRAEFIK_IMAGE}
command:
- "--configFile=/etc/traefik/config-static.yaml"
ports:
- 443:443
- 8080:8080
- 80:80
volumes:
- /etc/traefik/config-static.yaml:/etc/traefik/config-static.yaml
- /etc/traefik/config-dynamic.yaml:/etc/traefik/config-dynamic.yaml
depends_on:
- yc-provider
logging:
driver: fluentd
options:
fluentd-address: localhost:24224
tag: traefik.logs
networks:
- backend

yc-provider:
container_name: yc-provider
image: ${SIDECAR_IMAGE}
environment:
CERTIFICATE_ID: ${CERTIFICATE_ID}
networks:
- backend

httpbin:
image: ${HTTPBIN_IMAGE}
environment:
- APP_NAME=httpbin
- MAX_BODY_SIZE=15728640 # 15 MiB
command: [ "/bin/go-httpbin", "-port", "8000" ]
networks:
- backend

fluentbit:
container_name: fluentbit
# You can find the latest version of the image here:
# https://github.com/yandex-cloud/fluent-bit-plugin-yandex/releases
image: cr.yandex/yc/fluent-bit-plugin-yandex:v2.1.1-fluent-bit-2.1.7
ports:
- 24224:24224
- 24224:24224/udp
restart: always
environment:
YC_GROUP_ID: ${YC_GROUP_ID}
volumes:
- /etc/fluentbit/fluentbit.conf:/fluent-bit/etc/fluent-bit.conf
- /etc/fluentbit/parsers.conf:/fluent-bit/etc/parsers.conf
networks:
- backend

networks:
backend:
driver: bridge

В этом примере используется Docker Compose для запуска четырех контейнеров:

  • Traefik — reverse proxy
  • HTTP Provider — сервер, который отдает конфигурацию
  • HTTP Bin — простой HTTP сервер для проверки работы Traefik
  • Fluent Bit — контейнер для сбора логов и отправки их в Yandex Cloud Logging

Полный пример можно посмотреть в репозитории.