Cette section répertorie les problèmes les plus couramment rencontrés par les participants à la formation, avec leurs solutions détaillées et des conseils de prévention.
Jour 1 - Problèmes de base
1. Gitea ne démarre pas après l'installation
Problème :
Code
docker-compose up -d# Gitea container exits immediately
Causes possibles :
Permissions incorrectes sur les volumes
Port 3000 déjà utilisé
Base de données non accessible
Solution étape par étape :
Code
# 1. Vérifier les ports occupéssudo netstat -tlnp | grep :3000# Si occupé, changer le port dans docker-compose.yml# 2. Corriger les permissionssudo chown -R 1000:1000 ./giteachmod -R 755 ./gitea# 3. Vérifier les logsdocker-compose logs gitea# 4. Recréer les conteneursdocker-compose down -vdocker-compose up -d# 5. Attendre l'initialisation complètedocker-compose logs -f gitea# Attendre "Listen: http://0.0.0.0:3000"
Prévention :
Toujours vérifier les ports avant l'installation
Utiliser des répertoires avec les bonnes permissions dès le début
2. Actions Gitea non visibles ou non fonctionnelles
Problème :
Code
Pas d'onglet "Actions" dans l'interfaceLes workflows ne se déclenchent pas
Causes possibles :
Actions non activées dans la configuration
Runner non configuré
Fichiers workflow mal placés
Solution :
Code
# 1. Vérifier la configuration Gitea# Dans l'interface admin : Site Administration > Configuration# Chercher [actions] ENABLED = true# 2. Activer les actions si nécessairedocker exec -it gitea-container shvi /data/gitea/conf/app.ini
# 3. Redémarrer Giteadocker-compose restart gitea# 4. Vérifier le runnerdocker-compose logs gitea-runner# 5. Vérifier la structure des workflowsls -la .gitea/workflows/# Les fichiers doivent avoir l'extension .yml ou .yaml
Prévention :
Utiliser les docker-compose fournis dans la formation
Vérifier la configuration avant de commencer les ateliers
3. Premier workflow échoue avec des erreurs de permissions
Problème :
Code
Error: buildx failed with: permission denied while trying to connect to the Docker daemon socket
Solution :
Code
# 1. Donner les permissions Docker au runnerdocker exec -it gitea-runner sudo usermod -aG docker runner# 2. Redémarrer le runnerdocker-compose restart gitea-runner# 3. Vérifier les permissionsdocker exec -it gitea-runner groups runner# Doit inclure "docker"# 4. Tester Docker dans le runnerdocker exec -it gitea-runner docker ps
Prévention :
Configurer les permissions dès l'installation du runner
Jour 2 - Problèmes intermédiaires
4. Docker Registry refuse les connexions
Problème :
Code
docker push localhost:5000/myapp:latest# Error: Get "https://localhost:5000/": dial tcp: connection refused
Solution :
Code
# 1. Vérifier que le registry tournedocker ps | grep registrycurl http://localhost:5000/v2/# 2. Configurer Docker pour le registry insecuresudo nano /etc/docker/daemon.json
Building takes 10+ minutesnpm install step is extremely slow
Solutions d'optimisation :
Code
# Dockerfile optimisé avec cache des layersFROM node:18-alpine AS baseWORKDIR /app# Copier seulement package*.json d'abord (cache layer)COPY package*.json ./RUN npm ci --only=production && npm cache clean --force# Copier le reste du codeCOPY . .# Multi-stage pour réduire la taille finaleFROM node:18-alpine AS productionRUN addgroup -g 1001 -S nodejs && \ adduser -S nodejs -u 1001WORKDIR /appCOPY --from=base --chown=nodejs:nodejs /app/node_modules ./node_modulesCOPY --from=base --chown=nodejs:nodejs /app .USER nodejsCMD ["npm", "start"]
Code
# Utiliser BuildKit pour de meilleures performancesexport DOCKER_BUILDKIT=1docker build --progress=plain .# Nettoyer les caches régulièrementdocker builder prune -a
Prévention :
Utiliser .dockerignore approprié
Ordonner les layers par fréquence de changement
Utiliser des images base optimisées (alpine)
6. Kubernetes pods en "Pending" indéfiniment
Problème :
Code
kubectl get pods# NAME READY STATUS RESTARTS AGE# myapp 0/1 Pending 0 5m
Diagnostic :
Code
# 1. Vérifier les eventskubectl describe pod myapp# 2. Vérifier les ressources des nodeskubectl top nodeskubectl describe nodes# 3. Vérifier les quotaskubectl describe quota
Solutions selon la cause :
Code
# Si manque de ressources sur les nodeskubectl edit deployment myapp# Réduire requests.cpu et requests.memory# Si problème de scheduling (minikube)minikube stopminikube start --memory=4096 --cpus=4# Si problème de permissionskubectl get pvkubectl get pvc# Vérifier les permissions des volumes persistants
Prévention :
Toujours définir des resource requests réalistes
Monitorer les ressources du cluster régulièrement
7. Services Kubernetes inaccessibles
Problème :
Code
curl http://myapp-service/health# curl: (7) Failed to connect to myapp-service port 80
Diagnostic et solution :
Code
# 1. Vérifier que le service existekubectl get svc myapp-service# 2. Vérifier les endpointskubectl get endpoints myapp-service# Si pas d'endpoints, problème de selector/labels# 3. Vérifier les labels des podskubectl get pods --show-labelskubectl describe svc myapp-service# 4. Tester depuis un pod de debugkubectl run debug --image=busybox -it --rm -- sh# Puis dans le pod:nslookup myapp-servicetelnet myapp-service 80# 5. Si les labels ne correspondent paskubectl label pods myapp-pod app=myapp
Prévention :
Toujours vérifier que les labels des pods correspondent aux selectors des services
Tester la connectivité après chaque déploiement
Jour 3 - Problèmes avancés
8. Argo CD applications restent "OutOfSync"
Problème :
Code
argocd app get myapp# Status: OutOfSync# Health: Unknown
Solutions selon le type de problème :
Code
# 1. Problème de credentials Gitargocd repo listargocd repo add https://github.com/user/repo.git --username user --password token# 2. Problème de path ou de branchargocd app set myapp --path correct/path --revision main# 3. Synchronisation forcéeargocd app sync myapp --force --replace# 4. Problème de permissions sur le clusterkubectl auth can-i create pods --as=system:serviceaccount:argocd:argocd-application-controller# 5. Vérifier les logs du controllerkubectl logs -n argocd deployment/argocd-application-controller
Prévention :
Tester l'accès aux repositories avant de créer les applications
Utiliser des chemins absolus dans les configurations
Vérifier les permissions RBAC d'Argo CD
9. CDK8s génère des manifests invalides
Problème :
Code
npm run synthkubectl apply -f dist/# error validating data: ValidationError(Deployment.spec.template)
Diagnostic :
Code
# 1. Vérifier les imports CDK8scdk8s import --helpls imports/# 2. Valider individuellementkubectl apply --dry-run=client -f dist/myapp.k8s.yaml# 3. Vérifier les types TypeScriptnpm run build
Utiliser des tests unitaires pour les constructs CDK8s
Valider les manifests générés avec kubectl --dry-run
10. Pipeline GitOps ne se déclenche pas
Problème :
Code
Code pushed → CI/CD works → CDK8s works → GitOps repo updatedBut Argo CD doesn't sync
Diagnostic :
Code
# 1. Vérifier les webhooks Gitcurl -H "Authorization: token $TOKEN" \ http://gitea:3000/api/v1/repos/user/gitops-config/hooks# 2. Vérifier la connectivité Argo CD → Gitkubectl exec -it -n argocd deployment/argocd-repo-server -- \ git ls-remote https://gitea:3000/user/gitops-config.git# 3. Vérifier les logs Argo CDkubectl logs -n argocd deployment/argocd-application-controller -f# 4. Forcer une synchronisation manuelleargocd app sync myapp
Solutions :
Code
# 1. Configurer le webhook correctement# Dans Gitea: Repository Settings → Webhooks → Add Webhook# URL: http://argocd-server.argocd.svc.cluster.local/api/webhook# Content-Type: application/json# Events: Push, Pull Request# 2. Vérifier la configuration du repository dans Argo CDargocd repo add http://gitea:3000/user/gitops-config.git \ --username user --password token# 3. Activer la synchronisation automatiqueargocd app set myapp --sync-policy automated --auto-prune --self-heal
Prévention :
Tester les webhooks manuellement après configuration
Utiliser des URLs internes du cluster pour la communication inter-services
Problèmes de performance
11. Pipeline CI/CD très lent
Symptômes :
Build prend plus de 10 minutes
Tests traînent indéfiniment
Push vers le registry très lent
Solutions d'optimisation :
Code
# Optimisation du workflow Gitea Actionsname: Optimized CI/CDon: [push, pull_request]# Utiliser des cachesjobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Setup Node.js with cache uses: actions/setup-node@v4 with: node-version: '20' cache: 'npm' # Cache automatique des node_modules - name: Cache dependencies uses: actions/cache@v3 with: path: ~/.npm key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} - name: Install dependencies run: npm ci --prefer-offline --no-audit # Paralléliser les étapes longues - name: Run tests in parallel run: npm test -- --maxWorkers=4 --passWithNoTests # Séparer build et test pour la parallélisation build: runs-on: ubuntu-latest steps: # ... steps de build
Code
# Optimisation Docker# Utiliser des images plus petites et un registry localdocker pull node:18-alpine # Plus petit que node:18docker build --cache-from myregistry/app:latest .
Prévention :
Utiliser les caches appropriés dès le début
Profiler régulièrement les pipelines pour identifier les goulots
12. Cluster Kubernetes à court de ressources
Symptômes :
Pods évictés fréquemment
Nodes en état "Ready,SchedulingDisabled"
Applications qui traînent
Solutions :
Code
# 1. Diagnostic des ressourceskubectl top nodeskubectl top pods --all-namespaces --sort-by=memorykubectl describe nodes | grep -A 5 "Allocated resources"# 2. Identifier les gourmands en ressourceskubectl get pods --all-namespaces -o custom-columns=NAME:.metadata.name,MEMORY:.status.containerStatuses[0].resources.requests.memory,CPU:.status.containerStatuses[0].resources.requests.cpu# 3. Ajuster les limits et requestskubectl edit deployment resource-hungry-app
Code
# Exemple d'optimisation des ressourcesresources: requests: memory: "128Mi" # Ce dont l'app a vraiment besoin cpu: "100m" limits: memory: "256Mi" # Maximum absolu cpu: "500m"
Définir des resource requests/limits réalistes dès le début
Monitorer l'utilisation des ressources régulièrement
Utiliser l'autoscaling horizontal et vertical
Erreurs de sécurité courantes
13. Secrets exposés dans les logs
Problème :
Code
# Dans les logs Gitea Actions ou Kubernetesecho "DATABASE_URL=postgresql://user:password@db/app"
Solutions immédiates :
Code
# 1. Révoquer immédiatement les credentials exposés# Changer les mots de passe, régénérer les tokens# 2. Nettoyer les logskubectl delete pods -l app=myapp # Force restart et nouveaux logs# 3. Utiliser les secrets appropriéskubectl create secret generic db-secret \ --from-literal=database-url="postgresql://user:newpassword@db/app"
Code
# Dans les workflows, utiliser les secretsenv: DATABASE_URL: ${{ secrets.DATABASE_URL }} # ✅ Correct # DATABASE_URL: postgresql://user:pass@db # ❌ Jamais ça !
# Dans le DockerfileFROM node:18-alpine# Créer un utilisateur non-rootRUN addgroup -g 1001 -S nodejs && \ adduser -S nodejs -u 1001# Utiliser cet utilisateurUSER nodejs# Le reste de votre Dockerfile
Prévention :
Utiliser des images de base non-root par défaut
Configurer les security contexts dès le début
Utiliser des policies de sécurité (Pod Security Standards)
Checklist de prévention
Avant de commencer un atelier
Tous les ports requis sont libres
Docker fonctionne et les permissions sont correctes
Assez d'espace disque disponible (minimum 10GB)
Connexion internet stable pour télécharger les images
Avant de passer au jour suivant
Tous les services du jour précédent fonctionnent
Les logs ne montrent pas d'erreurs critiques
Un backup des configurations importantes est fait
Les ressources système sont disponibles pour la suite
Après chaque modification importante
Tester dans un environnement isolé d'abord
Vérifier les logs après le déploiement
Valider que les services répondent correctement
Documenter les changements importants
Cette liste de problèmes courants vous aidera à éviter les pièges les plus fréquents et à résoudre rapidement les issues quand elles surviennent.