Интеграция Traefik с Yandex Cloud при помощи провайдера HTTP конфигурации
У 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
Полный пример можно посмотреть в репозитории.