Cert-Manager automatiza el aprovisionamiento de certificados dentro de los clústeres de Kubernetes. Proporciona un conjunto de recursos personalizados para emitir certificados y adjuntarlos a los servicios.
Uno de los casos de uso más comunes es proteger las aplicaciones web y las API con certificados SSL de Let's Encrypt. Aquí se explica cómo agregar Cert-Manager a su clúster, configurar un emisor de certificados de Let's Encrypt y adquirir un certificado para Pods expuestos a través de un Ingress.
Instalando Cert-Manager
Cert-Manager es más fácil de instalar usando Helm. Helm es un administrador de paquetes de Kubernetes que le permite agregar aplicaciones a su clúster utilizando repositorios de gráficos prediseñados. Asegúrese de tener Helm instalado y configurado con una conexión a su clúster de Kubernetes.
Comience agregando el repositorio de Jetstack a su instalación de Helm. Jetstack desarrolló originalmente Cert-Manager antes de que fuera donado a CNCF.
helm repo add jetstack https://charts.jetstack.io helm repo update
Ahora instale Cert-Manager en su clúster:
helm install cert-manager jetstack/cert-manager --namespace cert-manager --create-namespace --version v1.5.3 --set installCRDs=true
Reemplace el número de versión que se muestra arriba con la última versión que se muestra en la documentación de Cert-Manager.
El comando instalará Cert-Manager en un nuevo espacio de nombres de Kubernetes llamado cert-manager
. Los installCRDs
La configuración agregará los recursos personalizados de Kubernetes de Cert-Manager durante la instalación. Esto solo funciona con la versión 3.2 de Helm y posteriores; si está utilizando una versión anterior, debe agregar manualmente las definiciones de recursos con Kubectl:
kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.5.3/cert-manager.crds.yaml
Agregar el complemento de Kubectl
Cert-Manager tiene un complemento de Kubectl que simplifica algunas tareas de administración comunes. También le permite verificar si Cert-Manager está activo y listo para atender solicitudes.
Instale el complemento descargando su archivo y extrayéndolo al directorio correcto:
curl -L -o kubectl-cert-manager.tar.gz https://github.com/jetstack/cert-manager/releases/latest/download/kubectl-cert_manager-linux-amd64.tar.gz tar xzf kubectl-cert-manager.tar.gz sudo mv kubectl-cert_manager /usr/local/bin
Ahora use el complemento para verificar que su instalación de Cert-Manager esté funcionando:
kubectl cert-manager check api
Debería ver el siguiente resultado:
The cert-manager API is ready
Ahora está listo para agregar un emisor para obtener certificados de Let's Encrypt.
Creación de un emisor de certificados
Los emisores y los emisores de clúster son recursos que suministran certificados a su clúster. La instalación básica de Cert-Manager creada hasta ahora no puede emitir certificados. Agregar un emisor que esté configurado para usar Let's Encrypt le permite adquirir de forma dinámica nuevos certificados para los servicios en su clúster.
Cree un archivo YAML en su directorio de trabajo y asígnele el nombre issuer.yml
. Agrega el siguiente contenido:
apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata: name: letsencrypt-staging spec: acme: server: https://acme-staging-v02.api.letsencrypt.org/directory email: [email protected] privateKeySecretRef: name: letsencrypt-staging solvers: - http01: ingress: class: nginx
Debe reemplazar la dirección de correo electrónico con su propio correo electrónico de contacto. Esto se incluirá en sus certificados. Let's Encrypt también puede enviarle un correo electrónico a la dirección si necesita enviarle alertas sobre sus certificados.
Estamos creando un ClusterIssuer
ya que están disponibles para todos los recursos de su clúster, independientemente del espacio de nombres. Un Issuer
estándar es un recurso de espacio de nombres que solo puede suministrar certificados dentro de su propio espacio de nombres.
Nuestra configuración de emisor le indica a Cert-Manager que obtenga certificados del servidor de ensayo de Let's Encrypt. Es una buena idea usar el entorno de prueba mientras configura su integración para evitar alcanzar los estrictos límites de tasa de producción de Let's Encrypt.
Usa kubectl
para agregar el emisor a su clúster:
kubectl create -f issuer.yml
Obteniendo un Certificado
Ahora puede usar su emisor para adquirir un certificado para un servicio expuesto a través de un recurso de Ingress. Cert-Manager monitorea automáticamente los recursos de Ingress y crea certificados usando la configuración en sus tls
campo. Solo necesita agregar una anotación que nombre el emisor o el emisor del clúster que desea usar.
apiVersion: apps/v1 kind: Deployment metadata: name: my-app spec: replicas: 1 selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: containers: - name: my-app image: wordpress:latest ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: my-service spec: selector: app: my-app ports: port: 80 --- apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: my-ingress annotations: kubernetes.io/ingress.class: nginx cert-manager.io/cluster-issuer: letsencrypt-staging spec: rules: - host: example.com http: paths: - path: / backend: serviceName: my-service servicePort: 80 tls: - hosts: - example.com
Este archivo YAML define un pod, un servicio y un ingreso que expone el servicio. Asume el uso de nginx-ingress
como controlador de entrada. El Pod ejecuta un contenedor de WordPress al que se podrá acceder a través de HTTPS en example.com
.
La presencia de cert-manager.io/cluster-issuer
Cert-Manager detectará la anotación en el recurso Ingress. Usará el letsencrypt-staging
emisor de clúster creado anteriormente para adquirir un certificado que cubra los nombres de host definidos en tls.hosts
de Ingress campo.
Uso de Let's Encrypt en producción
Una vez que haya adquirido con éxito un certificado provisional, puede migrar a los servidores de producción de Let's Encrypt. Los certificados provisionales son válidos, pero los navegadores no confían en ellos, por lo que debe obtener un reemplazo de producción antes de poner su sitio en funcionamiento.
Es mejor agregar un emisor de clúster separado para el servidor de producción. Luego puede hacer referencia al emisor apropiado en cada uno de sus recursos de Ingress, dependiendo de si están listos para la producción.
Copie la configuración del emisor que se muestra arriba y cambie el name
campos a letsencrypt-production
. A continuación, reemplace la URL del servidor con el valor que se muestra a continuación:
https://acme-v02.api.letsencrypt.org/directory
Cree el nuevo emisor en su clúster:
kubectl create -f issuer-production.yml
Actualice su recurso de Ingress para solicitar un certificado de producción cambiando el valor de cert-manager.io/cluster-issuer
anotación a letsencrypt-production
(o el nombre que le asignó a su propio emisor de producción). Usa kubectl
para aplicar el cambio:
kubectl apply -f my-ingress.yaml
Ahora debería tener habilitado HTTPS en pleno funcionamiento para su recurso de Ingress. Cert-Manager administrará automáticamente sus certificados y los renovará antes de que caduquen.
Actualización del administrador de certificados
Las versiones de Cert-Manager suelen admitir actualizaciones en el lugar con Helm:
helm repo update helm upgrade --version <new version> cert-manager jetstack/cert-manager
Los certificados permanecen disponibles durante las actualizaciones, pero el proceso de renovación se detendrá.
Aunque las actualizaciones ahora son normalmente sencillas, siempre debe revisar las notas de la versión para identificar los posibles cambios que debe realizar. Esto es particularmente importante si está actualizando Kubernetes o pasando por varias versiones de Cert-Manager. Si todavía usa una versión anterior de Kubernetes, es posible que tenga una versión obsoleta de Cert-Manager que requiera una intervención manual significativa para actualizarla.
Resumen
Let's Encrypt se agrega fácilmente a un clúster de Kubernetes mediante Cert-Manager. Debe instalar Cert-Manager con Helm, crear un emisor que use la API Let's Encrypt y luego hacer referencia a ese emisor en sus recursos de Ingress.
Puede proporcionar Cert-Manager con su propia configuración para casos de uso más avanzados. Puede especificar la vigencia de un certificado (utilice cert-manager.io/duration
anotación de ingreso), declare manualmente el nombre común del certificado (cert-manager.io/common-name
), y use desafíos de DNS en lugar de HTTP. La última opción puede ser útil en escenarios específicos, como cuando desea adquirir un certificado comodín.
El uso directo para proteger las aplicaciones web y las API debería funcionar tal como está utilizando los recursos que se muestran arriba. La verificación HTTP funciona mediante la manipulación del controlador Ingress para proporcionar un .well-known
temporal. URL a la que puede acceder Let's Encrypt. Si su dominio proporciona el valor correcto en esa URL, Let's Encrypt confía en que tiene el control y emite el certificado.