Créer un Service Kubernetes de type ExternalName et le sécuriser avec Let’s Encrypt via un Ingress

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.


Objectif

  1. Créer un Service ExternalName qui redirige les requêtes vers un nom DNS externe, par exemple api.externe.monsite.test.com.
  2. Configurer un Ingress pour exposer ce service sur un domaine accessible publiquement.
  3. 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 :

  1. 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
  2. Un Ingress Controller fonctionnel (par exemple, NGINX ou Traefik). Vérifiez son état avec :
    kubectl get pods -n ingress-nginx
  3. Un domaine configuré pour pointer vers l’IP publique de votre Ingress Controller. Par exemple, service.monsite.test.com.
  4. 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é dans hosts.
  • secretName : Nom du secret Kubernetes contenant le certificat généré.
  • cert-manager.io/cluster-issuer : Annotation qui indique quel ClusterIssuer utiliser (ici letsencrypt-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 :

  1. Créez un enregistrement A ou CNAME pour le domaine.
  2. Assurez-vous qu’il pointe vers l’IP de votre Ingress Controller (vérifiez avec kubectl get svc -n ingress-nginx).

Tester la configuration

  1. 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
  2. Vérifiez que l’Ingress a été appliqué et que Cert-Manager a généré un certificat :
    kubectl describe ingress service-ingress
  3. 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.