Créez un dossier « lab02 » et basculez dans ce dossier
mkdir lab02
cd lab02
La ligne de commande « kubectl » permet depuis sa machine de travail de contrôler un cluster K8s.
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']}"
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
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:
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
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
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