Exposer votre application
Cette page vous guide pour rendre vos applications accessibles — à l’intérieur du cluster ou depuis Internet, en HTTPS avec un certificat automatique.
1. Rendre l’application joignable dans le cluster (Service)
- Ouvrez Service Discovery › Services dans votre namespace.
- Cliquez sur Create et choisissez ClusterIP.
- Remplissez :
- Name :
web - Selectors :
app=nginx-demo(les labels de vos pods) - Port : 80 (port d’écoute de votre conteneur)
- Name :
- Validez avec Create.
kubectl expose deploy/nginx-demo --name web --port 80 -n <namespace>Ou en YAML :
apiVersion: v1kind: Servicemetadata: name: webspec: type: ClusterIP selector: app: nginx-demo ports: - port: 80 targetPort: 80Votre application répond maintenant, depuis n’importe quel pod de vos namespaces, sur :
http://web.<votre-namespace>.svc.cluster.local2. Publier en HTTPS sur votre domaine (Ingress)
Étape 1 : pointez votre domaine
Créez un enregistrement CNAME chez votre fournisseur DNS :
www.example.com → ingress.k-bdkbsh.blackswift.hostingLe guide détaillé par fournisseur (OVHcloud, Gandi, Cloudflare…), y compris le cas
du domaine racine (example.com sans www), est ici :
Configurer votre DNS.
Étape 2 : créez l’Ingress avec certificat automatique
kubectl create ingress web-public -n <namespace> \ --rule "www.example.com/*=web:80,tls=web-tls" \ --annotation cert-manager.io/issuer=letsencryptapiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: web-public annotations: cert-manager.io/issuer: letsencryptspec: rules: - host: www.example.com http: paths: - path: / pathType: Prefix backend: service: name: web port: number: 80 tls: - hosts: ["www.example.com"] secretName: web-tlsSi vous avez déjà un certificat (wildcard d’entreprise…), créez le secret TLS vous-même et omettez l’annotation cert-manager :
kubectl -n <namespace> create secret tls web-tls \ --cert=fullchain.pem --key=privkey.pemPuis référencez web-tls dans la section tls de l’Ingress.
L’annotation cert-manager.io/issuer: letsencrypt déclenche l’émission
automatique d’un certificat Let’s Encrypt (généralement en 1 à 2 minutes, une fois
le DNS propagé). Suivez l’émission :
kubectl get certificates,challenges -n <namespace>✅ Test : ouvrez
https://www.example.com— votre application s’affiche, avec un certificat valide.
3. Exposer un protocole non-HTTP
Option A — NodePort (inclus, quota 10)
Pour du TCP simple (MQTT, SSH, jeu…) :
kubectl -n <namespace> expose deploy/<deployment> \ --type=NodePort --port=<port> --name=<service-name>⚠️ Deux conditions pour que le service soit joignable depuis Internet :
- Ajoutez le label
exposition: publicsur vos pods (pas sur le Service) — sans lui, la politique réseau bloque le trafic externe ; - Relevez le port attribué (
kubectl get svc -n <namespace>) et connectez-vous surnodeport.k-bdkbsh.blackswift.hosting:<node-port>.
À savoir : un NodePort ne peut pas être restreint par adresse IP source — une
fois exposé, le port répond à tout Internet. Si vous devez limiter l’accès à
certaines IP (VPN d’entreprise, partenaires…), utilisez un LoadBalancer et son
loadBalancerSourceRanges (ci-dessous), ou gérez la restriction dans
l’application.
Option B — LoadBalancer (option payante, IP dédiée)
Pour une IP publique dédiée avec le port de votre choix :
apiVersion: v1kind: Servicemetadata: name: mon-service-publicspec: type: LoadBalancer externalTrafficPolicy: Cluster # recommandé — voir ci-dessous loadBalancerSourceRanges: # optionnel : IP sources autorisées - 203.0.113.0/24 - 198.51.100.42/32 selector: app: mon-app # pods qui doivent porter le label exposition: public ports: - port: 5432- Tarif : 0,02 €/h par LoadBalancer ;
- Quota : 1 par namespace — si votre namespace affiche encore
services.loadbalancers: 0, demandez l’activation via ticket ; - Le label
exposition: publicest requis sur les pods ciblés ; loadBalancerSourceRangesrestreint l’accès aux plages d’IP listées (CIDR) — c’est l’avantage du LoadBalancer sur le NodePort, qui ne le permet pas. Omettez le champ pour un service ouvert à tous ;- Gardez
externalTrafficPolicy: Cluster(notre recommandation) : les nœuds du cluster sont répartis sur plusieurs régions, et en modeLocalle LoadBalancer ne peut servir que les pods hébergés dans sa région — si vos pods sont planifiés ailleurs, le service ne répond plus. En modeCluster, le trafic est routé vers vos pods où qu’ils soient ; la contrepartie est que l’adresse IP source vue par l’application est celle du réseau interne, pas celle du client (la restrictionloadBalancerSourceRangesreste appliquée en amont, elle).
Récapitulatif
| Besoin | Objet K8s | Accès |
|---|---|---|
| Interne au cluster | Service ClusterIP | <svc>.<ns>.svc.cluster.local |
| HTTP(S) public | Ingress + Service | votre domaine (CNAME) |
| TCP public mutualisé | NodePort + label exposition: public | nodeport.k-bdkbsh.blackswift.hosting:<port> |
| TCP public, IP dédiée | LoadBalancer + label exposition: public | IP dédiée (0,02 €/h) |
Un problème d’exposition ? Voir Problème de connexion ou de réseau.