Skip to main content

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

Kubernetes_2

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 run pour créer un pod nommé nginx.
  • Spécifier l'image : Utilise l'image Docker nginx.
  • Redémarrage automatique : Le paramètre --restart=Always indique 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 de kubectl utilisé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. NodePort expose 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 :
Kubernetes_4

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