Dans cet article, nous allons explorer comment configurer un service Kubernetes de type ExternalName pour rediriger les requêtes vers une ressource externe, puis le sécuriser avec un certificat SSL généré automatiquement via Let’s Encrypt grâce à Cert-Manager et un Ingress.
Table of Contents
Objectif
- Créer un Service ExternalName qui redirige les requêtes vers un nom DNS externe, par exemple
api.externe.monsite.test.com
. - Configurer un Ingress pour exposer ce service sur un domaine accessible publiquement.
- Ajouter un certificat SSL avec Let’s Encrypt pour sécuriser les communications en HTTPS.
Prérequis
Avant de commencer, assurez-vous que votre cluster Kubernetes est prêt avec les éléments suivants :
- Cert-Manager installé sur votre cluster pour gérer les certificats SSL.
Vous pouvez suivre la documentation officielle pour son installation. Exemple rapide d’installation :kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.13.0/cert-manager.yaml
- Un Ingress Controller fonctionnel (par exemple, NGINX ou Traefik). Vérifiez son état avec :
kubectl get pods -n ingress-nginx
- Un domaine configuré pour pointer vers l’IP publique de votre Ingress Controller. Par exemple,
service.monsite.test.com
. - Un ClusterIssuer configuré pour Let’s Encrypt. Voici un exemple de configuration pour Let’s Encrypt en production :
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: [email protected] # Remplacez par votre email
privateKeySecretRef:
name: letsencrypt-prod
solvers:
- http01:
ingress:
class: nginx
Créer un Service de type ExternalName
Le Service de type ExternalName agit comme un alias DNS. Il permet à Kubernetes de rediriger les requêtes vers un nom DNS externe, sans proxy ou forwarding.
Voici un manifest YAML pour un Service qui pointe vers api.externe.monsite.test.com
:
apiVersion: v1
kind: Service
metadata:
name: service-external
namespace: default
spec:
type: ExternalName
externalName: api.externe.monsite.test.com
type: ExternalName
: Indique que le service redirige les requêtes vers un DNS externe.externalName
: Le nom DNS cible à résoudre.
Appliquez ce fichier avec la commande suivante :
kubectl apply -f service-external.yaml
Configurer un Ingress avec TLS via Let’s Encrypt
Une fois le Service créé, nous allons configurer un Ingress pour exposer ce service. Le certificat SSL sera généré automatiquement par Let’s Encrypt via Cert-Manager.
Voici le fichier YAML pour l’Ingress :
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: service-ingress
namespace: default
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
cert-manager.io/cluster-issuer: "letsencrypt-prod" # Assurez-vous que le ClusterIssuer existe
spec:
tls:
- hosts:
- service.monsite.test.com # Remplacez par votre domaine
secretName: service-tls # Nom du secret où le certificat sera stocké
rules:
- host: service.monsite.test.com # Remplacez par votre domaine
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: service-external
port:
number: 80 # Le port utilisé par le DNS cible
tls
: Configure le certificat SSL pour le domaine spécifié danshosts
.secretName
: Nom du secret Kubernetes contenant le certificat généré.cert-manager.io/cluster-issuer
: Annotation qui indique quel ClusterIssuer utiliser (iciletsencrypt-prod
).
Appliquez ce fichier avec :
kubectl apply -f service-ingress.yaml
Configurer votre DNS
Pour que votre Ingress soit accessible, le domaine configuré (service.monsite.test.com
) doit pointer vers l’IP publique de votre Ingress Controller.
Si vous utilisez un fournisseur DNS comme Cloudflare, Google DNS, ou autre :
- Créez un enregistrement A ou CNAME pour le domaine.
- Assurez-vous qu’il pointe vers l’IP de votre Ingress Controller (vérifiez avec
kubectl get svc -n ingress-nginx
).
Tester la configuration
- Vérifiez que le Service de type ExternalName a été correctement créé :
kubectl get svc service-external
Vous devriez voir une sortie similaire à celle-ci :NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service-external ExternalName <none> api.externe.monsite.test.com 80/TCP 10m
- Vérifiez que l’Ingress a été appliqué et que Cert-Manager a généré un certificat :
kubectl describe ingress service-ingress
- Testez dans votre navigateur ou via
curl
:curl -k https://service.monsite.test.com
Vous devriez obtenir une réponse sécurisée en HTTPS.
Conclusion
En suivant ces étapes, vous avez configuré un Service Kubernetes de type ExternalName pour rediriger les requêtes vers un DNS externe, exposé ce service via un Ingress, et sécurisé le tout avec un certificat SSL Let’s Encrypt.
Points importants :
- Vérifiez que le DNS externe (
api.externe.monsite.test.com
) est opérationnel et répond sur le bon port. - Le certificat généré protège uniquement les connexions jusqu’à votre Ingress.
Ce tutoriel peut être adapté à d’autres cas d’usage similaires, comme la redirection de services internes ou la gestion de configurations multicluster.