Pourquoi Migrer de Docker Compose vers Kubernetes ?
Dans un environnement moderne où les systèmes d'application deviennent plus complexes et distribués, Docker Compose est une solution populaire pour gérer des applications multi-conteneurs en local. Cependant, lorsque vous souhaitez déployer vos applications dans un environnement production à grande échelle, Kubernetes est souvent le choix préféré.
Le contexte réel de la migration vers Kubernetes est que les entreprises et les développeurs font face aux défis suivants :
- Échelle : Avec Docker Compose, il est difficile d'écheller une application en ajoutant plus de conteneurs. Kubernetes permet une gestion efficace de l'infrastructure pour gérer des milliers d'instances.
- Gestion de la configuration et du déploiement : Kubernetes offre un système de configuration centralisée et robuste, ce qui facilite le déploiement et la mise à jour des applications.
- Maintenance : La maintenance quotidienne des conteneurs avec Docker Compose peut être complexe. Kubernetes fournit des fonctionnalités avancées pour automatiser les tâches administratives.
Un cas d'utilisation concret est un petit e-commerce en ligne qui nécessite une grande disponibilité et une haute performance. En utilisant Kubernetes, le développeur peut s'assurer que son service est disponible 24/7, même si certaines instances de conteneurs tombent en panne.
Prerequis
Connaissances Nécessaires :
- Connaissance des bases de Docker et Docker Compose.
- Compréhension des concepts fondamentaux de Kubernetes (Pods, Services, Deployments, ConfigMaps, Secrets).
- Familiarité avec les outils de ligne de commande (
kubectl,minikube).
Outils à Installer :
Concepts Fondamentaux
Pods
Un Pod est le plus petit unité de déploiement dans Kubernetes. Il peut contenir plusieurs conteneurs, mais généralement, les Pods sont utilisés pour des services simples.
## my-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: nginx:latest
Services
Un Service permet d'exposer un ensemble de Pods et d'offrir des services réseau. Ils sont utilisés pour assurer la haute disponibilité et l'équilibrage du charge.
## my-service.yaml
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 80
Deployments
Un Deployment permet de déployer et de gérer les réplicas d'un Pod. Il offre des fonctionnalités telles que l'auto-scalage, la mise à jour en滚动.
## my-deployment.yaml
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
Mise en Pratique : Projet Fil Rouge
Étape 1 : Créer un Projet Simple
Nous allons créer une application simple qui utilise Flask pour exposer une API de blog.
## Initialiser un nouveau projet Flask
mkdir my-flask-app
cd my-flask-app
echo "Flask==2.0.1" > requirements.txt
pip install -r requirements.txt
Étape 2 : Créer le Fichier app.py
## app.py
from flask import Flask, jsonify
app = Flask(__name__)
@app.route('/posts', methods=['GET'])
def get_posts():
posts = [
{'id': 1, 'title': 'Post 1'},
{'id': 2, 'title': 'Post 2'}
]
return jsonify(posts)
if __name__ == '__main__':
app.run(debug=True)
Étape 3 : Créer le Fichier Dockerfile
## Dockerfile
FROM python:3.8-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "app.py"]
Étape 4 : Construire l'Image Docker et Lancer le Container
## Construire l'image Docker
docker build -t my-flask-app:latest .
## Lancer un container avec Docker Compose
docker-compose up -d
Étape 5 : Créer les Fichiers Kubernetes
my-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: my-flask-app-pod
spec:
containers:
- name: my-flask-app-container
image: my-flask-app:latest
ports:
- containerPort: 5000
my-service.yaml
apiVersion: v1
kind: Service
metadata:
name: my-flask-app-service
spec:
selector:
app: my-flask-app
ports:
- protocol: TCP
port: 80
targetPort: 5000
my-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-flask-app-deployment
spec:
replicas: 3
selector:
matchLabels:
app: my-flask-app
template:
metadata:
labels:
app: my-flask-app
spec:
containers:
- name: my-flask-app-container
image: my-flask-app:latest
ports:
- containerPort: 5000
Étape 6 : Déployer sur Kubernetes
## Créer le cluster minikube
minikube start
## Appliquer les fichiers Kubernetes
kubectl apply -f my-pod.yaml
kubectl apply -f my-service.yaml
kubectl apply -f my-deployment.yaml
## Vérifier l'état des Pods et Services
kubectl get pods
kubectl get services
Étape 7 : Accéder à l'API
minikube service my-flask-app-service --url
Erreurs Frequentes et Debugging
Erreur :
Error from server (NotFound): services "my-flask-app-service" not found- Code Incorrect :
apiVersion: v1 kind: Service metadata: name: my-flask-app-service spec: selector: app: my-flask-app ports: - protocol: TCP port: 80 targetPort: 5000 - Code Correct :
apiVersion: v1 kind: Service metadata: name: my-flask-app-service spec: selector: app: my-flask-app ports: - protocol: TCP port: 80 targetPort: 5000
- Code Incorrect :
Erreur :
Failed to pull image "my-flask-app:latest": no basic auth credentials- Code Incorrect :
FROM python:3.8-slim WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt COPY . . CMD ["python", "app.py"] - Code Correct :
FROM python:3.8-slim WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt COPY . . CMD ["python", "app.py"]
- Code Incorrect :
Erreur :
Unable to pull data from the repository- Code Incorrect :
docker-compose up -d - Code Correct :
kubectl apply -f my-pod.yaml kubectl apply -f my-service.yaml kubectl apply -f my-deployment.yaml
- Code Incorrect :
Pour Aller Plus Loi
Utiliser des ConfigMaps et Secrets
Automatiser le déploiement avec GitOps
Utiliser des Metrics et Logging
Défi Pratique
Défi : Créer un Service avec une ConfigMap et un Secret
- Créez un fichier
config.yamlpour les paramètres de configuration. - Créez un fichier
secret.yamlpour stocker des informations sensibles comme les mots de passe. - Mettez à jour le Deployment pour utiliser la ConfigMap et le Secret.