6_Pods
Pods
Frist pod déclarative
La méthode déclarative ce fait par fichier Yaml. Mais avant toutes chose qu'est ce qu'un fichier YAML ? Un fichier YAML est un format de sérialisation de données lisible par l'homme, souvent utilisé pour les fichiers de configuration. Il utilise une structure de formatage par indentation (L'indentation est la pratique consistant à ajouter des espaces ou des tabulations au début d'une ligne de texte pour indiquer sa hiérarchie ou sa structure) pour représenter les données sous forme de paires clé-valeur et de listes. Il est largement employé dans les environnements de développement et de déploiement, notamment avec des outils comme Kubernetes et Ansible.
exemple de fichier :
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment # Il est courant d'utiliser des noms en minuscules
spec:
replicas: 2
selector:
matchLabels: # Utilisation du pluriel 'matchLabels'
app: nginx_lab
template: # Correction de l'orthographe de 'template'
metadata:
labels: # Utilisation du pluriel 'labels'
app: nginx_lab
spec:
containers:
- image: nginx:latest # Utilisation d'une image Docker standard pour nginx
name: container-nginx
On le save dans un fichier exemple nginx.yaml et on applique
kubectl apply -f nginx.yaml
avec la commande nous pouvons voir les pods avec leurs status
kubectl get pods

Maintenant faut créer le service en yaml pour sortir :
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx_lab
ports:
- protocol: TCP
port: 80 # Port du service (utilisé à l'intérieur du cluster)
targetPort: 80 # Port sur lequel le conteneur écoute (défini dans ton déploiement)
nodePort: 30080 # Port externe entre 30000 et 32767
type: NodePort
mais comment savoir sur quel port est en écoute sur l'exterieur ?
kubectl describe service "nomduservicecrée"
Nous pouvons aussi faire un manifest avec déjà tout d'intégré :
apiVersion: apps/v1 # La version de notre API
kind: Deployment # Indique que c'est pour deployer un deploiement. Pour retrouver le kind, tapez la commande "sudo kubectl api-resources"
metadata:
name: hello-world # Le nom du deploiement
spec: # Specificites techniques
replicas: 1 # Nombre de repliques que nous voulons
selector: # Selecteur d'etiquettes pour les pods
matchLabels: # matchLabels est une carte de paires {cle, valeur}. Un seul {cle, valeur} dans la carte
app: hello-world
template:
metadata:
labels:
app: hello-world
spec:
containers:
- image: gcr.io/google-samples/hello-app:1.0 # L'image Docker a utiliser
name: hello-app # Le nom du conteneur
---
apiVersion: v1 # La version de notre API pour le service
kind: Service # Indique que nous creons un service
metadata:
name: hello-world-service # Le nom du service
spec:
type: NodePort # Type de service pour exposer le port en externe
selector:
app: hello-world # Selecteur pour associer ce service aux pods du deploiement hello-world
ports:
- port: 80 # Le port interne du service
targetPort: 8080 # Le port sur lequel l'application ecoute a l'interieur du conteneur
nodePort: 30007 # Le port externe pour acceder a l'application (optionnel, Kubernetes assignera un port par defaut si non specifie)
pareil pour apply
kubectl apply -f "nomdufichier".yml
Frist pod impérative
la méthode impérative, comme annoncé plus haut et pour faire très très cours c'est la gestion par simple commande, ici cela donnerais :
kubectl run nginx --image=nginx --restart=Always
Cette commande fait ce qui suit :
- Créer un pod : Utilise
kubectl runpour créer un pod nomménginx. - Spécifier l'image : Utilise l'image Docker
nginx. - Redémarrage automatique : Le paramètre
--restart=Alwaysindique que Kubernetes doit toujours redémarrer le pod.
Comment exposer mon pod :
kubectl expose pod nginx --port=80 --target-port=80 --name=nginx-service --type=NodePort
-
kubectl expose pod nginx: --kubectl: L'outil en ligne de commande pour interagir avec Kubernetes. --expose: Une sous-commande dekubectlutilisée pour exposer un pod ou un autre objet en tant que nouveau service Kubernetes. --pod nginx: Indique que nous exposons le pod nomménginx. -
--port=80:Ce paramètre spécifie le port sur lequel le service sera exposé. Ici, nous indiquons que le service doit écouter sur le port 80, en gros le port du service nginx 80 serveur web. -
--target-port=80:Ce paramètre spécifie le port du conteneur vers lequel le trafic sera redirigé. Dans ce cas, il redirige le trafic vers le port 80 du conteneur Nginx. -
--name=nginx-service:Cela donne un nom au service que nous créons. Ici, le service sera nommé `nginx-services. -
--type=NodePort: Ce paramètre spécifie le type de service à créer.NodePortexpose le service sur un port spécifique de tous les nœuds du cluster Kubernetes, ce qui permet d'accéder au service via une adresse IP du nœud et un port spécifique.
Pour voir le port sur notre réseaux :
kubectl get services nginx-service
sur l'output on voit bien que le port 80 et redirigé sur le port 31983
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-service NodePort 10.96.152.234 <none> 80:31983/TCP 6s
vérification :

On voit bien mon URL qui est bien le node 3 voir sur le shéma de l'infra, et le port aussi.