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

В этом руководстве Вы узнаете, как установить 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

