Как установить Kubernetes Cert-Manager и настроить Let’s Encrypt
Cert-Manager автоматизирует предоставление сертификатов в кластерах Kubernetes. Он предоставляет набор настраиваемых ресурсов для выпуска сертификатов и их прикрепления к службам.
Одним из наиболее распространенных вариантов использования является защита веб-приложений и API-интерфейсов с помощью сертификатов SSL от Let’s Encrypt. Вот как добавить Cert-Manager в ваш кластер, настроить эмитента сертификата Let’s Encrypt и получить сертификат для модулей, открытых через Ingress.
Установка диспетчера сертификатов
Cert-Manager проще всего установить с помощью Helm. Helm — это менеджер пакетов Kubernetes, который позволяет добавлять приложения в кластер с помощью репозиториев готовых диаграмм. Убедитесь, что у вас установлен и настроен Helm с подключением к вашему кластеру Kubernetes.
Начните с добавления репозитория Jetstack в вашу установку Helm. Jetstack изначально разработал Cert-Manager, прежде чем он был передан в дар CNCF.
helm repo add jetstack https://charts.jetstack.io helm repo update
Теперь установите Cert-Manager в свой кластер:
helm install cert-manager jetstack/cert-manager --namespace cert-manager --create-namespace --version v1.5.3 --set installCRDs=true
Замените указанный выше номер версии последним выпуском, указанным в документации Cert-Manager.
Команда установит Cert-Manager в новое пространство имен Kubernetes с именем cert-manager
. Параметр installCRDs
добавит пользовательские ресурсы Kubernetes Cert-Manager во время установки. Это работает только с Helm версии 3.2 и новее — если вы используете более старую версию, вы должны вручную добавить определения ресурсов с помощью Kubectl:
kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.5.3/cert-manager.crds.yaml
Добавление плагина Kubectl
Cert-Manager имеет подключаемый модуль Kubectl, который упрощает некоторые распространенные задачи управления. Он также позволяет проверить, запущен ли Cert-Manager и готов ли он обслуживать запросы.
Установите плагин, загрузив его архив и распаковав его в правильный каталог:
curl -L -o kubectl-cert-manager.tar.gz https://github.com/jetstack/cert-manager/releases/latest/download/kubectl-cert_manager-linux-amd64.tar.gz tar xzf kubectl-cert-manager.tar.gz sudo mv kubectl-cert_manager /usr/local/bin
Теперь используйте плагин, чтобы проверить, работает ли ваша установка Cert-Manager:
kubectl cert-manager check api
Вы должны увидеть следующий вывод:
The cert-manager API is ready
Теперь вы готовы добавить эмитента для получения сертификатов от Let’s Encrypt.
Создание эмитента сертификата
Эмитенты и эмитенты кластера — это ресурсы, которые предоставляют сертификаты для вашего кластера. Базовая установка Cert-Manager, созданная до сих пор, не способна выдавать сертификаты. Добавление эмитента, настроенного на использование Let’s Encrypt, позволяет вам динамически получать новые сертификаты для служб в вашем кластере.
Создайте файл YAML в своем рабочем каталоге и назовите его issuer.yml
. Добавьте следующее содержимое:
apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata: name: letsencrypt-staging spec: acme: server: https://acme-staging-v02.api.letsencrypt.org/directory email: example@example.com privateKeySecretRef: name: letsencrypt-staging solvers: - http01: ingress: class: nginx
Вы должны заменить адрес электронной почты своим контактным адресом электронной почты. Это будет включено в ваши сертификаты. Let’s Encrypt также может отправить вам электронное письмо на указанный адрес, если ему необходимо отправить вам оповещение о ваших сертификатах.
Мы создаем ClusterIssuer
, так как они доступны для всех ресурсов в вашем кластере, независимо от пространства имен. Стандартный Issuer
— это ресурс с пространством имен, который может предоставлять сертификаты только в пределах своего собственного пространства имен.
Наша конфигурация эмитента указывает Cert-Manager получать сертификаты с промежуточного сервера Let’s Encrypt. Рекомендуется использовать промежуточную среду во время настройки интеграции, чтобы избежать строгих ограничений производительности Let’s Encrypt.
Используйте kubectl
, чтобы добавить эмитента в свой кластер:
kubectl create -f issuer.yml
Получение сертификата
Теперь вы можете использовать своего эмитента для получения сертификата для службы, предоставляемой через ресурс Ingress. Cert-Manager автоматически отслеживает ресурсы Ingress и создает сертификаты, используя конфигурацию в их поле tls
. Вам просто нужно добавить аннотацию с именем эмитента или эмитента кластера, который вы хотите использовать.
apiVersion: apps/v1 kind: Deployment metadata: name: my-app spec: replicas: 1 selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: containers: - name: my-app image: wordpress:latest ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: my-service spec: selector: app: my-app ports: port: 80 --- apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: my-ingress annotations: kubernetes.io/ingress.class: nginx cert-manager.io/cluster-issuer: letsencrypt-staging spec: rules: - host: example.com http: paths: - path: / backend: serviceName: my-service servicePort: 80 tls: - hosts: - example.com
Этот файл YAML определяет Pod, службу и Ingress, раскрывающие службу. Предполагается использование nginx-ingress
в качестве контроллера Ingress. Pod запускает контейнер WordPress, который будет доступен через HTTPS по адресу example.com
.
Наличие аннотации cert-manager.io/cluster-issuer
в ресурсе Ingress будет обнаружено Cert-Manager. Он будет использовать эмитент кластера letsencrypt-staging
, созданный ранее, для получения сертификата, охватывающего имена хостов, указанные в поле tls.hosts
Ingress.
Использование Let’s Encrypt в продакшене
После успешного получения промежуточного сертификата вы можете перейти на рабочие серверы Let’s Encrypt. Промежуточные сертификаты действительны, но браузеры им не доверяют, поэтому перед запуском сайта вам необходимо получить замену в производственной среде.
Лучше всего добавить отдельный эмитент кластера для рабочего сервера. Затем вы можете сослаться на соответствующего издателя в каждом из ваших ресурсов Ingress, в зависимости от того, готовы ли они к работе.
Скопируйте конфигурацию эмитента, показанную выше, и измените поля name
на letsencrypt-production
. Затем замените URL-адрес сервера значением, показанным ниже:
https://acme-v02.api.letsencrypt.org/directory
Создайте новый эмитент в своем кластере:
kubectl create -f issuer-production.yml
Обновите свой ресурс Ingress, чтобы запросить производственный сертификат, изменив значение аннотации cert-manager.io/cluster-issuer
на letsencrypt-production
(или имя, которое вы присвоили ваш собственный производственный эмитент). Используйте kubectl
, чтобы применить изменение:
kubectl apply -f my-ingress.yaml
Теперь у вас должен быть полностью включен HTTPS для вашего ресурса Ingress. Cert-Manager будет автоматически управлять вашими сертификатами и обновлять их до истечения срока их действия.
Обновление диспетчера сертификатов
Выпуски Cert-Manager обычно поддерживают обновления на месте с помощью Helm:
helm repo update
helm upgrade --version <new version> cert-manager jetstack/cert-manager
Сертификаты остаются доступными во время обновлений, но процесс обновления будет остановлен.
Несмотря на то, что обновления в настоящее время, как правило, просты, вы всегда должны просматривать примечания к выпуску, чтобы определить возможные изменения, которые необходимо внести. Это особенно важно, если вы обновляете Kubernetes или переходите с нескольких версий Cert-Manager. Если вы все еще используете более старую версию Kubernetes, возможно, вы используете устаревшую версию Cert-Manager, которая требует значительного ручного вмешательства для обновления.
Краткое содержание
Let’s Encrypt легко добавляется в кластер Kubernetes с помощью Cert-Manager. Вам нужно установить Cert-Manager с помощью Helm, создать эмитента, использующего Let’s Encrypt API, а затем сослаться на этого эмитента в своих ресурсах Ingress.
Вы можете предоставить Cert-Manager свою собственную конфигурацию для более продвинутых вариантов использования. Вы можете указать срок действия сертификата (используйте аннотацию cert-manager.io/duration
Ingress), вручную объявить общее имя сертификата (cert-manager.io/common-name
) и использовать вызовы DNS вместо HTTP. Последний вариант может быть полезен в определенных сценариях, например, когда вы хотите получить групповой сертификат.
Простое использование для защиты веб-приложений и API должно работать как есть с использованием ресурсов, показанных выше. Проверка HTTP работает, манипулируя контроллером Ingress для предоставления временного URL-адреса .well-known
, к которому Let’s Encrypt может получить доступ. Если ваш домен предоставляет правильное значение для этого URL-адреса, Let’s Encrypt считает, что вы контролируете ситуацию, и выдает сертификат.