bg-tutorials

Как установить SSL-сертификат ACME в Kubernetes

Установка SSL-сертификата ACME в Kubernetes теперь является стандартизированным и гибким процессом благодаря таким развитым инструментам, как cert-manager, и широкой поддержке со стороны коммерческих ЦС. Независимо от того, запускаете ли Вы производственные рабочие нагрузки за NGINX Ingress, Traefik или другим шлюзом, Вы можете автоматизировать безопасный HTTPS с полным контролем.

Установите ACME SSL на Kubernetes

В этом руководстве Вы узнаете, как установить SSL-сертификат ACME в Kubernetes с помощью cert-manager. Мы расскажем об установке, настройке эмитента с помощью External Account Binding (EAB) и выпуске сертификатов для защиты Ваших входящих сервисов.


Что Вам понадобится

Прежде чем погружаться, убедитесь в этом:

  • У Вас есть работающий кластер Kubernetes (рекомендуется v1.23+).
  • kubectl настроен и работает
  • У Вас есть доступ к Вашему ингресс-контроллеру (например, NGINX, Traefik).
  • Ваш домен указывает на публичный IP Вашего входящего контроллера
  • У Вас есть учетные данные EAB от совместимого с ACME центра сертификации:
    • URL-адрес каталога ACME (например, https://acme.example.com/v2/DV)
    • Идентификатор ключа EAB (KID)
    • Ключ EAB HMAC

Примечание: https://acme.example.com/v2/DV используется в данном руководстве в качестве URL-адреса каталога ACME. Замените его реальной конечной точкой из Вашего центра сертификации.


Шаг 1 — Установите cert-manager

cert-manager это наиболее широко используемый нативный клиент ACME для Kubernetes. Он работает как контроллер, который управляет выпуском и обновлением сертификатов.

Установите через Helm (предпочтительно для производства):

kubectl create namespace cert-manager
helm repo add jetstack https://charts.jetstack.io
helm repo update
helm install cert-manager jetstack/cert-manager \
--namespace cert-manager \
--version v1.14.4 \
--set installCRDs=true

Подождите несколько секунд и убедитесь, что все капсулы запущены:

kubectl get pods -n cert-manager

Вы должны увидеть три стручка: cert-manager, cert-manager-webhook и cert-manager-cainjector.


Шаг 2 — Создание секрета Kubernetes для учетных данных EAB

Создайте секрет Kubernetes для безопасного хранения Вашего ключа EAB:

kubectl create secret generic acme-eab-secret \
--namespace cert-manager \
--from-literal=eab-kid="YOUR_EAB_KID" \
--from-literal=eab-hmac-key="YOUR_EAB_HMAC_KEY"

Замените их своими настоящими учетными данными. Избегайте пробелов при копировании-вставке.


Шаг 3 — Определите ClusterIssuer или Issuer

Теперь создайте ресурс ClusterIssuer (для всех пространств имен) или Issuer (для одного пространства имен), который соединит cert-manager с Вашим ACME CA, используя учетные данные EAB.

Вот пример ClusterIssuer YAML:

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: acme-issuer
spec:
acme:
server: https://your.acme-server.com/v2/DV
email: [email protected]
privateKeySecretRef:
name: acme-private-key
externalAccountBinding:
keyID: YOUR_EAB_KID
keySecretRef:
name: acme-eab-secret
key: eab-hmac-key
solvers:
- http01:
ingress:
class: nginx

Примените его:

kubectl apply -f clusterissuer.yaml

Замените ingress.class: nginx на traefik, nginx-internal или любой другой класс Вашего ingress. Вы можете найти это в документации к Вашему контроллеру ingress.


Шаг 4 — Создание ресурса сертификата

Когда Ваш ClusterIssuer будет готов, создайте ресурс Certificate, который укажет cert-manager, какой домен необходимо защитить. Вот пример:

apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: my-ssl-cert
namespace: default
spec:
secretName: my-ssl-cert-tls
issuerRef:
name: acme-issuer
kind: ClusterIssuer
commonName: yourdomain.com
dnsNames:
- yourdomain.com
- www.yourdomain.com

Примените его:

kubectl apply -f certificate.yaml

cert-manager будет использовать эмитента, решать задачу через ingress и хранить выданный сертификат в качестве TLS-секрета Kubernetes.


Шаг 5 — Ссылка на сертификат в Вашем Ingress

Обновите правило входа, чтобы использовать созданный сертификат:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
namespace: default
annotations:
cert-manager.io/cluster-issuer: acme-issuer
spec:
tls:
- hosts:
- yourdomain.com
- www.yourdomain.com
secretName: my-ssl-cert-tls
rules:
- host: yourdomain.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: your-service
port:
number: 80

Примените его:

kubectl apply -f ingress.yaml

Как только cert-manager обнаружит аннотацию, он начнет решать задачу ACME и выдаст Ваш сертификат.


Шаг 6 — Проверка сертификата и автопродление

Чтобы убедиться, что все работает:

kubectl describe certificate my-ssl-cert

Ищите сертификат, выданный успешно.

Чтобы проверить настройку обновления, выполните команду:

kubectl get certificaterequests

cert-manager выполняет обновление автоматически за ~30 дней до истечения срока действия. Вы можете смоделировать обновление следующим образом:

kubectl cert-manager renew my-ssl-cert


Общие вопросы

Настройка ACME SSL в Kubernetes может показаться несколько абстрактной, особенно когда приходится жонглировать контроллерами входа, секретами и DNS-записями. Ниже мы ответим на некоторые распространенные вопросы, с которыми сталкиваются разработчики при установке сертификатов ACME в среде Kubernetes, независимо от того, используете ли Вы cert-manager или альтернативную настройку.

Могу ли я использовать DNS-01 вместо HTTP-01?

Да, cert-manager поддерживает проверку DNS с помощью таких провайдеров, как Cloudflare, AWS и Google Cloud DNS. Используйте ее, если Вы не открываете порт 80.

Готов ли cert-manager к производству?

Безусловно. Он обеспечивает SSL для больших кластеров Kubernetes на предприятиях и в публичных облаках.

Могу ли я использовать сертификат с подстановочным знаком с ACME в Kubernetes?

Да, но сертификаты wildcard требуют проверки DNS-01, что предполагает обновление записей DNS вместо использования HTTP-запросов. Убедитесь, что Ваш DNS-провайдер поддерживает автоматизацию (через API), и соответствующим образом настройте решатель dns01 в настройках cert-manager.

Заключительные слова

Теперь Вы знаете, как установить SSL-сертификат ACME в Kubernetes с помощью cert-manager и совместимого с ACME центра сертификации. Эта установка полностью автоматизирована и масштабируема для современных сред Kubernetes. Вы получите безопасный HTTPS, автообновление и бесшовную интеграцию с Ingress, и все это не покидая кластера.

Сэкономьте 10% на SSL-сертификатах при заказе сегодня!

Быстрая выдача, надежное шифрование, 99,99% доверия к браузеру, специализированная поддержка и 25-дневная гарантия возврата денег. Код купона: SAVE10

Детальное изображение дракона в полете
Написано

Опытный автор контента, специализирующийся на SSL-сертификатах. Превращает сложные темы кибербезопасности в понятный, увлекательный контент. Вносите свой вклад в повышение уровня цифровой безопасности с помощью впечатляющих рассказов.