Exposer un service
Cette page vous guide, pas à pas, pour rendre vos applications accessibles — que ce soit à l’intérieur du cluster ou depuis Internet — quand on n’a jamais touché à Kubernetes.
1. Rendre l’application disponible dans le cluster
-
Ouvrez Service Discovery → Services dans votre namespace
c‑acme‑rtximz‑prod. -
Cliquez sur Create.
-
Remplissez :
- Name :
api-internal - Target : sélecteur
app=api - Port : 80 (port de votre conteneur)
- Name :
-
Laissez Service type sur ClusterIP puis Create.
Votre application répond maintenant sur :
http://api-internal.c-acme-rtximz-prod.svc.cluster.local:80En YAML (si vous préférez kubectl)
apiVersion: v1kind: Servicemetadata: name: api-internal namespace: c-acme-rtximz-prodspec: type: ClusterIP selector: app: api ports: - port: 80 # Port exposé par le service targetPort: 80 # Port du conteneurkubectl apply -f service-internal.yaml2. Publier une application web (HTTPS)
Étape 1 : DNS
Créez un CNAME :
www.example.com ▶︎ ingress.bseufr01.blackswift.hostingApex CNAME
Apex CNAME ** (example.com) : possible seulement si votre fournisseur DNS
supporte ALIAS/ANAME ou CNAME flattening (Route 53, Cloudflare, Gandi…).
Ne pointez pas vers la ou les adresses A derrière ingress.bseufr01.blackswift.hosting, nous pouvons être amenés à les changer sans préavis.
Étape 2 : Service interne
kubectl expose deploy/<deployment-name> \ --name <service-name> \ --port <target-port> \ --namespace <namespace>
# Exemple :
kubectl expose deploy/web \ --name web \ --port 80 \ --namespace c-acme-rtximz-prodÉtape 3 : Ingress HTTPS
Option A — automatique (Let’s Encrypt)
kubectl create ingress <ingress-name> -n <namespace> \ --rule "<hostname>/*=<service-name>:<service-port>,tls=<secret-name-to-create>" \ --annotation cert-manager.io/issuer=letsencrypt
# Exemple:
kubectl create ingress web-public -n c-acme-rtximz-prod \ --rule "www.example.com/*=web:80,tls=web-tls" \ --annotation cert-manager.io/issuer=letsencryptOption B — certificat perso
kubectl -n <namespace> create secret tls <secret-name> \ --cert=<cert-file-path> --key=<key-file-path>
# Exemple :
kubectl -n c-acme-rtximz-prod create secret tls example-tls \ --cert=fullchain.pem --key=privkey.pemPuis :
apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: web-public namespace: c-acme-rtximz-prodspec: tls: - hosts: ["www.example.com"] secretName: example-tls rules: - host: www.example.com http: paths: - path: / pathType: Prefix backend: service: name: web port: number: 80✅ Test : ouvrez
https://www.example.com→ la page Nginx s’affiche.
3. Publier un service non‑HTTP (NodePort)
Besoin d’exposer une base de données, du MQTT, un SSH ou un jeu ? Utilisez un NodePort.
Raccourci CLI
# Créer le service NodePort pour exposer un Deploymentkubectl -n <namespace> expose deploy/<deployment-name> \ --type=NodePort --port=<port> --name=<service-name>⚠️ Par défaut vos conteneurs sont protégés et ne sont pas joignables en dehors de vos namespaces, même exposés par un NodePort. Pour autoriser les connexions depuis l’extérieur, vous devez ajouter le label
exposition=publicsur vos pods.
Repérez le port assigné :
kubectl get svc <service-name> -n <namespace>NAME TYPE PORT(S) NODE-PORT<service-name> NodePort <container-port>/TCP <node-port>Votre pouvez alors vous connecter sur nodeport.bseufr01.blackswift.hosting:<node-port>
Récap rapide
| Besoin | Objet K8s | URL / Hostname |
|---|---|---|
| Interne seulement | Service ClusterIP | svcname.<ns>.svc.cluster.local |
| HTTP(s) public | Ingress + Service | votredomaine.com (CNAME vers ingress) |
| Autre protocole public | NodePort + label exposition=public sur les pods | nodeport.<cluster>.blackswift.hosting:<port> |
Vous êtes prêts à exposer vos applications ! En cas de doute, ouvrez un ticket ou passez sur notre Slack communautaire. 😉