Je vais créer 3 exercices sur Kubernetes de difficulté croissante basés sur le contenu que vous avez partagé. Chaque exercice sera accompagné de sa solution.
Objectif : Déployer un serveur web nginx dans un pod Kubernetes avec des contraintes de ressources.
Tâches :
web-app.yaml
avec le contenu suivant :apiVersion: v1
kind: Pod
metadata:
name: web-app
spec:
containers:
- name: nginx
image: nginx:1.27
ports:
- containerPort: 80
resources:
requests:
memory: "256Mi"
cpu: "0.2"
limits:
memory: "256Mi"
cpu: "0.5"
kubectl apply -f web-app.yaml
kubectl get pod web-app
kubectl describe pod web-app
Objectif : Mettre en place une application backend avec configuration externalisée et accessibilité réseau interne.
Tâches :
APP_ENV
: "production"LOG_LEVEL
: "info"apiVersion: v1
kind: ConfigMap
metadata:
name: backend-config
data:
APP_ENV: production
LOG_LEVEL: info
apiVersion: apps/v1
kind: Deployment
metadata:
name: backend-api
labels:
app: backend-api
spec:
replicas: 3
selector:
matchLabels:
app: backend-api
template:
metadata:
labels:
app: backend-api
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
env:
- name: APP_ENV
valueFrom:
configMapKeyRef:
name: backend-config
key: APP_ENV
- name: LOG_LEVEL
valueFrom:
configMapKeyRef:
name: backend-config
key: LOG_LEVEL
apiVersion: v1
kind: Service
metadata:
name: backend-service
spec:
selector:
app: backend-api
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIP
kubectl apply -f backend-config.yaml
kubectl apply -f backend-api.yaml
kubectl apply -f backend-service.yaml
kubectl get cm backend-config
kubectl get deployment backend-api
kubectl get service backend-service
kubectl get pods -l app=backend-api
Objectif : Créez une application complète comprenant un frontend et un backend avec les composants suivants :
Tâches :
Un PersistentVolume de 1Gi nommé "data-pv" avec une politique de récupération "Retain".
Un PersistentVolumeClaim nommé "data-pvc" qui demande 500Mi de stockage.
Un Déploiement db-backend
avec 1 réplica qui utilise l'image postgres:16
et monte le PVC data-pvc
sur /var/lib/postgresql/data
. Le déploiement doit définir les variables d'environnement suivantes à partir d'un Secret nommé db-credentials
:
POSTGRES_USER
POSTGRES_PASSWORD
POSTGRES_DB
Exposer le service db-backend
avec un Service ClusterIP
simple
Un Secret db-credentials
contenant les informations de connexion à la base de données.
Un Déploiement web-frontend
avec 2 réplicas utilisant l'image nginx:latest
et exposé via un Service de type NodePort sur le port 30080.
Une NetworkPolicy qui autorise uniquement le trafic du frontend vers le backend et bloque tout autre trafic entrant vers le backend.
apiVersion: v1
kind: PersistentVolume
metadata:
name: data-pv
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: local-path
hostPath:
path: /mnt/data
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: data-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 500Mi
apiVersion: v1
kind: Secret
metadata:
name: db-credentials
type: Opaque
stringData:
POSTGRES_USER: dbuser
POSTGRES_PASSWORD: securepassword
POSTGRES_DB: appdb
apiVersion: apps/v1
kind: Deployment
metadata:
name: db-backend
labels:
app: db-backend
spec:
replicas: 1
selector:
matchLabels:
app: db-backend
template:
metadata:
labels:
app: db-backend
spec:
containers:
- name: postgres
image: postgres:16
ports:
- containerPort: 5432
envFrom:
- secretRef:
name: db-credentials
volumeMounts:
- name: postgres-data
mountPath: /var/lib/postgresql/data
volumes:
- name: postgres-data
persistentVolumeClaim:
claimName: data-pvc
apiVersion: v1
kind: Service
metadata:
name: db-service
spec:
selector:
app: db-backend
ports:
- protocol: TCP
port: 5432
targetPort: 5432
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-frontend
labels:
app: web-frontend
spec:
replicas: 2
selector:
matchLabels:
app: web-frontend
template:
metadata:
labels:
app: web-frontend
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
apiVersion: v1
kind: Service
metadata:
name: frontend-service
spec:
selector:
app: web-frontend
ports:
- protocol: TCP
port: 80
targetPort: 80
nodePort: 30080
type: NodePort
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: db-network-policy
spec:
podSelector:
matchLabels:
app: db-backend
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: web-frontend
ports:
- protocol: TCP
port: 5432
kubectl apply -f data-pv.yaml
kubectl apply -f data-pvc.yaml
kubectl apply -f db-credentials.yaml
kubectl apply -f db-backend.yaml
kubectl apply -f db-service.yaml
kubectl apply -f web-frontend.yaml
kubectl apply -f frontend-service.yaml
kubectl apply -f db-network-policy.yaml
kubectl get pv,pvc
kubectl get secrets
kubectl get deployments
kubectl get services
kubectl get pods
kubectl get networkpolicies