Gerente de certificados automatiza el aprovisionamiento de certificados dentro de los clústeres de Kubernetes. Proporciona un conjunto de recursos personalizados para emitir certificados y adjuntarlos a servicios.
Uno de los casos de uso más comunes es proteger aplicaciones web y API con certificados SSL de Let’s Encrypt. A continuación se explica cómo agregar Cert-Manager a su clúster, configurar un emisor de certificados Let’s Encrypt y adquirir un certificado para Pods expuestos a través de un Ingress.
Instalación de 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 Jetstack a su instalación de Helm. Jetstack desarrolló originalmente Cert-Manager antes de ser donado a CNCF.
helm repo add jetstack https://charts.jetstack.iohelm 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 del administrador de certificados.
El comando instalará Cert-Manager en un nuevo espacio de nombres de Kubernetes llamado cert-manager. La configuración installCRDs agregará los recursos de Kubernetes personalizados de Cert-Manager durante la instalación. Esto solo funciona con Helm versión 3.2 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 Kubectl
Cert-Manager tiene un complemento 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.gztar xzf kubectl-cert-manager.tar.gz
sudo mv kubectl-cert_manager /usr/local/bin
Ahora use el complemento para verificar que la instalación de Cert-Manager esté funcionando:
kubectl cert-manager check api
Deberías ver el siguiente resultado:
The cert-manager API is ready
Ahora está listo para agregar un emisor para obtener certificados de Let’s Encrypt.
Crear un emisor de certificado
Los emisores y los emisores de clúster son recursos que proporcionan 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 dinámicamente nuevos certificados para los servicios en su clúster.
Cree un archivo YAML en su directorio de trabajo y asígnele el nombre emitr.yml. Añade el siguiente contenido:
apiVersion: cert-manager.io/v1kind: 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 estandar Editor es un recurso con espacio de nombres que solo puede proporcionar certificados dentro de su propio espacio de nombres.
Nuestra configuración de emisor indica a Cert-Manager que obtenga certificados del servidor provisional de Let’s Encrypt. Es una buena idea utilizar el entorno de prueba mientras configura su integración para evitar afectar la estricta producción de Let’s Encrypt. límites de tasa.
Utilice kubectl para agregar el emisor a su clúster:
kubectl create -f issuer.yml
Obtener un certificado
Ahora puede utilizar 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 su campo tls. Solo necesita agregar una anotación que nombre el emisor o el emisor del clúster que desea utilizar.
apiVersion: apps/v1kind: 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 Ingress que expone el servicio. Asume el uso de nginx-ingress como controlador de Ingress. El Pod ejecuta un contenedor de WordPress al que se podrá acceder a través de HTTPS en example.com.
Cert-Manager detectará la presencia de la anotación cert-manager.io/cluster-issuer en el recurso de Ingress. Utilizará el emisor del clúster letsencrypt-staging creado anteriormente para adquirir un certificado que cubra los nombres de host definidos en el campo tls.hosts de Ingress.
Usando 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 de prueba son válidos, pero los navegadores no confían en ellos, por lo que debe obtener un reemplazo de producción antes de poner en funcionamiento su sitio.
Es mejor agregar un emisor de clúster independiente 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 producción.
Copie la configuración del emisor que se muestra arriba y cambie los campos de nombre 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 la anotación cert-manager.io/cluster-issuer a letsencrypt-production (o el nombre que asignó a su propio emisor de producción). Utilice 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 de Cert-Manager
Las versiones de Cert-Manager generalmente admiten actualizaciones locales con Helm:
helm repo updatehelm 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 normalmente son sencillas, siempre debe revisar las notas de la versión para identificar los posibles cambios que necesita realizar. Esto es particularmente importante si está actualizando Kubernetes o pasando por varias versiones de Cert-Manager. Si todavía utiliza una versión anterior de Kubernetes, es posible que tenga una versión obsoleta de Cert-Manager que requiera intervención manual significativa para ponerlo al día.
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 utilice la API Let’s Encrypt y luego hacer referencia a ese emisor en sus recursos de Ingress.
Puede proporcionar a Cert-Manager su propia configuración para casos de uso más avanzados. Puede especificar la duración del certificado (use la anotación Ingress cert-manager.io/duration), declarar manualmente el nombre común del certificado (cert-manager.io/common-name) y usar Desafíos del DNS en lugar de HTTP. La última opción puede resultar útil en escenarios específicos, como cuando desea adquirir un certificado comodín.
El uso sencillo para proteger aplicaciones web y API debería funcionar tal como está utilizando los recursos que se muestran arriba. La verificación HTTP funciona manipulando el controlador de Ingress para proporcionar una URL temporal conocida a la que Let’s Encrypt pueda acceder. Si su dominio proporciona el valor correcto en esa URL, Let’s Encrypt confía en que usted tiene el control y emite el certificado.