Aller au contenu
Conteneurs & Orchestration medium

Podman kube : tester et générer des YAML Kubernetes localement

16 min de lecture

logo podman

Podman kube permet de tester des manifests Kubernetes localement, sans cluster. Vous pouvez aussi générer des YAML depuis vos conteneurs existants. C’est idéal pour valider vos manifests avant de les déployer sur un vrai cluster.

À la fin de ce guide, vous saurez :

  • Lancer des pods depuis des YAML Kubernetes
  • Générer des manifests depuis des conteneurs existants
  • Itérer rapidement : generate → edit → play
  • Nettoyer proprement avec kube down

Vous avez un manifest Kubernetes et vous voulez le tester :

  • Sans installer Minikube ou Kind
  • Sans déployer sur un cluster de dev
  • Rapidement, pour valider la syntaxe et le comportement

podman kube play lit un fichier YAML Kubernetes et crée les ressources localement avec Podman.

Flux kube play : manifest YAML vers Pod Podman local

Podman ne simule pas un cluster Kubernetes complet — il se concentre sur les ressources que vous pouvez tester localement sans orchestrateur. Les ressources de type “réseau” (Services, Ingress) ne sont pas supportées car elles dépendent d’un control plane Kubernetes.

RessourceSupportéNotes
PodComplet
DeploymentCrée les pods
DaemonSetCrée un pod
ConfigMapMonté comme fichiers ou envvars
SecretMonté comme fichiers ou envvars
PersistentVolumeClaimCrée un volume Podman
ServiceUtilisez les ports du pod
IngressNon supporté
NetworkPolicyNon supporté
Fenêtre de terminal
podman kube play <fichier.yaml>
  1. Créer un manifest simple

    nginx-pod.yaml
    apiVersion: v1
    kind: Pod
    metadata:
    name: nginx-web
    labels:
    app: nginx
    spec:
    containers:
    - name: nginx
    image: docker.io/library/nginx:alpine
    ports:
    - containerPort: 80
    hostPort: 8080
  2. Lancer avec kube play

    Fenêtre de terminal
    podman kube play nginx-pod.yaml
    Résultat
    Pod:
    nginx-web
    Container:
    nginx-web-nginx
  3. Vérifier

    Fenêtre de terminal
    podman pod ps
    Résultat
    POD ID NAME STATUS CREATED # OF CONTAINERS
    abc123def456 nginx-web Running 10 seconds ago 2
  4. Tester

    Fenêtre de terminal
    curl http://localhost:8080
deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
spec:
replicas: 2 # Crée 2 pods
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: web
image: docker.io/library/nginx:alpine
ports:
- containerPort: 80
Fenêtre de terminal
podman kube play deployment.yaml

Les options les plus utiles permettent de contrôler le réseau, de charger des ConfigMaps externes, et surtout d’itérer rapidement avec --replace.

OptionDescriptionExemple
--networkRéseau à utiliser--network my-net
--configmapCharger un ConfigMap externe--configmap cm.yaml
--startDémarrer les pods (défaut: true)--start=false
--replaceRemplacer les pods existants--replace
--downAlias pour kube down(voir section dédiée)

Vous avez des conteneurs qui fonctionnent avec podman run. Vous voulez les “exporter” en YAML Kubernetes pour :

  • Les versionner dans Git
  • Les déployer ailleurs
  • Les transformer en vraies ressources Kubernetes
Fenêtre de terminal
# Depuis un conteneur
podman kube generate <container-name> > pod.yaml
# Depuis un pod
podman kube generate <pod-name> > pod.yaml
Fenêtre de terminal
# Créer un conteneur
podman run -d --name my-nginx -p 8080:80 nginx:alpine
# Générer le YAML
podman kube generate my-nginx
Sortie
apiVersion: v1
kind: Pod
metadata:
name: my-nginx-pod
labels:
app: my-nginx-pod
spec:
containers:
- name: my-nginx
image: docker.io/library/nginx:alpine
ports:
- containerPort: 80
hostPort: 8080
Fenêtre de terminal
# Créer un pod avec plusieurs conteneurs
podman pod create --name api-stack -p 8080:80
podman run -d --pod api-stack --name nginx nginx:alpine
podman run -d --pod api-stack --name redis redis:alpine
# Générer le YAML
podman kube generate api-stack > api-stack.yaml

