Aws-cert-manager

Материал из noname.com.ua
Перейти к навигацииПерейти к поиску


Для Ingress требуется автоматически выписывать сертефикаты для доменов которые "Хостятся" на нем

Предварительные требования

Требуется доступ (ручной или автоматический) к управлению зоной DNS для того что бы направить нужные домены на соответвующий Ingress

Возможные варианты решения

  • Использовать независимое от cloud-провайдера решение, Let's encrypt.
    • В завимсимости от того где лежит DNS-зона и как ей можно управлять, может требовать или не требовать ручной правкии зоны.
    • В случае если зона хостится на AWS Route53 возможно применить например такую автоматизацию обновления зоны
    • К плюсам можно отнести то что решение будет работать на любом клауде, не привязано к провайдеру.
    • Список возможных Issuers досаточно широк (https://cert-manager.io/docs/configuration/issuers/), для тестирования можно например использовать локально развернутый Hashicorp Vault


  • Использовать сертефикаты от AWS (это пока не реализовано)

cert-manager

Для решения этой задачи существует cert-manager
Примерный принцип работы (насколько я его понимаю)

  • Установка в том чимсле создания Custom Resource Definition (далее CRD)
  • Cоздается ресусурс типа Issuer или ClusterIssuer — описывает, откуда брать сертификаты
    • Разница в том что Issuer доступен только внутри namespace, в моем случае когда все сертефикаты нужны для нескольких копий приложения ("окружений"), например dev.domain.tld, staging.domain.tld, qa.domain.tld нужно будет изменить ClusterIssuer на Issuer. Пока окружение одно это не важно, но как только их несколько то не хочется иметь один сертефикат на всех с длинным списком Altnames (но это требует проверки)
  • После создания Certificate-ресурса — cert-manager следит за ним и выполняет выпуск согласно настройкам ресурса, результат сохраняет в Secret

cert-manager автоматически:

  • делает HTTP или DNS-проверку чтобы подтвердить владение доменом (в этом случае HTTP так как у него нет доступа к управлению ресурсами зоны!) Как именно определено в поле solvers
  • получает сертификат от CA, определенного в поле acme
  • сохраняет в Secret в namespace (в случае с ClusterIssuer это namespace где запущен сам cert-manager
  • Мониторит и продлевает его до истечения срока действия.


Установка

2

apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata:

 annotations:
 creationTimestamp: "2025-06-01T11:56:58Z"
 generation: 1
 name: letsencrypt-http-cert-issuer
 resourceVersion: "329560"
 uid: 4256d660-aa83-418e-b6d4-a5b6051943f0

spec:

 acme:
   email: sirmax123@gmail.com
   privateKeySecretRef:
     name: letsencrypt-http
   server: https://acme-v02.api.letsencrypt.org/directory
   solvers:
   - http01:
       ingress:
         class: nginx

status:

 acme:
   lastPrivateKeyHash: uKB+SowPSRIAGsxpkCqlb9+ohZYVW+w88CW4yv8CG0w=
   lastRegisteredEmail: sirmax123@gmail.com
   uri: https://acme-v02.api.letsencrypt.org/acme/acct/2436037867
 conditions:
 - lastTransitionTime: "2025-06-01T11:56:58Z"
   message: The ACME account was registered with the ACME server
   observedGeneration: 1
   reason: ACMEAccountRegistered
   status: "True"
   type: Ready