[k8s] Fichier YAML

<<< Chap 3 | Sommaire | Chap 5 >>>

Chap 4. Fichier YAML

Je vous ai déjà présenté deux méthodes pour créer des Pods.

  • Le premier, à partir d’un fichier yaml, aussi appelé Manifest (1).
  • Le second, en récupérant une copie du fichier de configuration d’un pod fonctionnel (2).

Dans cette partie, je vais essayer de vous expliquer

  • Le déboguage un fichier yaml
  • La création de son propre fichier de configuration à partir d’un pod existant

I. Fichier manifest YAML

Un fichier manifest est un fichier de configuration pour le déployement de pods. Ce fichier est écrit dans un format de type YAML, comprennant au moins 4 parties: AKMS

  • A: version de l’API
  • K: KIND, ou type (Pod, etc.)
  • M: METADATA, ou métadonnée
  • S: SPEC, spécifications de l’objet

Une exemple de fichier de configuration YAML avec le stricte minimum comme information,

$ cat << EOF >> pingtest.yml
apiVersion: v1
kind: Pod
metadata:
  name: pingtest01
spec:
  containers:
  - name: pod1
    image: docker.io/centos/tools:latest
    command:
    - /sbin/init
EOF

Vous pouvez utiliser l’extension .yml aussi bien que .yaml.

II. Test sur le fichier YAML et vérification de son contenu

Pour cet exemple, nous allons manipuler le fichier pingtest.yml créé précédement.

Décaler la ligne au niveau de « command » de deux crans vers la gauche, en supprimant deux espaces. Puis, essayer de déployer un pod et voyez le résultat.

$ kubectl create -f pingtest.yml

D’après le message d’erreur, le déployement du pod ne peut s’effectuer à cause du champ « command », qui n’est pas reconnu. Comment çà se fait, alors qu’on a récupéré une copie d’un fichier fonctionnel?

Grâce à la commande « explain » de kubectl, essayons de comprendre ce qui ne va pas.

N’hésitez pas à lire les détails avec l’option help, pour avoir une explication sur l’utilisation de « kubectl explain ».

$ kubectl explain --help

Revenons au fichier pingtest.yml qui nous a posé un problème.

L’objet créé est de type Pod (KIND=Pod); en tout cas, c’est ce qui est marqué dans le fichier yaml. Voyons les options, ou champs, disponibles pour ce type en particulier,

$ kubectl explain pod

Les éléments le plus à gauche dans notre fichier de configuration yaml devraient donc être: apiVersion, kind, metadata et spec.

L’objet « commande », qui se trouve sous « spec » dans notre configuration modifié, est celui qui nous pose un problème.

Voyons donc la liste de champs disponible sous la catégorie « spec ».

$ kubectl explain pod.spec

Il n’y a pas d’object « command », par contre « containers » y est présent.

Ce qui signifie que « container » doit être un peu plus à droite par rapport à l’object « spec », et que « command » ne devrait pas situer sur la même colone que « container », si toutefois le champ existe.

$ kubectl explain pod.spec.containers

Bingo, le champ « command » apparaît finalement.

De ce fait, l’objet « command » ainsi le ou les objets sous-jacents (ici, la ligne de commande « /sbin/init »), devraient être décalés vers la droite par rapport à leurs positions initiales.

Ainsi, les champs « command », « name » et « image » devraient se trouver sur la même colone.

Voyez l’importance de copier le contenu des fichiers YAML, exactement tel quel.

III. Création d’un fichier YAML

Il nous est aussi possible de créér notre fichier yaml, en fonction de notre besoin, à partir d’une configuration récupérée sur le hub de docker.

Reprennons une commande qu’on à déjà vu, pour créer un lancer un nouveau pod.

$ kubectl run nginx-hub --image=nginx

N’oublier pas de vérifier que le pod nouvellement créé, est fonctionnel avant  de passer à la suite.

$ kubectl get pod -o wide

$ ping <adresse_ip_du_pod>

Récupérer ensuite, une copie du fichier de configuration du pod nginx-hub.

$ kubectl get pod nginx-hub -o yaml > nginx-pers.yml

Détruisez l’ancien pod,

$ kubectl delete pod nginx-hub

Personnaliser le contenu du fichier yaml.

Je vous suggère

  • Ne garder que les champs « labels.run », « name » et « namespace »
  • Supprimer « status » ainsi que ces champs
  • Garder le reste de la configuration tel quel, à moins que vous sachiez ce que vous faîtes

Pour créer un pod à partir de ce fichier,

$ kubectl create -f nginx-pers.yml

Pour détruire ce pod,

$ kubectl delete -f nginx-pers.yml

Vous pouvez aussi utiliser « kubectl delete pod nginx-pers ».

J’espère que vous êtes maintenant à l’aise pour créer des pods à partir d’un fichier yaml.

IV. Astuces avec VIM

L’éditeur de texte VIM m’a posé les soucis suivants:

  • La tabulation ne respecte pas le format des fichiers YAML.
    Evitez à tout prix l’utilisation de la Tabulation avec les options par défaut sur les fichiers YAML.
  • Il m’est aussi arrivé d’avoir la ligne à laquelle j’ajoute un « : »,  s’auto-décaler vers la droite, comme si j’ai tapé sur la touche tab en début de ligne.
    L’option « identexpr » peut faire l’affaire pour éviter ce désagrément.

Voici le contenu du fichier vimrc.

$ cat << EOF >> ~/.vimrc
" tabstop [ts]:          Equivalence d'une Tabulation en nombre de charactères
" softtabstop [sts]:     Nombres d'espaces à ajouter
" shiftwidth [sw]:       Nombres d'espaces à ajouter en tapant deux fois sur ">" ou "<"
" expandtab:             Conversion des tabulations en espaces 
" indentexpr             Empêche VIM d'ajouter automatiquement des alinéas si la valeur donnée est vide
set ts         = 2
set sts        = 2
set sw         = 2
set expandtab
set indentexpr = ""
EOF

Vous pouvez maintenant utiliser les tabulations en toute sécurité sur les fichiers YAML.

Sources

How Kubernetes Networking Works – Under the Hood
vim settings for YAML files
How can I stop vim automatically inserting a tab in CSS files?