Le YAML généré contient les deux conteneurs dans le même pod.

Deux options principales : écrire directement dans un fichier (-f) ou générer aussi un Service Kubernetes (-s) pour faciliter la transition vers un vrai cluster.

OptionDescriptionExemple
-f, --filenameÉcrire dans un fichier-f pod.yaml
-s, --serviceGénérer aussi un Service-s
Fenêtre de terminal
# Générer Pod + Service
podman kube generate my-nginx -s

Le workflow typique est :

Workflow d'itération kube play : prototyper, générer, éditer, tester, itérer

  1. Prototyper avec le CLI

    Fenêtre de terminal
    # Créer le pod manuellement
    podman pod create --name demo -p 8080:80
    podman run -d --pod demo --name app nginx:alpine
  2. Générer le YAML

    Fenêtre de terminal
    podman kube generate demo > demo.yaml
  3. Éditer le YAML

    Ajoutez des ressources, des variables d’environnement, etc.

    demo.yaml (édité)
    apiVersion: v1
    kind: Pod
    metadata:
    name: demo
    spec:
    containers:
    - name: app
    image: docker.io/library/nginx:alpine
    ports:
    - containerPort: 80
    hostPort: 8080
    resources:
    limits:
    memory: "128Mi"
    cpu: "500m"
    env:
    - name: ENV
    value: "production"
  4. Supprimer l’ancien pod

    Fenêtre de terminal
    podman pod rm -f demo
  5. Relancer avec le YAML modifié

    Fenêtre de terminal
    podman kube play demo.yaml
  6. Vérifier les changements

    Fenêtre de terminal
    podman inspect demo-app --format '{{.Config.Env}}'
    # [ENV=production ...]

Pour éviter de supprimer manuellement le pod :

Fenêtre de terminal
# Première fois
podman kube play demo.yaml
# Modifications...
# Remplacer directement
podman kube play --replace demo.yaml
Fenêtre de terminal
podman kube down <fichier.yaml>

kube down est conservateur par défaut : il supprime les pods et conteneurs, mais préserve les volumes pour éviter toute perte de données accidentelle. Utilisez --force uniquement si vous voulez un nettoyage complet.

RessourceSupprimée ?Notes
PodsToujours
ConteneursTous les conteneurs du pod
Volumes créés par le YAML⚠️Seulement avec --force
RéseauxNon supprimés
Fenêtre de terminal
# Créer
podman kube play demo.yaml
# Vérifier
podman pod ps
# Supprimer
podman kube down demo.yaml
Résultat
Pods stopped:
demo
Pods removed:
demo

Par défaut, kube down préserve les volumes (pour ne pas perdre de données).

Fenêtre de terminal
# Supprimer pods + volumes
podman kube down --force demo.yaml
Fenêtre de terminal
# Vérifier les pods (devrait être vide)
podman pod ps
# Vérifier les volumes (peuvent rester)
podman volume ls
# Nettoyer manuellement les volumes orphelins
podman volume prune
config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
app.conf: |
server {
listen 80;
}
LOG_LEVEL: debug
---
apiVersion: v1
kind: Pod
metadata:
name: app
spec:
containers:
- name: app
image: nginx:alpine
volumeMounts:
- name: config-volume
mountPath: /etc/nginx/conf.d
env:
- name: LOG_LEVEL
valueFrom:
configMapKeyRef:
name: app-config
key: LOG_LEVEL
volumes:
- name: config-volume
configMap:
name: app-config
items:
- key: app.conf
path: default.conf
Fenêtre de terminal
podman kube play config.yaml
secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: db-secret
type: Opaque
data:
password: cGFzc3dvcmQxMjM= # base64 encoded
---
apiVersion: v1
kind: Pod
metadata:
name: app
spec:
containers:
- name: app
image: nginx:alpine
env:
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret
key: password

