Pourquoi Kubernetes pour les débutants ?
Kubernetes est un orchestrateur de conteneurs qui permet de déployer, exécuter et gérer des applications sur un cluster de machines virtuelles. Il offre une solution complète pour la mise en production d'applications modernes, en assurant la haute disponibilité, la scalabilité et la gestion des mises à jour.
Un cas d'usage concret : Vous travaillez chez une startup qui déploie une application web avec plusieurs services backend et frontend. Chaque service s'exécute sur une machine virtuelle différente. A chaque fois que vous faites un changement, vous devez manuellement redémarrer les services, vérifier leur disponibilité et appliquer les mises à jour une par une. Avec Kubernetes, ces tâches se font automatiquement grâce à des déploiements répétitifs et des états de santé.
Prerequis
- Connaissances en programmation (JavaScript, Python, etc.)
- Familiarité avec Docker
- Un environnement d'édition texte comme Visual Studio Code
- Kubernetes CLI installé (version 1.20+)
- Minikube installé pour tester Kubernetes localement (version 1.20+)
Concepts fondamentaux
Déploiement (Deployment)
Un déploiement est une ressource Kubernetes qui définit comment déployer et mettre à jour des applications. Il garantit que le nombre spécifié de réplicas d'un service est en cours d'exécution.
## Définition d'un déploiement simple
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-container
image: nginx:latest
ports:
- containerPort: 80
Service (Service)
Un service permet d'exposer une application en lui attribuant une adresse IP persistante. Il peut également gérer la distribution des trafic entre les réplicas de l'application.
## Définition d'un service pour un déploiement
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 80
ConfigMap (ConfigMap)
Un configmap est une ressource Kubernetes qui stocke des données sous forme de clés-valeurs. Elles sont souvent utilisées pour passer des variables d'environnement ou des fichiers de configuration à l'intérieur des conteneurs.
## Définition d'un ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
name: my-configmap
data:
app-config.yaml: |
apiUrl: "https://api.example.com"
Secret (Secret)
Un secret est similaire à un configmap, mais il est utilisé pour stocker des informations sensibles comme les mots de passe ou les clés API.
## Définition d'un Secret
apiVersion: v1
kind: Secret
metadata:
name: my-secret
type: Opaque
data:
username: YWRtaW4= # base64 encoding of "admin"
password: MWYyZDFlMmU2N2RjYzQzMDE0NTJlMDk=
Mise en pratique : projet fil rouge
Nous allons créer un simple application web déployée avec Kubernetes. L'application sera une page qui affiche "Bonjour, Kubernetes!".
Étape 1 : Créer le fichier HTML
Créons un fichier index.html dans un répertoire app.
<!-- app/index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Kubernetes App</title>
</head>
<body>
<h1>Bonjour, Kubernetes!</h1>
</body>
</html>
Étape 2 : Créer le fichier Dockerfile
Créons un Dockerfile pour construire l'image Docker de notre application.
## app/Dockerfile
FROM nginx:alpine
COPY index.html /usr/share/nginx/html/index.html
Étape 3 : Construire et push l'image Docker
Utilisons Docker pour construire et push l'image sur un registry (Docker Hub, Google Container Registry, etc.).
## Build the Docker image
docker build -t my-kubernetes-app:latest .
## Push the Docker image to a registry
docker tag my-kubernetes-app:latest your-dockerhub-username/my-kubernetes-app:latest
docker push your-dockerhub-username/my-kubernetes-app:latest
Étape 4 : Créer le fichier de déploiement
Créons un fichier deployment.yaml pour définir notre déploiement Kubernetes.
## deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
spec:
replicas: 3
selector:
matchLabels:
app: kubernetes-app
template:
metadata:
labels:
app: kubernetes-app
spec:
containers:
- name: my-container
image: your-dockerhub-username/my-kubernetes-app:latest
ports:
- containerPort: 80
Étape 5 : Créer le fichier de service
Créons un fichier service.yaml pour définir notre service Kubernetes.
## service.yaml
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: kubernetes-app
ports:
- protocol: TCP
port: 80
targetPort: 80
Étape 6 : Déployer les ressources
Utilisons kubectl pour déployer nos ressources sur Kubernetes.
## Apply the deployment and service configurations
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
Erreurs frequentes et debugging
Erreur : Service n'est pas accessible.
- Cause : Le service n'est pas correctement configuré pour atteindre les pods.
- Correction :
# Corrected deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: my-deployment spec: replicas: 3 selector: matchLabels: app: kubernetes-app template: metadata: labels: app: kubernetes-app spec: containers: - name: my-container image: your-dockerhub-username/my-kubernetes-app:latest ports: - containerPort: 80 # Corrected service.yaml apiVersion: v1 kind: Service metadata: name: my-service spec: selector: app: kubernetes-app ports: - protocol: TCP port: 80 targetPort: 80Erreur : Pod ne s'exécute pas.
- Cause : L'image Docker n'est pas trouvée ou est incorrecte.
- Correction :
# Check the pod status kubectl get pods # Correct the image name in deployment.yaml if neededErreur : ConfigMap n'est pas correctement appliquée.
- Cause : La clé ou la valeur dans le ConfigMap est incorrecte.
- Correction :
# Check the configmap kubectl get configmap my-configmap # Correct the configmap.yaml if needed
Pour aller plus loin
- Déploiement avec des volumes persistants : Explorez la façon de persister les données avec des volumes.
- Autoscaling : Utilisez l'autoscaler pour augmenter ou diminuer le nombre de réplicas en fonction du trafic.
- Mise à jour canary : Déployez une version de mise à jour sans affecter complètement les utilisateurs.
Défi pratique
Déployez une application Node.js simple sur Kubernetes qui affiche un message dynamique basé sur l'heure actuelle. Utilisez des ConfigMaps pour passer le message et des Services pour exposer l'application.
Indices :
- Créez un fichier
app.jspour votre application Node.js. - Utilisez une ConfigMap pour stocker le message.
- Mettez en place une stratégie de déploiement canary.