Guide et instructions

1. Objectifs

  • Découvrir le cluster k8s et se familiariser avec la commande « kubectl »
  • Namespace et la notion de contextes
  • Manipulation des « pods »
  • Installation des plugins

2. Introduction

Créez un dossier « lab02 » et basculez dans ce dossier

mkdir lab02
cd lab02

3. Kubectl

La ligne de commande « kubectl » permet depuis sa machine de travail de contrôler un cluster K8s.

  • Lister les ressources
  • Créer et supprimer les ressources
  • Gérer les droits d’accès
  • etc.

Pour se connecter et gérer le k8s, kubectl a besoin de l’adresse de l’API Kubernetes, d’un nom d’utilisateur et d’un certificat. Ces informations sont fournies sous forme d’un fichier YAML appelé « kubeconfig » qui se trouve à « ~/.kube/config »

Editez ce fichier pour le découvrir.

vi ~/.kube/config

Listez les nodes de cluster

kubectl get nodes

Pour avoir plus d’information il faut ajouter l’option -o wide

kubectl get nodes -o wide

Si vous voulez obtenir toutes les informations utilisez l’option « -o yaml ou json »

kubectl get nodes -o yaml
kubectl get nodes -o yaml | head -30

La sous commande « describe » permet aussi de récupérer les mêmes informations sous un format plus lisible

kubectl describe nodes | head -30

Pour extraire des informations on peut combiner la commande avec « jq »

sudo apt install jq
kubectl get nodes -o json | jq ".items[] | {name:.metadata.name} + .status.capacity"

Ou directement en utilisant « json path »

kubectl get nodes -o jsonpath="{.items[*]['metadata.name', 'status.capacity']}"

4. Contextes et namespace

Un contexte par défaut est créé automatiquement pour le cluster k8s utilisez la commande suivante pour le voir.

kubectl config get-contexts

Toujours avec l’option config, la sous-option « current-context » permet de récupérer le champ NAME du contexte par défaut:

kubectl config current-context

Créez un contexte nommé « mini-system » pointant sur le même contexte que minikube mais avec l’espace de noms kube-system par défaut

kubectl config set-context mini-system \
--cluster=kubelabs \
--user=kubelabs \
--namespace=kube-system

Listez les pods

kubectl get pods

La commande ne va pas trouver de « pods », Passez ensuite sur le contexte nouvellement créé à l’aide de la commande suivante:

kubectl config use-context mini-system

Ensuite listez les « pods »

kubectl get pods

Réactivez le contexte « kubelabs » à l’aide de la commande suivante afin de réactiver un contexte par défaut:

kubectl config use-context kubelabs

Afin de supprimer le contexte mini-system, lancez la commande suivante:

kubectl config delete-context mini-system

Listez les « namespaces »

kubectl get namespaces
kubectl get namespace
kubectl get ns

On peut aussi utiliser la commande « kubectl » pour accéder aux définitions des ressources k8s

kubectl explain node.spec

Listez les « pods » sur tous les « namespaces »

kubectl get pods --all-namespaces
kubectl get pods -A

Listez les pods par namespace

kubectl get pods --namespace=kube-system
kubectl get pods -n kube-system

5. Pods

5.1 Création et manipulation

Dans cet exercice on va créer un pod pour un serveur « nginx ». Avec « kubectl » exécutez la commande suivante:

kubectl run web --image=nginx --port 80

Listez les « pods » afin de voir son « node » d’exécution et l’ip qui a lui été assignée

kubectl get pods -o wide

Récupérez plus d’informations sur le « pod » web

kubectl describe pod web

Affichez le « namespace » de ce « pod »

kubectl get pod -o custom-columns=NS:metadata.namespace,KIND:kind,NAME:metadata.name

Affichez uniquement les noms des « pods »

kubectl get pod -o custom-columns=NAME:metadata.name --no-headers
kubectl get pod -o name

Afin de comprendre le comportement de pod en cas de crash on va simuler un crash. On va se connecter au container de pod

kubectl exec -it web -- /bin/bash

Une fois, dans le conteneur créez un fichier test dans « /tmp »

echo "test" > /tmp/test

Installez le gestionnaire de process « procps » puis vérifiez que nginx est bien démarré

apt update
apt install procps
ps -ef

Ensuite, sortez du conteneur puis vérifiez que le fichier a bien été créé.

kubectl exec web -- ls /tmp

Ensuite on va faire le crash de pod avec la commande suivante

kubectl exec web -- kill 1

Listez à nouveau les « Pods »

kubectl get pods -o wide

Premier constat: le pod a redémarré automatiquement. Autre constatation, le nombre de démarrages du pod a augmenté (champ RESTARTS). Kubernetes donne également le temps du dernier redémarrage.

Vérifiez le fichier « /tmp/test »

kubectl exec web -- ls /tmp

