kubectl
kubectl run nginx-pod --image=nginx:latest --port=80
# 1.1 - État du pod
kubectl get pod nginx-pod
# 1.2 - Détails complets
kubectl describe pod nginx-pod
#1.3 - Port-forward pour tester localement (localhost)
kubectl port-forward pod/nginx-pod 8080:80
# ou en précisant l'adresse IP:
kubectl port-forward --address 192.168.2.49,localhost pod/nginx-pod 8080:80
# 0.0.0.0 expose le port sur toutes les interfaces réseau de la machine
# ATTENTION -> Dans un autre terminal
curl http://localhost:8080
# 1.4 - Effacer le pod
kubectl delete pod/nginx-pod
# 1.5 - Créer un pod interactif
kubectl run test -it --image=busybox
kubectl attach test -c test -i -t
kubectl create deployment nginx-deployment \
--image=nginx:latest \
--replicas=4 \
--port=80
kubectl get pod -o wide
# Tester avec curl
Note: 💡 kubectl create est pour les ressources de haut niveau (Deployment, Service, etc.). kubectl run est la commande dédiée à la création de pods.
kubectl expose deployment nginx-deployment \
--name=nginx-service \
--port=80 \
--target-port=80
# Défaut: --type=ClusterIP
kubectl get svc -o wide
kubectl describe service/nginx-service
# IP: 10.98.105.164
# Endpoints: 10.244.0.7:80,10.244.2.5:80,10.244.1.7:80 + 1 more...
# Tester IP avec curl
# Effacer le svc nginx-service:
kubectl delete service/nginx-service
kubectl expose deployment nginx-deployment \
--name=nginx-service \
--type=LoadBalancer \
--port=80 \
--target-port=80
kubectl scale deployment nginx-deployment --replicas=12
# Voir les pods se créer en temps réel
# NOTE: Faire la démo avec deux terminaux
kubectl get pods -l app=nginx-deployment --watch
# Via patch JSON
kubectl patch deployment nginx-deployment \
-p '{"spec": {"replicas": 6}}'
# Éditer directement le manifest en live
kubectl edit deployment nginx-deployment
# Change replicas: 4 → 12, sauvegarde et ferme
kubectl exec -it nginx-deployment-6d95bc85cf-8qsc7 -- bash
cd /usr/share/nginx/html
echo "Mon site web" > index.html
curl nginx-service # Il est possible d'utiliser le nom d'un service grace au DNS de K8s
exit
# 7.1 - Tester avec curl sur le POD puis sur le service
curl 10.244.1.14 # Mon site web
curl 10.97.12.45 # Plusieurs fois ...
kubectl logs nginx-deployment-6d95bc85cf-8qsc7
kubectl logs nginx-deployment-6d95bc85cf-8qsc7 -f // En continu
Tout comme pour Docker, il est possible de créer des ressources K8s en utilisant YAML. Ces fichiers de directives sont nommés Manifestes.
kubectl create deployment nginx-deployment \
--image=nginx:latest \
--replicas=4 \
--port=80 \
--dry-run=client -o yaml > nginx-deployment.yml
kubectl expose deployment nginx-deployment \
--name=nginx-service \
--type=LoadBalancer \
--port=80 \
--target-port=80 \
--dry-run=client -o yaml > nginx-svc.yml
# NOTE - ports:
# - port: 8080 # le client appelle http://service:8080
# targetPort: 80 # Kubernetes redirige vers le port 80 du conteneur
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx-deployment
name: nginx-deployment
spec:
replicas: 4
selector:
matchLabels:
app: nginx-deployment
strategy: {}
template:
metadata:
labels:
app: nginx-deployment
spec:
containers:
- image: nginx:latest
name: nginx
ports:
- containerPort: 80
resources: {}
status: {} # Non requis!
---
apiVersion: v1
kind: Service
metadata:
labels:
app: nginx-deployment
name: nginx-service
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx-deployment
type: LoadBalancer
status: # Non requis!
loadBalancer: {} # Non requis!
kubectl apply -f nginx-deployment.yml
kubectl apply -f nginx-svc.yml
kubectl get all -o wide
# ---------------------------------------------------------------
# Remarquez les sélecteurs, ils servent de lien entre les objets.
# ---------------------------------------------------------------
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service/nginx-service LoadBalancer 10.109.34.172 <pending> 80:31404/TCP 5s app=nginx-deployment
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
deployment.apps/nginx-deployment 4/4 4 4 5s nginx nginx:latest app=nginx-deployment
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
replicaset.apps/nginx-deployment-6d95bc85cf 4 4 4 5s nginx nginx:latest app=nginx-deployment,pod-template-hash=6d95bc85cf
💡Il est possible de combiner les deux manifestes dans un seul fichier. Il suffit de séparer les sections par ---.
# Fichier: nginx-avec-init.yml
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
spec:
initContainers:
- name: init-html
image: alpine:latest
command:
- sh
- -c
- "apk add --no-cache git && git clone https://github.com/ve2cuy/superminou-depart /test"
volumeMounts:
- name: html
mountPath: /test
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
volumes:
- name: html
emptyDir: {}
Note: {} signifie un objet vide — c’est la syntaxe YAML pour dire “utilise les valeurs par défaut”. C’est équivalent à :
volumes:
- name: html
emptyDir:
medium: "" # stockage sur disque (défaut)
sizeLimit: null # pas de limite de taille
Le volume est créé sur le nœud (node) qui héberge le pod, dans un dossier temporaire géré par Kubernetes :
/var/lib/kubelet/pods/<pod-uid>/volumes/kubernetes.io~empty-dir/html/
init et les autresLa dépendance est native dans Kubernetes — c’est le comportement par défaut des init containers :
Comportement garanti par Kubernetes initContainers → s’exécutent en séquence, un par un ↓ seulement si exitCode = 0 containers → démarrent uniquement quand TOUS les init containers sont terminés avec succès
Donc :
Nginx ne démarrera jamais si init-html échoue ou plante.
Si init-html plante, Kubernetes le redémarre jusqu’à ce qu’il réussisse
Nginx attend obligatoirement que le fichier soit écrit avant de démarrer.
kubectl apply -f
kubectl get pod nginx-pod --watch
NAME READY STATUS RESTARTS
nginx-pod 0/1 Init:0/1 0 # init container en cours
nginx-pod 0/1 PodInitializing 0 # init terminé, nginx démarre
nginx-pod 1/1 Running 0 # nginx prêt