Cert-Manager + Helm в Kubernetes

Конфигурация оборудования

  • Установленный и настроенный кластер Kubernetes версии 1.15.3.
  • При работе с Helm2 - установленный Tiller.

Что такое Cert-manager

Cert-manager - нативное для Kubernetes средство управления сертификатами. Cert-manager может получать сертификаты из нескольких источников (например, Let’s Encrypt, HashiCorp Vault, Venafi), из локальных контейнеров, содержащих сертификат и ключ, либо может генерировать самоподписанные сертификаты, которые чаще всего используются для предоставления https-доступа к ingress-контроллерам. Кроме того, Cert-manager контролирует срок действия сертификатов и поддерживает автоматическое обновление сертификатов. Cхема организации Cert-manager (источник: официальная документация):

Установка Cert-manager

  1. Создайте CustomResouceDefinitions:
ash-work:~ kubectl apply --validate=false -f https://raw.githubusercontent.com/jetstack/cert-manager/release-0.12/deploy/manifests/00-crds.yaml
customresourcedefinition.apiextensions.k8s.io/certificaterequests.cert-manager.io created
customresourcedefinition.apiextensions.k8s.io/certificates.cert-manager.io created
customresourcedefinition.apiextensions.k8s.io/challenges.acme.cert-manager.io created
customresourcedefinition.apiextensions.k8s.io/clusterissuers.cert-manager.io created
customresourcedefinition.apiextensions.k8s.io/issuers.cert-manager.io created
customresourcedefinition.apiextensions.k8s.io/orders.acme.cert-manager.io created
  1. Создайте пространство имен:

ash-work:~ kubectl create namespace cert-manager
namespace/cert-manager created
  1. В Helm добавьте репозиторий Jetstack:

ash-work:~ helm repo add jetstack https://charts.jetstack.io
"jetstack" has been added to your repositories
  1. Обновите список репозиториев:

ash-work:~ helm repo update
Hang tight while we grab the latest from your chart repositories...
...Skip local chart repository
...Successfully got an update from the "jetstack" chart repository
...Successfully got an update from the "stable" chart repository
Update Complete.
  1. Установите Cert-Manager:

ash-work:~  helm install \
  --name cert-manager \
  --namespace cert-manager \
  --version v0.12.0 \
  jetstack/cert-manager
NAME:   cert-manager
LAST DEPLOYED: Thu Dec 19 13:24:39 2019
NAMESPACE: cert-manager
STATUS: DEPLOYED
...
NOTES:
cert-manager has been deployed successfully!

In order to begin issuing certificates, you will need to set up a ClusterIssuer
or Issuer resource (for example, by creating a 'letsencrypt-staging' issuer).

Примечание.

Если при установке Cert-Manager возникли ошибки типа "Forbidden: User ….", значит у вас нет прав для установки в данный namespace. Для получения прав:
ash-work:~ kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller

Затем повторите команду для  установки. 

Подробнее о настройке прав Helm см. тут.

Проверка Cert-manager

  1. Убедитесь, что Cert-manager установлен:
ash-work:~ kubectl get pods --namespace cert-manager
NAME                                     READY STATUS RESTARTS   AGE
cert-manager-8d4ccddb9-wkwqf             1/1   Running 0         13m
cert-manager-cainjector-df4dc78cd-fbc9q  1/1   Running 0         13m
cert-manager-webhook-5f78ff89bc-qj48g    1/1   Running 0         13m

Все три контейнера должны быть в состоянии Running.

  1. Создайте файл test-resources.yaml:
ash-work:~  cat <<EOF > test-resources.yaml
apiVersion: v1
kind: Namespace
metadata:
    name: cert-manager-test
---
apiVersion: cert-manager.io/v1alpha2
kind: Issuer
metadata:
    name: test-selfsigned
    namespace: cert-manager-test
spec:
    selfSigned: {}
---
apiVersion: cert-manager.io/v1alpha2
kind: Certificate
metadata:
    name: selfsigned-cert
    namespace: cert-manager-test
spec:
    commonName: example.com
    secretName: selfsigned-cert-tls
    issuerRef:
        name: test-selfsigned
EOF
  1.  Примените созданный файл:
ash-work:~ kubectl apply -f test-resources.yaml
namespace/cert-manager-test unchanged
issuer.cert-manager.io/test-selfsigned created
certificate.cert-manager.io/selfsigned-cert created
  1. Через несколько секунд проверьте статус созданных сертификатов:
ash-work:~ kubectl describe certificate -n cert-manager-test
Name: selfsigned-cert
Namespace: cert-manager-test
Labels: <none>
Annotations: kubectl.kubernetes.io/last-applied-configuration:

