Cert-manager#
Cert-manager - менеджер сертификатов DropApp. Cert-manager добавляет сертификаты и эмитенты сертификатов в качестве типов ресурсов в кластеры DropApp и упрощает процесс получения, обновления и использования этих сертификатов.
Cert-manager настраивается на выдачу сертификатов из различных поддерживаемых источников, включая Let’s Encrypt, HashiCorp Vault и Venafi, а также частные PKI.
Cert-manager поддерживает сертификаты в действительном и актуальном состоянии, выполняет обновление сертификатов в настроенное время до истечения срока их действия.
Источники сертификатов определяют, как Cert-manager будет запрашивать сертификаты TLS 1.2. По умолчанию источники сертификатов специфичны для каждого namespace DropApp. Добавьте флаг -n my-namespace к командам kubectl create, чтобы указать namespace, в котором должны быть созданы ресурсы. Также возможно заменить Issuers на ClusterIssuers. Ресурсы ClusterIssuer применяются ко всем ресурсам Ingress в кластере DropApp. Обновите аннотацию Ingress cert-manager.io/issuer до cert-manager.io/cluster-issuer.
Cert-manager предоставляет следующие инструменты:
cert-manager-acmesolver- компонент, который взаимодействует с ACME-серверами для автоматического получения сертификатов. Использует протокол ACME для связи с серверами, такими как Let’s Encrypt;cert-manager-cainjector- компонент, который автоматически добавляет сертификаты в контейнеры приложений. Внедряет их, чтобы использовать HTTPS для связи друг с другом;cert-manager-controller- компонент, который управляет жизненным циклом сертификатов в DropApp. Отслеживает состояние и автоматически обновляет их;cert-manager-ctl- утилита командной строки, которая позволяет управлять сертификатами и компонентами Cert-manager из командной строки. Предоставляет различные команды для создания, обновления и удаления сертификатов;cert-manager-webhook- компонент, который обрабатывает запросы на создание и обновление сертификатов. Проверяет запросы на соответствие правилам и политикам, установленным для сертификатов.
Эти компоненты работают вместе, чтобы обеспечить автоматическое управление сертификатами в DropApp с помощью Cert-manager.
Установка Cert-manager#
Для выполнения данного сценария необходимы права администратора.
Установите все компоненты Cert-manager:
kubectl apply -f https://<repoexample.ru>/cert-manager/cert-manager/releases/download/v1.14.4/cert-manager.yaml # Укажите актуальный путь до локального репозиторияПо умолчанию Cert-manager будет установлен в namespace
cert-manager.Можно запустить Cert-manager в другом namespace, для этого потребуется внести изменения в манифесты развертывания.
Убедитесь, что Cert-manager развернут правильно. Проверьте список запущенных pods в namespace:
kubectl get pods --namespace cert-managerВ namespace
cert-managerбудут созданы следующие ресурсы:NAME READY STATUS RESTARTS AGE cert-manager-5c6866597-zw7kh 1/1 Running 0 2m cert-manager-cainjector-577f6d9fd7-tr77l 1/1 Running 0 2m cert-manager-webhook-787858fcdb-nlzsq 1/1 Running 0 2m
Сценарий использования Cert-manager#
Настройка эмитента Let’s Encrypt#
В сценарии приведены настройки двух эмитентов для Let’s Encrypt: промежуточный и рабочий.
Примечание
Промежуточный эмитент приведен для целей тестирования. Сертификат промежуточного издателя не надежен.
Создайте локально файл
staging-issuer.yamlследующего содержания:apiVersion: cert-manager.io/v1 kind: Issuer metadata: name: letsencrypt-staging spec: acme: # URL-адрес сервера ACME server: https://acme-staging-v02.api.letsencrypt.org/directory # Адрес электронной почты, используемый для регистрации ACME email: user@example.com # Имя secret, используемого для хранения закрытого ключа учетной записи ACME privateKeySecretRef: name: letsencrypt-staging # Включить поставщика вызовов HTTP-01 solvers: - http01: ingress: ingressClassName: nginxПримените пользовательский ресурс:
kubectl create --edit -f https://<repoexample.ru>/cert-manager/website/master/content/docs/tutorials/acme/example/staging-issuer.yaml # Укажите актуальный путь до локального репозиторияВ результате будет создан ресурс
letsencrypt-staging.Создайте локальный файл
production-issuer.yamlследующего содержания:apiVersion: cert-manager.io/v1 kind: Issuer metadata: name: letsencrypt-prod spec: acme: # URL-адрес сервера ACME server: https://acme-v02.api.letsencrypt.org/directory # Адрес электронной почты, используемый для регистрации ACME email: user@example.com email: user@example.com # Имя secret, используемого для хранения закрытого ключа учетной записи ACME privateKeySecretRef: name: letsencrypt-prod # Включить поставщика вызовов HTTP-01 solvers: - http01: ingress: ingressClassName: nginxПримените пользовательский ресурс:
kubectl create --edit -f https://<repoexample.ru>/cert-manager/website/master/content/docs/tutorials/acme/example/staging-issuer.yaml # Укажите актуальный путь до локального репозиторияВ результате будет создан ресурс
letsencrypt-prod.Проверьте статус эмитента после его создания:
kubectl describe issuer letsencrypt-staging Name: letsencrypt-staging Namespace: default Labels: <none> Annotations: kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"cert-manager.io/v1","kind":"Issuer","metadata":{"annotations":{},"name":"letsencrypt-staging","namespace":"default"},(...)} API Version: cert-manager.io/v1 Kind: Issuer Metadata: Cluster Name: Creation Timestamp: 2018-11-17T18:03:54Z Generation: 0 Resource Version: 9092 Self Link: /apis/cert-manager.io/v1/namespaces/default/issuers/letsencrypt-staging UID: <UID> Spec: Acme: Email: email@example.com Private Key Secret Ref: Key: Name: letsencrypt-staging Server: https://acme-staging-v02.api.letsencrypt.org/directory Solvers: Http 01: Ingress: Class: nginx Status: Acme: Uri: https://acme-staging-v02.api.letsencrypt.org/acme/acct/7374163 Conditions: Last Transition Time: 2018-11-17T18:04:00Z Message: The ACME account was registered with the ACME server Reason: ACMEAccountRegistered Status: True Type: Ready Events: <none>Добавьте аннотации, которые были закомментированы в шагах 1 и 3:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: kuard annotations: cert-manager.io/issuer: "letsencrypt-staging" spec: ingressClassName: nginx tls: - hosts: - example.example.com secretName: quickstart-example-tls rules: - host: example.example.com http: paths: - path: / pathType: Prefix backend: service: name: kuard port: number: 80Разверните аннотацию, введите команду:
kubectl create --edit -f https://<repoexample.ru>/cert-manager/website/master/content/docs/tutorials/acme/example/ingress-tls.yaml # Укажите актуальный путь до локального репозиторияCert-manager прочитает аннотации и использует их для создания сертификата.
Введите команду, чтобы запросить сертификат:
kubectl get certificate NAME READY SECRET AGE quickstart-example-tls True quickstart-example-tls 16mЗапросите информацию о сертификате, введите команду:
kubectl describe certificate quickstart-example-tlsВывод отобразит следующее:
Name: quickstart-example-tls Namespace: default Labels: <none> Annotations: <none> API Version: cert-manager.io/v1 Kind: Certificate Metadata: Cluster Name: Creation Timestamp: 2023-11-17T17:58:37Z Generation: 0 Owner References: API Version: networking.k8s.io/v1 Block Owner Deletion: true Controller: true Kind: Ingress Name: kuard UID: <UID> Resource Version: 9295 Self Link: /apis/cert-manager.io/v1/namespaces/default/certificates/quickstart-example-tls UID: <UID> Spec: Dns Names: www.example.com Issuer Ref: Kind: Issuer Name: letsencrypt-staging Secret Name: quickstart-example-tls Status: Acme: Order: URL: https://acme-staging-v02.api.letsencrypt.org/acme/order/7374163/1333676 Conditions: Last Transition Time: 2023-11-17T18:05:57Z Message: Certificate issued successfully Reason: CertIssued Status: True Type: Ready Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal CreateOrder 9m cert-manager Created new ACME order, attempting validation... Normal DomainVerified 8m cert-manager Domain "www.example.com" verified with "http-01" validation Normal IssueCert 8m cert-manager Issuing certificate... Normal CertObtained 7m cert-manager Obtained certificate from ACME server Normal CertIssued 7m cert-manager Certificate issued SuccessfullyСобытия, связанные с этим ресурсом и перечисленные в нижней части результатов
describe, показывают состояние запроса. В приведенном примере сертификат был проверен и выдан в течение нескольких минут.После завершения Cert-manager создаст
secretс деталями сертификата, используемого в ресурсе Ingress.Введите флаг
desckribeв инструменте kubectl для получения детальной информации:kubectl describe secret quickstart-example-tlsВывод отобразит следующее:
Name: quickstart-example-tls Namespace: default Labels: cert-manager.io/certificate-name=quickstart-example-tls Annotations: cert-manager.io/alt-names=www.example.com cert-manager.io/common-name=www.example.com cert-manager.io/issuer-kind=Issuer cert-manager.io/issuer-name=letsencrypt-staging Type: DropApp.io/tls Data ==== tls.crt: 3566 bytes tls.key: 1675 bytesОбновите аннотации Ingress для указания эмитента
letsencrypt-prod:apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: kuard annotations: cert-manager.io/issuer: "letsencrypt-prod" spec: ingressClassName: nginx tls: - hosts: - example.example.com secretName: quickstart-example-tls rules: - host: example.example.com http: paths: - path: / pathType: Prefix backend: service: name: kuard port: number: 80Примените аннотацию Ingress:
kubectl create --edit -f https://<repoexample.ru>/cert-manager/website/master/content/docs/tutorials/acme/example/ingress-tls-final.yaml ingress.networking.k8s.io/kuard configured # Укажите актуальный путь до локального репозиторияУдалите существующий
secret, который отслеживается Cert-manager,kubectl delete secret quickstart-example-tls secret "quickstart-example-tls" deletedВ результате запрос будет обработан с обновленным эмитентом.
Проверьте статус процесса получения нового сертификата:
kubectl describe certificate quickstart-example-tls Name: quickstart-example-tls Namespace: default Labels: <none> Annotations: <none> API Version: cert-manager.io/v1 Kind: Certificate Metadata: Cluster Name: Creation Timestamp: 2018-11-17T18:36:48Z Generation: 0 Owner References: API Version: networking.k8s.io/v1 Block Owner Deletion: true Controller: true Kind: Ingress Name: kuard UID: <UID> Resource Version: 283686 Self Link: /apis/cert-manager.io/v1/namespaces/default/certificates/quickstart-example-tls UID: <UID> Spec: Dns Names: www.example.com Issuer Ref: Kind: Issuer Name: letsencrypt-prod Secret Name: quickstart-example-tls Status: Conditions: Last Transition Time: 2019-01-09T13:52:05Z Message: Certificate does not exist Reason: NotFound Status: False Type: Ready Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Generated 18s cert-manager Generated new private key Normal OrderCreated 18s cert-manager Created Order resource "quickstart-example-tls-889745041"Вывод должен содержать
KUARD, работающий в домене с подписанным сертификатом TLS 1.2.Запросите текущее состояние ACME, запустите команду
kubectl describeCert-manager:kubectl describe order quickstart-example-tls-889745041 ... Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Created 90s cert-manager Created Challenge resource "quickstart-example-tls-889745041-0" for domain "www.example.com"В приведенном примере Cert-manager успешно создал ресурс.
Изучите состояние текущей задачи ACME, запустите команду:
kubectl describe challenge quickstart-example-tls-889745041-0 ... Status: Presented: false Processing: false Reason: Successfully authorized domain State: valid Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Started 71s cert-manager Challenge scheduled for processing Normal Presented 70s cert-manager Presented challenge using http-01 challenge mechanism Normal DomainVerified 2s cert-manager Domain "www.example.com" verified with "http-01" validationВ результате выполнения команды в приведенном примере соответствующие ресурсы удалены, а ресурс
orderбыл обновлен.Отследите состояние
order:kubectl describe order quickstart-example-tls-889745041 ... Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Created 90s cert-manager Created Challenge resource "quickstart-example-tls-889745041-0" for domain "www.example.com" Normal OrderValid 16s cert-manager Order completed successfullyУбедитесь в обновлении сертификата, введите команду:
kubectl describe certificate quickstart-example-tls Status: Conditions: Last Transition Time: 2023-01-09T13:57:52Z Message: Certificate is up to date and has not expired Reason: Ready Status: True Type: Ready Not After: 2023-04-09T12:57:50Z Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Generated 11m cert-manager Generated new private key Normal OrderCreated 11m cert-manager Created Order resource "quickstart-example-tls-889745041" Normal OrderComplete 10m cert-manager Order "quickstart-example-tls-889745041" completed successfullВ приведенном примере сертификат был успешно обновлен.