Commandes de suivi et de diagnostic
Exposer les ports d'un pod
Le pod que nous avons créé dans le TP précédent écoute sur le port 8080 et répond avec les requêtes qu'il reçoit. - Nous allons commencer par recréer ce pod
kubectl apply -f echoserver-pod.yaml
En l'état, nous n'avons aucun moyen d'accéder au port 8080 exposé par le conteneur de ce pod. - Grâce à kubectl, nous pouvons exposer le port de manière simple, à des fins de développement/diagnostic
kubectl port-forward <nom du pod> 8080:8080
Cette commande créé un tunnel entre le port local 8080 et le port 8080 du pod cible. Il est désormais possible d'accéder au pod avec une requête locale
curl localhost:8080
Hostname: hello
Pod Information:
-no pod information available-
Server values:
server_version=nginx: 1.13.3 - lua: 10008
Request Information:
client_address=127.0.0.1
method=GET
real path=/
query=
request_version=1.1
request_scheme=http
request_uri=http://localhost:8080/
Request Headers:
accept=*/*
host=localhost:8080
user-agent=curl/7.54.0
Request Body:
-no body in request-
Accès aux logs
- Conserver un terminal avec le port-forward et lancer
watch -n 1 curl localhost:8080
Kubectl permet d'accéder aux logs d'un pod ou d'un ensemble de pods
kubectl logs <nom du pod>
L'interface de la commande logs est similaire à la commande logs de docker
kubectl logs -f <nom du pod>
curl localhost:8080
Lorsqu'un pod contient plusieurs conteneurs, il faut spécifier le conteneur dont on veut obtenir les logs
kubectl logs -c <nom du conteneur> <nom du pod>
Il est également possible d'obtenir les logs de tous les conteneurs d'un coup
kubectl logs --all-containers <nom du pod>
Dans le cas où un conteneur s'arrête et qu'un nouveau le remplace, il peut être utile de consulter les logs du conteneur qui s'est arrêté
kubectl logs -p <nom du pod>
Enfin, lorsqu'une application est constituée de plusieurs pods, il est possible d'afficher les logs par sélecteur de label
kubectl logs -l app=echo-server
Exécuter des commandes à l'intérieur du pod
Kubectl propose une commande exec qui a elle aussi une interface similaire à celle de docker. Elle permet d'exécuter des commandes directement à l'intérieur d'un pod.
- Exécuter une commande simple, le résultat de la commande s'affichera sur la sortie standard du terminal
kubectl exec <nom du pod> -- ls
- Il est possible d'exécuter des commandes intéractives et de simuler un terminal, l'usage le plus courant de ces options est l'exécution d'un shell à l'intérieur du conteneur
kubectl exec -it <nom du pod> -- /bin/sh
- De la même manière que pour
kubectl log, dans le cas où un pod est constitué de plusieurs conteneurs, il faut spécifier le nom du conteneur
kubectl exec -c <nom du conteneur> <nom du pod> ls
Échanger des fichiers avec le pod
La commande kubectl cp permet de transférer des fichiers vers ou depuis le pod. Encore une fois, l'interface de la commande est
très similaire à celle de docker, qui est elle-même similaire à celle de scp
- Transférer un fichier vers le pod
echo "test" > test.txt
kubectl cp test.txt <nom du pod>:/tmp
- Transférer un fichier depuis le pod
kubectl cp <nom du pod>:/usr/share/nginx/html/index.html .
Sondes de bonne santé et de disponibilité
Les sondes sont cruciale au bon fonctionnement de l'orchestration fournie par Kubernetes. Elles permettent de déterminer à quel moment un pod peut être inclu dans le load-balancing, ou à quel moment il doit être détruit et recréé.
Sondes de bonne santé
Pour expérimenter avec ces sondes, nous allons commencer par créer un nouveau pod
- Créer un fichier de manifeste nommé liveness.yaml avec le contenu suivant
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness
spec:
containers:
- name: liveness
image: busybox
args:
- /bin/sh
- -c
- touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
Ce pod créé un fichier /tmp/healthy vide puis le supprime au bout de 30 secondes. Ceci va nous permettre de simuler un pod qui fonctionne un temps avant de tomber en panne. Nous considèrerons que le pod fonctionne tant que le fichier /tmp/healthy est présent.
Nous allons donc écrire une sonde de bonne santé (livenessProbe) qui va vérifier le bon fonctionnement de ce pod.
Cette sonde aura les caractéristiques suivantes :
- Elle exécute la commande
cat /tmp/healthy(quand le fichier sera supprimé, la commande retournera un code erreur) - Elle devra s'exécuter toutes les 5 secondes
- Elle devra s'exécuter avec un délai initial de 5 secondes
Écrire la définition de cette sonde et l'ajouter à la définition du conteneur liveness (s'appuyer sur la documentation de référence)
...
image: busybox
args:
...
livenessProbe:
...
Sondes de disponibilité
Nous allons créer un nouveau pod basé sur l'image k8s.gcr.io/liveness qui va nous permettre de créer une sonde de disponibilité.
- Créer un fichier manifeste nommé
readinessavec le contenu suivant
apiVersion: v1
kind: Pod
metadata:
labels:
test: readiness
name: readiness
spec:
containers:
- name: readiness
image: k8s.gcr.io/liveness
args:
- /server
Le point d'entrée (/server) démarre un point d'accès http qui répond 200 OK pendant 10 secondes, puis
se met à répondre une erreur 500.
De la même manière que l'exercice précédent, écrire une sonde de disponibilité avec les caractéristiques suivantes:
- Elle accède au point d'accès http
/healthzsur le port8080 - Elle s'exécute toutes les 3 secondes
- Elle s'exécute avec un délai initial de 3 secondes
Utiliser les go-template
L'utilisation des go-templates est une fonctionnalité puissance de kubectl permettant de créer des formats de sortie sur-mesure, notamment très utile pour l'écriture de scripts de gestion
Exemple, afficher le nom du pod
kubectl get pod hello -o go-template="{{.metadata.name}}"
- Exercice: utiliser l'option go-template-file pour générer un résumé de l'état des pods sous la forme suivante
<nom du pod> | <phase du pod> | <ip du pod>