1.kubernetes
ssl
First Time

Use SSL with Ingress

Process

  1. Add the Jetstack Helm repository
  2. Install Cert-Manager CRDs
  3. Install Cert-Manager
  4. Create secret with Cloudflare API token
  5. Create ClusterIssuer
  6. Create Certificate Resource (optional)
  7. Create Ingress with TLS Configuration

Add the Jetstack Helm repository

helm repo add jetstack https://charts.jetstack.io
helm repo update

Install Cert-Manager CRDs

kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.13.3/cert-manager.crds.yaml

Install Cert-Manager

helm install \
  cert-manager jetstack/cert-manager \
  --namespace cert-manager \
  --create-namespace \
  --version v1.13.3

Verify Installation

kubectl get pods -n cert-manager

Create secret with Cloudflare API token

kubectl create secret generic cloudflare-token \
  -n cert-manager \
  --from-literal=token=YOUR_CLOUDFLARE_API_TOKEN

Create ClusterIssuer

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-dns-cloudflare
  namespace: cert-manager
spec:
  acme:
    email: [email protected]
    server: https://acme-v02.api.letsencrypt.org/directory
    privateKeySecretRef:
      name: letsencrypt-account-key
    solvers:
    - dns01:
        cloudflare:
          apiTokenSecretRef:
            name: cloudflare-token
            key: token

Create Certificate Resource (optional)

apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: example-tls-cert
  namespace: cert-manager
spec:
  secretName: example-tls-secret
  issuerRef:
    name: letsencrypt-dns-cloudflare
    kind: ClusterIssuer
  dnsNames:
    - example.com
    - '*.example.com'  # Wildcard certificate

Create Ingress with TLS Configuration

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: your-app-ingress
  annotations:
    # Specify the DNS challenge issuer
    cert-manager.io/cluster-issuer: letsencrypt-dns-cloudflare
    # Optional: Traefik specific annotations
    traefik.ingress.kubernetes.io/router.entrypoints: websecure
    traefik.ingress.kubernetes.io/router.tls: "true"
spec:
  ingressClassName: traefik
  tls:
  - hosts:
    - example.com
    - '*.example.com'  # Wildcard certificate
    secretName: example-tls-secret
  rules:
  - host: example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: your-service
            port:
              number: 80