Использование cert-manager для управления сертификатами Let's Encrypt TLS и запуск нескольких реплик Traefik v2.
В моем предыдущем посте Быстрый старт с Traefik v2 на Kubernetes я рассмотрел быструю 5-минутную сквозную настройку Traefik, Let's Encrypt и Cloudflare для обработки HTTPS-запросов в Kubernetes. Хотя такая настройка с Traefik CRD удобна для автоматического создания и обновления сертификатов с помощью определений IngressRoute, она работает с одним экземпляром Traefik, что означает, что он не является высокодоступным. Другими словами, Traefik становится единственной точкой отказа для всего входящего трафика в ваш кластер.
В Traefik v1 была бета-поддержка для кластеризации / режима HA с использованием хранилища KV (например, Consul, etcd и т. Д.). Однако Traefik v2 удалил поддержку хранения сертификатов ACME / Let’s Encrypt в хранилище KV, сославшись на ошибки с алгоритмом консенсуса raft (# 4851, # 3487, # 5047, # 3833). Функция автоматического управления сертификатами перенесена в TraefikEE, в результате чего пользователи с открытым исходным кодом могут либо запускать версию без высокой доступности, либо реализовывать собственное решение для управления сертификатами.
Документация Traefik рекомендует использовать cert-manager в качестве контроллера сертификатов и отмечает ограниченную поддержку Ingress Route CRD:
К сожалению, при использовании Traefik Kubernetes CRD Provider Cert-Manager не может напрямую взаимодействовать с CRD, но наша команда работает над этим. Обходной путь - разрешить поставщику Kubernetes Ingress разрешить Cert-Manager создавать входящие объекты для выполнения задач. Обратите внимание, что для создания сертификатов через Cert-Manager по-прежнему требуется ручное вмешательство, но после создания Cert-Manager будет обновлять сертификат.
В этой статье рассказывается, как обойти это ограничение и запустить Traefik v2 в режиме высокой доступности в Kubernetes. Я буду использовать Cloudflare в качестве поставщика DNS и решателя задач ACME, но не стесняйтесь использовать любых других поставщиков, поддерживаемых Let's Encrypt.
Весь код также доступен на Github:
Предпосылки
- Кластер Kubernetes (например, GKE)
- Шлем v3
- DNS-провайдер (например, Cloudflare)
Установить Traefik
Мы развернем Traefik в traefik
пространстве имен:
$ kubectl create namespace traefik
Теперь давайте развернем Traefik с 3 репликами. Вы можете увидеть значения в traefik/traefik-values.yaml
:
$ helm repo add traefik https://containous.github.io/traefik-helm-chart
$ helm install -n traefik traefik traefik/traefik -f traefik/traefik-values.yaml
Подождите, пока появятся развертывания, и запишите IP-адрес балансировщика нагрузки.
Установить Cert-Manager
Cert-manager - это инструмент с открытым исходным кодом для автоматизации выдачи и обновления сертификатов TLS:
Мы установим его в пространстве имен cert-manager
:
$ kubectl create namespace cert-manager
Добавьте репозиторий Jetstack Helm и установите CRD:
$ helm install \
cert-manager jetstack/cert-manager \
--namespace cert-manager \
--version v0.16.0 \
--set installCRDs=true
Подождите, пока появятся все модули cert-manager:
$ kubectl get pods -n cert-manager -w
Развернуть приложение
Для демонстрации мы развернем приложение whoami
в пространстве имен default
(файлы развертывания, обслуживания и входящие файлы см. В разделе whoami
). Вы можете заменить его своим приложением или хорошо известной диаграммой Helm (например, Grafana, Kibana и т. Д.).
Замените whoami.example.com
своим полным доменным именем и разверните:
$ kubectl apply -f whoami
Создать сертификаты
Чтобы выпустить новые сертификаты, нам нужно сначала определить эмитента. В этом примере я буду использовать Cloudflare для типа ACME Issuer, используя промежуточный сервер Let’s Encrypt. Вы также можете найти другие поддерживаемые конфигурации (SelfSigned, CA, Vault, Venafi и External Issuer Types) в документации.
Настройте разделы email
и solvers
в certs/issuer.yaml
. Чтобы использовать Cloudflare в качестве решателя задач DNS01, сначала создайте новый токен API со следующими настройками:
Разрешения:
Zone - DNS - Edit
Zone - Zone - Read
Ресурсы зоны:
Include - All Zones
Установите токен как секрет Kubernetes:
$ kubectl create secret generic cloudflare-token --from-literal=dns-token=<my-api-token>
Наконец, настройте сертификат (измените commonName
, secretName
и dnsNames
по мере необходимости в certs/whoami-cert.yaml
) и разверните:
$ kubectl apply -f certs
Настроить DNS
Проверьте, был ли сгенерирован сертификат:
$ kubectl describe certificate whoami-cert
Вы также можете посмотреть журналы отладки Traefik, чтобы увидеть, как сертификат становится активным.
Наконец, укажите в DNS-записи IP-адрес балансировщика нагрузки, чтобы увидеть сайт с поддержкой TLS, поддерживаемый HA Traefik + cert-manager. При желании вы можете развернуть промежуточное ПО для перенаправления HTTPS для полноты.
Теперь у нас есть HA-развертывание Traefik на Kubernetes. Обратной стороной использования cert-manager является то, что теперь пользователь должен помнить о создании сертификата перед развертыванием IngressRoute, но достижение высокой доступности более важно в производственной среде, чтобы избежать простоев.