Encoder un secret en base64 :

Fenêtre de terminal
echo -n 'password123' | base64
# cGFzc3dvcmQxMjM=

Objectif : créer une stack API avec nginx + backend, la transformer en YAML, et itérer.

  1. Créer la stack avec des commandes

    Fenêtre de terminal
    # Créer le pod
    podman pod create --name api-demo -p 8080:80
    # Backend (simule une API)
    podman run -d --pod api-demo --name backend \
    python:3.12-alpine python -m http.server 3000
    # Frontend (nginx)
    podman run -d --pod api-demo --name frontend \
    nginx:alpine
  2. Vérifier que ça fonctionne

    Fenêtre de terminal
    # État
    podman pod ps
    podman ps --pod
    # Test
    curl http://localhost:8080
  3. Générer le YAML

    Fenêtre de terminal
    podman kube generate api-demo > api-demo.yaml
    cat api-demo.yaml
  4. Éditer le YAML

    Ajoutez des variables d’environnement, des labels, etc.

  5. Supprimer et recréer

    Fenêtre de terminal
    podman pod rm -f api-demo
    podman kube play api-demo.yaml
  6. Vérifier

    Fenêtre de terminal
    podman pod ps
    curl http://localhost:8080
  7. Nettoyer

    Fenêtre de terminal
    podman kube down api-demo.yaml

Checklist de validation :

  • podman pod ps montre le pod
  • podman ps --pod montre les conteneurs
  • curl localhost:8080 fonctionne
  • Après kube down, podman pod ps est vide
  • podman volume ls montre les volumes restants (si PVC)

La plupart des erreurs viennent de trois sources : un pod qui existe déjà (nom en conflit), une image mal référencée (oubli du registry), ou un port déjà utilisé.

ErreurCauseSolution
Error: pod already existsPod avec ce nom existe--replace ou supprimer le pod
image not foundImage avec tag localAjouter docker.io/library/
hostPort already in usePort déjà utiliséChanger le hostPort ou libérer le port
ConfigMap not foundConfigMap pas dans le même fichierMettre ConfigMap avant Pod dans le YAML
Fenêtre de terminal
# Voir ce qui a été créé
podman pod ps
podman ps --pod
# Logs d'un conteneur
podman logs <container-name>
# Inspecter le pod
podman pod inspect <pod-name>
# Vérifier un YAML sans le lancer
podman kube play --start=false <fichier.yaml>
Fenêtre de terminal
# Vérifier les logs
podman kube play my-pod.yaml
podman logs <container-name>
# Problème d'image ?
podman pull docker.io/library/nginx:alpine
# Problème de port ?
ss -tlnp | grep <port>
  • Répertoiredeploy/
    • Répertoirebase/
      • pod.yaml
      • configmap.yaml
      • secret.yaml
    • Répertoiredev/
      • pod-dev.yaml
    • Répertoireprod/
      • pod-prod.yaml
  1. Un fichier par ressource ou tout dans un fichier avec --- séparateurs
  2. ConfigMap avant Pod : les dépendances d’abord
  3. Images complètes : docker.io/library/nginx:alpine pas nginx:alpine
  4. Labels explicites : pour le filtrage et la documentation
Fenêtre de terminal
# Générer avec date
podman kube generate my-pod > pod-$(date +%Y%m%d).yaml
# Ou utiliser Git
git add pod.yaml
git commit -m "feat: add resource limits"
  1. kube play : lance un YAML Kubernetes localement
  2. kube generate : crée un YAML depuis des conteneurs existants
  3. --replace : recrée le pod sans suppression manuelle
  4. kube down : supprime le pod, préserve les volumes (sauf --force)
  5. Workflow : CLI → generate → edit → play → iterate
  6. Scope limité : pas de Services, Ingress, NetworkPolicy

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.