Actualiza o mueres

David Fernández
3 min readJan 3, 2020

--

¿Qué pueda pasar la última semana del año? darte cuenta que cert-manager no actualizo los certificados y se vence el 31 de diciembre…

Si.. así estamos, pero todo tiene solución menos la muerte.

Pero hoy le contare mi experiencia de cómo actualizar desde la v0.5.2 a v0.12 usando Helm con el chart oficial del proyecto. Primero los invito a leer los cambios aplicado en el release v0.11.0 para entender posibles errores, luego ir a la documentación de cert-manager en el apartado “upgrading”, ahí nos hace mención de como actualizar de release, pero no cómo dar un salto de varias versiones. ¿Entonces qué hacemos?, no te preocupes ahora te explico …

Para comenzar vamos hacer un backup de nuestra configuración, siguiendo la recomendación del proyecto, https://cert-manager.io/docs/tutorials/backup/, en mi caso, la configuración se encuentra en el namespace kube-system, es por eso que el comando para realizar el backup es el siguiente:

kubectl get -o yaml \--n kube-system \issuer,clusterissuer,certificates,certificaterequests > cert-manager-backup.yaml

Si te retorna un error que no encuentra o desconoce certificaterequests o issuer, ejecuta nuevamente el comando sin esos mismos, porque es posible que no los tengas en el clúster.

Ahora agregamos el repositorio de chart del proyecto de la siguiente manera:

helm repo add jetstack https://charts.jetstack.io

y actualizamos nuestros repositorios de helm

help repo update

Si leíste los cambios de release de la v0.11.0, sabrás que hubo cambios con los CDRs, es por eso que debemos aplicar los nuevos Custom resources , esto es importante porque sino no podemos aplicar la nueva versión. Para aplicarlos debemos hacer lo siguiente:

kubectl apply \--validate=false \-f https://github.com/jetstack/cert-manager/releases/download/v0.12.0/cert-manager.yaml

Hasta ahora solo agregamos Custom resources nuevos a nuestro clúster, ahora veamos cómo está nuestra configuración de certificado y clusterissuer.

Si venimos de la v0.5.x, debemos aplicar un nuevo clusterissuer y certificate, porque nuestro CDRs cambiaron y hacen uso de otros, también hay cambios en la declaración de los yaml. Nuestro clusterissuer debería verse así :

apiVersion: certmanager.k8s.io/v1alpha1kind: ClusterIssuermetadata:name: letsencrypt-staging-dnsspec:acme:# The ACME server URLserver: https://acme-v02.api.letsencrypt.org/directory# Email address used for ACME registrationemail: "certificates@example.com"# Name of a secret used to store the ACME account private keyprivateKeySecretRef:name: letsencrypt-staging-dns# Enable the DNS-01 challenge providerdns01:providers:- name: dnsroute53:region: us-east-1accessKeyID: YOURACCESSKEYIDsecretAccessKeySecretRef:name: acme-route53key: secret-access-key

Ahora se debería ver así :

apiVersion: cert-manager.io/v1alpha2kind: ClusterIssuermetadata:  name: letsencrypt-staging-dnsspec:
acme:
# The ACME server URLserver: https://acme-v02.api.letsencrypt.org/directory# staging, for testing#server: https://acme-staging-v02.api.letsencrypt.org/directory# Email address used for ACME registrationemail: “certificates@example.com”# Name of a secret used to store the ACME account private keyprivateKeySecretRef:name: letsencrypt-staging-dns# Enable the DNS-01 challenge providersolvers:- dns01:route53:region: us-east-1# optional if ambient credentials are available; see ambient credentials documentationaccessKeyID: YOURACCESSKEYIDsecretAccessKeySecretRef:name: acme-route53key: secret-access-key

Como verán tiene algunos cambios, apiversion, solvers. El certificate también sufre algunos cambios, el que disponemos en este momento se debe ver así:

apiVersion: certmanager.k8s.io/v1alpha1kind: Certificatemetadata:name: nginx-sandbox-cluster-comnamespace: cert-managerspec:secretName: sandbox-cluster-com-tlsissuerRef:name: letsencrypt-staging-dnskind: ClusterIssuercommonName: sandbox.cluster.comdnsNames:- '*.sandbox.cluster.com'acme:config:- dns01:provider: dnsdomains:- '*.sandbox.cluster.com'

Con estos cambios aplicado, procedemos actualizar nuestro cert-manager, que antiguamente era un deployment con el pod de cert-manager, pero actualmente son tres deployments, se agrega:

-cert-manager-webhook

- cert-manager-cainjector

Ahora para aplicar la nueva versión debes ejecutar :

helm upgrade — version v0.12.0 <release_name> jetstack/cert-manager

Para verificar el release name con el cual esta instalado cert-manager, debes hacer lo siguiente y modificar el release name con el que corresponde.

helm list | grep cert-manager

Listo, ya deberías tener instalado y funcionando cert-manager con la v0.12.0

Para comprobar si hay errores, puedes ver los logs del pod de cert-manager, comprobar que se haya creado correctamente certificaterequests de la siguiente forma:

 kubectl get certificaterequests -n kube-system 

Eso te mostrará los certificaterequests disponibles.

Un posible error es que no se haya actualizado correctamente el deployment de cert-manager y el pod este en estado crashloopbackoff, debes hacer un describe de tu deployment y verificá la versión del mismo, en mi caso no se actualizo la versión del container y tuve que editar el deployment con la nueva versión, con eso funciono correctamente.

Gracias a Demian Wandelow que ayudo a la actualización del cert-manager.

--

--