Introduction : Pourquoi Kubernetes pour Node.js ?
Les applications web modernes en JavaScript (Node.js) nécessitent une haute disponibilité, une scalabilité et une tolérance aux pannes. Lorsque votre application dépasse le cadre d'un seul serveur, la gestion manuelle devient un cauchemar. C'est là qu'intervient Kubernetes (K8s) — un système d'orchestration de conteneurs qui automatise le déploiement, la mise à l'échelle et la gestion des applications.
Dans ce guide, nous allons parcourir le chemin complet : d'une simple application Node.js à son exécution dans un environnement de type production sur Kubernetes. Vous apprendrez à empaqueter le code dans une image Docker, à créer les ressources K8s nécessaires (Pod, Deployment, Service) et à configurer l'accès depuis l'extérieur.
1. Préparation de l'application Node.js
Pour commencer, créons une simple application Express. Elle répondra aux requêtes HTTP et affichera le nom d'hôte du conteneur (utile pour vérifier l'équilibrage de charge).
1.1. Fichier app.js
const express = require('express');const os = require('os');
const app = express();const PORT = process.env.PORT || 3000;
app.get('/', (req, res) => { res.json({ message: 'Hello from Node.js on Kubernetes!', hostname: os.hostname(), timestamp: new Date().toISOString() });});
app.listen(PORT, () => { console.log(`Server running on port ${PORT}`);});1.2. Fichier package.json
{ "name": "k8s-node-app", "version": "1.0.0", "dependencies": { "express": "^4.18.2" }, "scripts": { "start": "node app.js" }}2. Conteneurisation : Image Docker
Kubernetes fonctionne avec des conteneurs. Créons un Dockerfile minimal pour notre application Node.js. Nous utilisons l'image officielle Node.js et une construction multi-étapes pour optimiser la taille.
2.1. Dockerfile
FROM node:18-alpine AS builderWORKDIR /appCOPY package*.json ./RUN npm ci --only=production
FROM node:18-alpineWORKDIR /appCOPY --from=builder /app/node_modules ./node_modulesCOPY . .EXPOSE 3000CMD ["node", "app.js"]Construisez l'image et envoyez-la sur Docker Hub ou un autre registre :
docker build -t your-dockerhub/k8s-node-app:v1 .docker push your-dockerhub/k8s-node-app:v13. Déploiement sur Kubernetes
Passons maintenant à l'essentiel — la création des ressources Kubernetes. Nous utiliserons un Deployment (pour gérer les Pods) et un Service (pour l'accès réseau).
3.1. Création du Deployment
Le Deployment garantit que le nombre requis de Pods avec votre application est toujours en cours d'exécution. Créez le fichier deployment.yaml :
apiVersion: apps/v1kind: Deploymentmetadata: name: node-app-deployment labels: app: node-appspec: replicas: 3 selector: matchLabels: app: node-app template: metadata: labels: app: node-app spec: containers: - name: node-app image: your-dockerhub/k8s-node-app:v1 ports: - containerPort: 3000 env: - name: PORT value: "3000" resources: requests: memory: "64Mi" cpu: "100m" limits: memory: "128Mi" cpu: "200m"3.2. Création du Service
Le Service fournit une adresse IP stable et un nom DNS pour accéder aux Pods. Créez service.yaml :
apiVersion: v1kind: Servicemetadata: name: node-app-servicespec: selector: app: node-app ports: - protocol: TCP port: 80 targetPort: 3000 type: ClusterIP3.3. Lancement sur le cluster
Exécutez les commandes (assurez-vous au préalable que kubectl est configuré et que vous avez accès au cluster) :
kubectl apply -f deployment.yamlkubectl app