Scrydon

TLS

Prérequis de certificats TLS pour la Gateway Scrydon

Tous les services doivent être servis via HTTPS. Pour un nom d'hôte public qui atteint directement Traefik, nous recommandons cert-manager avec Let's Encrypt pour le provisionnement automatique des certificats.

Si votre nom d'hôte est strictement privé (app.internal, something.local ou une autre zone non déléguée dans le DNS public), Let's Encrypt ne peut pas émettre de certificat pour lui. Utilisez une CA ACME interne comme step-ca, ou apportez votre propre certificat d'entreprise. Si TLS se termine sur un équilibreur de charge en amont, suivez Déchargement TLS. Consultez Certificats TLS pour le guide de décision complet.

1. Installer cert-manager

# Install cert-manager (if not already present)
helm repo add jetstack https://charts.jetstack.io
helm install cert-manager jetstack/cert-manager \
  --namespace cert-manager --create-namespace \
  --set crds.enabled=true \
  -f cert-manager-values.yaml

La prise en charge Gateway API de cert-manager doit être activée, sinon il ignore l'annotation que le chart pose sur la Gateway et aucun certificat n'est jamais demandé. Elle est désactivée par défaut :

# cert-manager-values.yaml
config:
  apiVersion: controller.config.cert-manager.io/v1alpha1
  kind: ControllerConfiguration
  # Flat, and spelled exactly this way. cert-manager's own docs say
  # `gatewayAPI.enabled`; that shape is rejected by strict decoding and puts the
  # controller into CrashLoopBackOff.
  enableGatewayAPI: true

2. Créer un ClusterIssuer

Le chart ne crée pas l'issuer pour vous. Quand gateway.tls.enabled: true (par défaut), le chart annote la Gateway avec cert-manager.io/cluster-issuer: letsencrypt-prod — une seule annotation pour toute la porte d'entrée, dans les deux modes de routage — mais vous devez créer un ClusterIssuer avec exactement ce nom. Sans cela, le certificat reste bloqué (READY=False, "Issuing certificate as Secret does not exist") et aucun challenge ACME n'est tenté.

# clusterissuer-letsencrypt-prod.yaml — apply once, after cert-manager is running
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod          # MUST match gateway.tls.clusterIssuer (chart default)
spec:
  acme:
    server: https://acme-v02.api.letsencrypt.org/directory
    email: admin@yourdomain.com   # a real address — Let's Encrypt emails expiry notices here
    privateKeySecretRef:
      name: letsencrypt-prod-account-key   # cert-manager CREATES this Secret; do not pre-create it
    solvers:
      - http01:
          gatewayHTTPRoute:
            parentRefs:
              - kind: Gateway
                name: gateway-frontdoor     # la Gateway générée par le chart
                namespace: scrydon-platform # l'espace de noms de la plateforme, quelle que soit la topologie

La route du solveur se rattache au listener en clair de la Gateway, que le chart laisse volontairement sans nom d'hôte dans les deux modes de routage, précisément pour qu'un challenge ACME sur n'importe quel nom d'hôte puisse y être résolu.

kubectl apply -f clusterissuer-letsencrypt-prod.yaml
kubectl get clusterissuer letsencrypt-prod   # wait for READY=True

privateKeySecretRef.name n'est pas un secret que vous fournissez. cert-manager génère une clé de compte ACME lors de la première réconciliation et la stocke sous ce nom dans le namespace cert-manager. La seule valeur que vous devez fournir est un vrai email.

Pointez le DNS vers l'IP LoadBalancer de Traefik avant de créer un issuer de production. Let's Encrypt valide via HTTP-01 en récupérant http://<your-host>/.well-known/acme-challenge/..., donc le nom d'hôte doit résoudre publiquement vers l'IP du contrôleur et le port 80 doit être joignable. Émettre en production avec un DNS incorrect peut déclencher la limite de "5 validations échouées par nom d'hôte par heure". Réduisez le risque avec le serveur staging (https://acme-staging-v02.api.letsencrypt.org/directory, issuer letsencrypt-staging, et gateway.tls.clusterIssuer: letsencrypt-staging), confirmez l'émission, puis passez en production.

Si vous utilisez un autre nom d'issuer, définissez-le dans vos valeurs :

gateway:
  tls:
    enabled: true
    clusterIssuer: my-issuer   # defaults to letsencrypt-prod

3. Vérifier l'émission

kubectl get clusterissuer                  # No resources found here = the cause; go back to step 2
kubectl get gateway -n scrydon-platform    # PROGRAMMED=True, listeners Accepted
kubectl get certificate -A                 # the chart's cert flips to READY=True
kubectl describe challenge -A              # if stuck: shows the HTTP-01 / DNS error

Si aucun Certificate n'apparaît du tout, cert-manager n'observe pas les Gateways — revenez à l'étape 1 et vérifiez config.enableGatewayAPI: true.

Vous pouvez aussi fournir vos propres certificats comme Secrets TLS Kubernetes, utiliser un issuer ACME interne ou terminer TLS sur un équilibreur de charge devant le cluster. Voir Certificats TLS et Déchargement TLS.

Sur cette page

Sur cette page