Использование 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, но достижение высокой доступности более важно в производственной среде, чтобы избежать простоев.