{"apiVersion":"cert-manager.io/v1alpha2","kind":"Certificate","metadata":{"annotations":{},"name":"selfsigned-cert","namespace":"cert-mana...
API Version: cert-manager.io/v1alpha2
Kind: Certificate
Metadata:
    Creation Timestamp: 2019-12-19T12:48:01Z
    Generation: 1
    Resource Version: 20458
    Self Link: /apis/cert-manager.io/v1alpha2/namespaces/cert-manager-test/certificates/selfsigned-cert
    UID: f242a827-b9ed-4a50-8e55-0a86253b0a8b
Spec:
    Common Name: example.com
    Issuer Ref:
        Name: test-selfsigned
    Secret Name: selfsigned-cert-tls
Status:
    Conditions:
        Last Transition Time: 2019-12-19T12:48:01Z
        Message: Certificate is up to date and has not expired
        Reason: Ready
        Status: True
        Type: Ready
    Not After: 2020-03-18T12:48:01Z
Events:
    Type   Reason       Age From         Message
    ----   ------       ---- ----         -------
    Normal GeneratedKey 13s cert-manager Generated a new private key
    Normal Requested    13s cert-manager Created new CertificateRequest resource "selfsigned-cert-2334779822"
    Normal Issued       13s cert-manager Certificate issued successfully

Резервное копирование и восстановление настроек Cert-manager

Для резервирования настроек Cert-manager выполните команду:

ash-work:~ kubectl get -o yaml \
    --all-namespaces \
     issuer,clusterissuer,certificates,certificaterequests > cert-manager-backup.yaml

Для восстановления настроек Cert-manager выполните команду:

ash-work:~ kubectl apply -f cert-manager-backup.yaml

Обновление Cert-manager

  1. Обновите список репозиториев Helm:
ash-work:~ helm repo update
Hang tight while we grab the latest from your chart repositories...
...Skip local chart repository
...Successfully got an update from the "jetstack" chart repository
...Successfully got an update from the "stable" chart repository
Update Complete.
  1. Сделайте резервную копию настроек, как написано выше.
  2. Посмотрите текущую установленную версию Cert-manager:
ash-work:~ helm list | grep cert-manager
cert-manager    1           Thu Dec 19 14:24:49 2019    DEPLOYED    cert-manager-v0.12.0    v0.12.0        cert-manager
  1. При необходимости выполните обновление до актуальной версии:
ash-work:~ helm upgrade --version <VERSION> cert-manager jetstack/cert-manager

Примечание

Актуальную версию Cert-manager см. тут.
Пример последовательности действий при обновлении с версии 0.11.0 до версии 0.13.0-alpha.0:
ash-work:~ helm repo update
Hang tight while we grab the latest from your chart repositories...
...Skip local chart repository
...Successfully got an update from the "jetstack" chart repository
...Successfully got an update from the "stable" chart repository
Update Complete.
ash-work:~ kubectl get -o yaml \
--all-namespaces \
issuer,clusterissuer,certificates,certificaterequests > cert-manager-backup.yaml
ash-work:~ helm list | grep cert-manager
cert-manager 2 Thu Dec 19 16:47:58 2019 DEPLOYED cert-manager-v0.11.0 v0.11.0 cert-manager
ash-work:~ helm upgrade --version 0.13.0-alpha0 cert-manager jetstack/cert-manager
Error: failed to download "jetstack/cert-manager" (hint: running `helm repo update` may help)
ash-work:~ helm upgrade --version 0.13.0-alpha.0 cert-manager jetstack/cert-manager
Release "cert-manager" has been upgraded.
LAST DEPLOYED: Thu Dec 19 16:53:44 2019
NAMESPACE: cert-manager
STATUS: DEPLOYED

ash-work:~ helm list | grep cert-manager
cert-manager    3           Thu Dec 19 16:53:44 2019    DEPLOYED    cert-manager-v0.13.0-alpha.0    v0.13.0-alpha.0    cert-manager

Удаление Cert-manager

  1. Просмотрите созданные пользовательские ресурсы:
ash-work:~ kubectl get Issuers,ClusterIssuers,Certificates,CertificateRequests,Orders,Challenges --all-namespaces
NAMESPACE NAME READY AGE
cert-manager-test issuer.cert-manager.io/test-selfsigned True 67m
NAMESPACE NAME READY SECRET AGE
cert-manager-test certificate.cert-manager.io/selfsigned-cert True selfsigned-cert-tls   67m
NAMESPACE NAME READY AGE
cert-manager-test   certificaterequest.cert-manager.io/selfsigned-cert-2334779822   True    67m

При необходимости эти ресурсы нужно будет удалить отдельно.

  1. Для удаления Cert-manager выполните команду:
ash-work:~ helm delete cert-manager --purge
release "cert-manager" deleted
  1. Удалите пространство имен Cert-manager:
ash-work:~ kubectl delete namespace cert-manager
namespace "cert-manager" deleted
  1. Чтобы удалить только Cert-manager, без пользовательских ресурсов, удалите манифест CustomResourceDefinitions:
ash-work:~ kubectl delete -f https://raw.githubusercontent.com/jetstack/cert-manager/release-0.12/deploy/manifests/00-crds.yaml
customresourcedefinition.apiextensions.k8s.io "certificaterequests.cert-manager.io" deleted
customresourcedefinition.apiextensions.k8s.io "certificates.cert-manager.io" deleted
customresourcedefinition.apiextensions.k8s.io "challenges.acme.cert-manager.io" deleted
customresourcedefinition.apiextensions.k8s.io "clusterissuers.cert-manager.io" deleted
customresourcedefinition.apiextensions.k8s.io "issuers.cert-manager.io" deleted
customresourcedefinition.apiextensions.k8s.io "orders.acme.cert-manager.io" deleted

Обратная связь

Возникли проблемы или остались вопросы? Напишите нам, мы будем рады вам помочь