Skip to main content

Cert-Manager

image.png

https://cert-manager.io/

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

  1. Automatiza la emisión y renovación de certificados TLS.

  2. Funciona con Ingress, Services, Pods, y cualquier recurso que necesite TLS.

  3. Soporta ACME (Let's Encrypt), certificados auto-firmados, Vault, entre otros.

  4. 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 repositorioUsando "Helm"

# Añadir repositorio
helm repo add jetstack https://charts.jetstack.io

--force-update# Actualizar repositorio
helm repo update

# Instalar
helm install cert-manager jetstack/cert-manager \
  --namespace cert-manager --create-namespace \
  --version v1.14.1 \
  --set installCRDs=true

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 "letsencrypt-staging.yaml":

apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
  name: letsencrypt-staging
spec:
  acme:
    # The ACME server URL
    server: https://acme-staging-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-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-prod
    # Enable the HTTP-01 challenge provider
    solvers:
      - http01:
          ingress:
            ingressClassName: nginx

# ClusterIssuer test
kubectl apply -f letsencrypt-staging.yaml

# ClusterIssuer Producción
kubectl apply -f letsencrypt-prod.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-prod # 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