cert-manager — это расширение для Kubernetes, которое автоматизирует выпуск и обновление сертификатов. Оно позволяет выпускать сертификаты от Let's Encrypt и других центров сертификации, а также использовать внутренние корневые сертификаты. cert-manager упрощает работу с сертификатами, автоматически продлевая их перед истечением срока действия и обеспечивая безопасное шифрование для сервисов в кластере. Он интегрируется с Ingress-контроллерами и поддерживает различные механизмы проверки домена. Это делает его удобным инструментом для автоматизации управления сертификатами в Kubernetes.
Для установки cert-manager откройте панель управления кластером, перейдите во вкладку «Дополнения» и выберите cert-manager.
В открывшемся мастере установки нажмите кнопку «Установить» и дождитесь завершения процесса.
Проверить корректность установки можно командой:
kubectl get pods -n cert-manager
Все поды в неймспейсе cert-manager
должны иметь статус «Running».
Чтобы cert-manager мог выпускать сертификаты, необходимо создать объект ClusterIssuer
, который будет управлять сертификатами на уровне всего кластера. Пример манифеста:
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
email: email@example.com
server: https://acme-v02.api.letsencrypt.org/directory
privateKeySecretRef:
name: letsencrypt-prod
solvers:
- http01:
ingress:
class: nginx
Здесь:
email
— ваша почта. Она необходима для создания сертификатов, на нее будут приходить уведомления от Let's Encrypt.
server
— адрес Let's Encrypt или другого центра сертификации.
privateKeySecretRef
— секрет, в котором хранится закрытый ключ.
solvers.http01.ingress.class
— метод подтверждения владения доменом через HTTP, в данном случае с использованием Ingress-контроллера nginx.
Если вы используете другой Ingress-контроллер, необходимо заменить nginx
на нужное значение, например, для Traefik:
solvers:
- http01:
ingress:
class: traefik
Рассмотрим использование cert-manager на примере ресурсов, описанных в статье про Nginx Ingress.
Если вы следовали той инструкции, у вас уже настроены:
Сервисы доступны по:
Теперь опишем ClusterIssuer
в файле cluster-issuer.yaml
:
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
email: email@example.com
server: https://acme-v02.api.letsencrypt.org/directory
privateKeySecretRef:
name: letsencrypt-prod
solvers:
- http01:
ingress:
class: nginx
Применим манифест:
kubectl apply -f cluster-issuer.yaml
Далее необходимо обновить манифест Ingress, добавив аннотацию для использования cert-manager и секцию tls
. Обновленный ingress.yaml
:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
namespace: ingress-example
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
rules:
- host: ingress1.example.com
http:
paths:
- path: /service1
pathType: Prefix
backend:
service:
name: service1
port:
number: 80
- path: /service2
pathType: Prefix
backend:
service:
name: service2
port:
number: 80
tls:
- hosts:
- ingress1.example.com
secretName: ingress-tls
Изменения:
Добавлена аннотация cert-manager.io/cluster-issuer: letsencrypt-prod
, указывающая cert-manager использовать созданный ClusterIssuer
.
Добавлена секция tls
, в которой указаны домены, для которых cert-manager должен выпустить сертификаты, и секрет ingress-tls
, где они будут храниться.
Применяем обновленный манифест:
kubectl apply -f ingress.yaml
Через некоторое время cert-manager выпустит сертификаты и сохранит их в секрете ingress-tls
. Проверить наличие сертификатов можно командой:
kubectl get secret ingress-tls -n ingress-example -o yaml
Если все прошло успешно, в секрете должны появиться tls.crt
и tls.key
.
Теперь можно проверить работу HTTPS:
curl -v https://ingress1.example.com/service1
Если запрос проходит без ошибок, значит, сертификаты успешно установлены, и сервисы работают по HTTPS.