What Is cert-manager?
cert-manager automates TLS certificate management in Kubernetes. Issue certificates from Letβs Encrypt, Vault, Venafi, or any ACME-compatible CA β with automatic renewal. CNCF Graduated, 12K+ stars.
Installation
helm repo add jetstack https://charts.jetstack.io
helm install cert-manager jetstack/cert-manager \
--namespace cert-manager \
--create-namespace \
--set crds.enabled=trueClusterIssuer (Letβs Encrypt)
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: admin@yourdomain.com
privateKeySecretRef:
name: letsencrypt-prod-key
solvers:
- http01:
ingress:
class: nginx
- dns01:
cloudDNS:
project: my-gcp-project
selector:
dnsZones:
- "yourdomain.com"Automatic Certificate for Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-app
annotations:
cert-manager.io/cluster-issuer: "letsencrypt-prod"
spec:
tls:
- hosts:
- app.yourdomain.com
secretName: app-tls # cert-manager creates this automatically
rules:
- host: app.yourdomain.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-app
port:
number: 8080Thatβs it. cert-manager will:
- Detect the annotation
- Request a certificate from Letβs Encrypt
- Complete the HTTP-01 or DNS-01 challenge
- Store the cert in the
app-tlsSecret - Renew automatically 30 days before expiry
Wildcard Certificates (DNS-01)
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: wildcard-cert
namespace: default
spec:
secretName: wildcard-tls
issuerRef:
name: letsencrypt-prod
kind: ClusterIssuer
dnsNames:
- "yourdomain.com"
- "*.yourdomain.com"Wildcard requires DNS-01 challenge (not HTTP-01).
Internal CA (HashiCorp Vault)
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: vault-issuer
spec:
vault:
server: https://vault.example.com
path: pki_int/sign/kubernetes
auth:
kubernetes:
role: cert-manager
mountPath: /v1/auth/kubernetes
serviceAccountRef:
name: cert-managerCertificate Lifecycle
βββββββββββββββ ββββββββββββββββ βββββββββββββββ
β CertificateββββββΆβ CertRequest ββββββΆβ Order β
β (desired) β β (internal) β β (ACME) β
βββββββββββββββ ββββββββββββββββ ββββββββ¬βββββββ
β
ββββββββββββββββ βββββββββΌβββββββ
β Secret βββββββ Challenge β
β (TLS cert) β β (HTTP/DNS) β
ββββββββββββββββ ββββββββββββββββ
β
Auto-renew at 66% lifetimeMonitoring
# PrometheusRule for cert-manager
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
spec:
groups:
- name: cert-manager
rules:
- alert: CertificateExpiringSoon
expr: certmanager_certificate_expiration_timestamp_seconds - time() < 7*24*3600
labels:
severity: warning
annotations:
summary: "Certificate {{ $labels.name }} expires in 7 days"