Cert-Manager

Cert-Manager es una herramienta nativa de Kubernetes que automatiza la gestión de certificados TLS dentro de un clúster.
Cert-Manager es un controlador de Kubernetes que:
-
Solicita certificados de diferentes proveedores (por ejemplo: Let's Encrypt, Venafi, CA interna, etc.).
-
Renueva automáticamente los certificados antes de que expiren.
-
Crea y gestiona los Secrets de Kubernetes que contienen los certificados TLS.
🛠️ Funcionamiento
-
Automatiza la emisión y renovación de certificados TLS.
-
Funciona con Ingress, Services, Pods, y cualquier recurso que necesite TLS.
-
Soporta ACME (Let's Encrypt), certificados auto-firmados, Vault, entre otros.
-
Utiliza recursos personalizados de Kubernetes como:
-
Issuer(local a un namespace) -
ClusterIssuer(disponible para todo el clúster) -
Certificate(define el dominio y cómo obtener el TLS) -
Order,Challenge(para procesos ACME)
-
Instalación
Añadir repositorio "Helm"
helm repo add jetstack https://charts.jetstack.io --force-update
Instalar cert-manager
helm install \
cert-manager jetstack/cert-manager \
--namespace cert-manager \
--create-namespace \
--set crds.enabled=true
ClusterIssuer
Global -> para todo el clúster
-
Se aplica una sola vez y puedes usarlo en cualquier namespace.
-
Ideal para producción cuando quieres certificados automáticos a nivel de clúster.
Manifiesto "clusterletsencrypt-stagingissuer..yaml":
apiVersion: cert-manager.io/v1
kind: ClusterIssuerIssuer
metadata:
name: letsencrypt-httpstaging
spec:
acme:
# The ACME server URL
server: https://acme-staging-v02.api.letsencrypt.org/directory
# Email address used for ACME registration
email: tu-email@dominio.user@example.com
# emailName válidoof a secret used to store the ACME account private key
privateKeySecretRef:
name: letsencrypt-staging
# Enable the HTTP-01 challenge provider
solvers:
- http01:
ingress:
ingressClassName: nginx
Manifiesto "letsencrypt-prod.yaml":
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
name: letsencrypt-prod
spec:
acme:
# The ACME server URL
server: https://acme-v02.api.letsencrypt.org/directory
# Email address used for ACME registration
email: user@example.com
# Name of a secret used to store the ACME account private key
privateKeySecretRef:
name: letsencrypt-http-private-keyprod
# Enable the HTTP-01 challenge provider
solvers:
- http01:
ingress:
class:ingressClassName: nginx
kubectl apply -f clusterissuer.yaml
Manifiesto
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: httpd-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
cert-manager.io/cluster-issuer: letsencrypt-http # issuer
nginx.ingress.kubernetes.io/force-ssl-redirect: "true" # redirige http -> https
spec:
ingressClassName: nginx
rules:
- host: myapp.dominio.com # FQDN app
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: httpd-service
port:
number: 80
tls:
- hosts:
- myapp.dominio.com # FQDN app
secretName: myapp-tls
Desinstalación
helm delete cert-manager --namespace cert-manager
kubectl delete crd \
issuers.cert-manager.io \
clusterissuers.cert-manager.io \
certificates.cert-manager.io \
certificaterequests.cert-manager.io \
orders.acme.cert-manager.io \
challenges.acme.cert-manager.io