Aller au contenu principal

Comment déployer un Ingress avec TLS

Ce guide explique comment exposer une application en HTTPS avec un certificat TLS automatique sur un cluster Kubernetes Hikube, en utilisant les addons Cert-Manager et Ingress NGINX.

Prérequis​

  • Un cluster Kubernetes Hikube déployé (voir le démarrage rapide)
  • Le kubeconfig du cluster téléchargé depuis la console (bouton Kubeconfig, réservé aux administrateurs du projet)
  • Un nom de domaine dont vous gérez la zone DNS

Étapes​

1. Activer les addons Cert-Manager et Ingress NGINX​

Les deux addons sont cochés par défaut à la création d'un cluster. Pour vérifier ou les activer sur un cluster existant :

  1. Dans Infrastructure > Kubernetes, ouvrez la page de détail du cluster : la section Extensions liste les addons actifs.
  2. S'ils n'y figurent pas, cliquez sur Modifier, cochez Cert-Manager et Ingress NGINX dans la section Extensions & Addons, puis cliquez sur Enregistrer.

2. Vérifier le groupe de nœuds exposé​

Le contrôleur Ingress NGINX s'exécute sur les nœuds des groupes marqués Exposé sur internet (IP Publique). Le premier groupe du cluster l'est toujours. Pour dédier un autre groupe au trafic entrant, activez cette option sur sa carte dans la section Groupes de nœuds de la page Modifier.

astuce

Dédier un groupe de nœuds à l'Ingress permet d'isoler le trafic entrant et de dimensionner indépendamment les ressources d'exposition HTTP/HTTPS.

3. Récupérer l'IP externe et configurer le DNS​

export KUBECONFIG=~/Downloads/kubeconfig-<nom-du-cluster>.yaml

# Pods Cert-Manager et Ingress NGINX
kubectl get pods -A | grep -E "cert-manager|ingress-nginx"

# IP externe du contrôleur Ingress NGINX (colonne EXTERNAL-IP)
kubectl get svc -A | grep ingress-nginx-controller

Créez chez votre fournisseur DNS un enregistrement A qui pointe votre domaine (par exemple app.example.com) vers cette IP externe.

4. Créer un émetteur de certificats​

Déclarez un ClusterIssuer Let's Encrypt, qui validera vos domaines par challenge HTTP-01 via Ingress NGINX :

cluster-issuer.yaml
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: admin@example.com
privateKeySecretRef:
name: letsencrypt-prod-account-key
solvers:
- http01:
ingress:
ingressClassName: nginx
kubectl apply -f cluster-issuer.yaml
kubectl get clusterissuer letsencrypt-prod
astuce

Pour vos tests, utilisez d'abord le serveur de staging de Let's Encrypt (https://acme-staging-v02.api.letsencrypt.org/directory) afin de ne pas atteindre les limites de requêtes.

5. Créer un Ingress avec TLS​

Déployez votre application, puis créez un Ingress avec terminaison TLS automatique :

ingress-tls.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-app
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
ingressClassName: nginx
tls:
- hosts:
- app.example.com
secretName: app-tls
rules:
- host: app.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-app
port:
number: 80
kubectl apply -f ingress-tls.yaml
remarque

L'annotation cert-manager.io/cluster-issuer: letsencrypt-prod indique à Cert-Manager d'obtenir automatiquement un certificat pour les domaines de la section tls.

6. Vérifier le certificat​

kubectl get certificate

# Résultat attendu
# NAME READY SECRET AGE
# app-tls True app-tls 2m

kubectl describe certificate app-tls

Vérification​

# Vérifier l'Ingress
kubectl get ingress my-app

# Tester l'accès HTTPS
curl -v https://app.example.com

Résultat attendu :

NAME CLASS HOSTS ADDRESS PORTS AGE
my-app nginx app.example.com 203.0.113.10 80, 443 5m
attention

Le provisionnement du certificat Let's Encrypt peut prendre quelques minutes. Si le certificat reste en état False, vérifiez que votre enregistrement DNS pointe vers l'IP externe du contrôleur Ingress NGINX et que le port 80 est accessible (nécessaire pour la validation HTTP-01).

astuce

Si des pods du cluster doivent joindre vos propres domaines publics (hairpin NAT), activez l'addon Ouroboros.

Pour aller plus loin​