Que constatez-vous ?

Supprimez ce « pod »

kubectl delete pod web

Créez un manifeste « nginx.yml » pour redéployer le service « nginx » pensez à utiliser « –dry-run »

kubectl run web --image=nginx --port 80 --dry-run=client -o yaml

Modifiez ce manifeste pour prendre en considération les caractéristiques suivantes:

  • Nom : web
  • image: nginx:latest
  • entrypoint: “nginx”
  • les options de entrypoint: “-g”, “daemon off;”, “-q”
  • exposed port : 80

Le fichier nginx.yml aura alors le contenu suivant:

apiVersion: v1
kind: Pod
metadata:
  name: web
  labels:
    env: development
spec:
  containers:
  - name: nginx
    image: nginx
    command: ["nginx"]
    args: ["-g", "daemon off;", "-q"]
    ports:
    - containerPort: 80

Ensuite, déployez ce pod avec la commande suivante:

kubectl create -f nginx.yml

Listez les pods

kubectl get pods -o wide

Accédez au container du pod

kubectl exec -it web -- /bin/bash

Lancez les commandes suivantes dans le container

ls -l /
echo "hello k8s pod demo" > /usr/share/nginx/html/index.html

Testez le serveur « nginx »

curl http://localhost
curl http://<IP_POD>

Sortez du container et connectez-vous au « node » de « pod » et testez le server « nginx »

minikube ssh -p kubelabs -n [node_pod]
curl http://<IP_POD>

Sortez de node worker (CTRL+D)

Affichez les « labels » des « pods »

kubectl get pods --show-labels

Afin de tester la connexion entre les « pods » on va déployer un autre pod « testpod ». Déployez ce « pod » avec accès direct au container

kubectl run testpod -it --image alpine -- /bin/sh

Une fois dans le container exécutez la commande suivante:

wget -qO - http://<IP_POD_WEB>

Supprimez les pod

kubectl delete pods --all

5.2 Challenge

  • Créer un pod nommé « pingpod» à partir de l’image « alpine » qui envoie des ping sur 127.0.0.1. Ce pod doit être créé avec les « labels » suivant: env=dev, app=shell
  • Affichez le pod
  • Affichez les labels de pod
  • Ajouter le label « team=ops » au pod
  • Affichez uniquement le pod qui contient ce label « team=ops »
  • Affichez en « streaming » les logs associés à ce pod.
  • Supprimez le pod

6. Label & selector

Déployer le « pod » décrit dans le manifeste monpod.yml suivant:

apiVersion: v1
kind: Pod
metadata:
  name: whoami
  labels:
    app: demo
spec:
  containers:
    - name: app
      image: sixeyed/whoami:21.04

Lancez le « pod » avec cette commande

kubectl apply -f monpod.yml

Listez les pods avec le label app

kubectl get pods --selector=app

Listez les valeurs de label « app »

kubectl get pods -L app

Récupérez le moteur container associé à ce Pod

kubectl get pods -l app=demo -o jsonpath="{.items[*].status.containerStatuses[*].containerID}"

Affichez les labels d’un ensemble de ressources

kubectl get --show-labels po,rs,deploy,svc,no

Supprimez ce « pod » avec la commande suivante:

kubectl delete pod whoami

7. Installation des plugins

Il est possible d’ajouter des extensions (plugins) à la commande « kubectl », pour cela on va utiliser « krew ».

Krew est un gestionnaire de packages pour Kubectl, la CLI officielle de Kubernetes. En utilisant Krew, vous pouvez trouver, installer et mettre à jour les plugins Kubectl qui étendent la CLI avec des fonctionnalités supplémentaires.

Intallez krew avec le script suivant :

(
  set -x; cd "$(mktemp -d)" &&
  OS="$(uname | tr '[:upper:]' '[:lower:]')" &&
  ARCH="$(uname -m | sed -e 's/x86_64/amd64/' -e 's/\(arm\)\(64\)\?.*/\1\2/' -e 's/aarch64$/arm64/')" &&
  KREW="krew-${OS}_${ARCH}" &&
  curl -fsSLO "https://github.com/kubernetes-sigs/krew/releases/latest/download/${KREW}.tar.gz" &&
  tar zxvf "${KREW}.tar.gz" &&
  ./"${KREW}" install krew
)

Ensuite ajoute cette ligne dans « ~/.bashrc »

export PATH="${PATH}:${HOME}/.krew/bin"

Validez l’installation avec cette commande

kubectl krew list

Affichez tous les plugins

kubectl krew search

On va installer quelques plugins et voir leurs utilisations

kubectl krew install viewnode
kubectl viewnode

Un autre plugin à installer est « kube-score ». Il analyse les manifests de manière statique avant de les déployer. Kube-score existe sous forme de plugin kubectl, pour l’installer rien de plus simple avec krew.

kubectl krew install score