Aller au contenu principal

TP Matin - Premiers pas avec kubectl

TP Matin​

Installer Kubernetes, explorer le cluster et déployer un premier pod.

Contexte​

Votre environnement de lab est un VPS Ubuntu. Vous allez installer k3s, découvrir les commandes de base de kubectl, et déployer votre premier pod Kubernetes.


Focus​

  • ✅ kubeconfig : Comprendre et afficher la configuration de connexion au cluster

  • ✅ kubectl : Maîtriser les commandes de base (get, describe, run, delete, logs, exec)

  • ✅ Namespaces : Créer et utiliser un namespace dédié

  • ✅ Premier pod : Déployer, inspecter et supprimer un pod


Objectif​

  • ✅ k3s installé et accessible via kubectl

  • ✅ kubeconfig affiché et compris

  • ✅ Namespace mynamespace créé

  • ✅ Pod ubuntu déployé, inspecté, puis supprimé


Tips : alias kubectl​

# File: .bash_aliases
alias k='kubectl'
alias kcon='kubectl config get-contexts'
alias kx='kubectl config use-context'
alias kn='kubectl config set-context --current --namespace'
alias kg='kubectl get'
alias kdesc='kubectl describe'
alias ka='kubectl apply -f'
alias kc='kubectl create'
alias kdel='kubectl delete'
alias kev='kubectl get events --sort-by .lastTimestamp'
alias kl='kubectl logs'
export yaml='--dry-run=client -o yaml'
export now='--grace-period 0 --force'
source .bash_aliases

Étape 1 - Installer k3s​

Objectif : Avoir un cluster Kubernetes opérationnel.

  • Action : Installer k3s via le script officiel
    Observation : sudo kubectl get nodes retourne un node en état Ready

  • Action : Récupérer le kubeconfig pour utiliser kubectl sans sudo
    Observation : kubectl get nodes (sans sudo) fonctionne avec votre utilisateur normal

  • Action : Vérifier les versions client et serveur
    Observation : kubectl version affiche les deux versions — elles devraient être dans la même version mineure (ex: 1.28.x)

Indice
# Sur ubuntu, supprimer le kubectl snap si présent
sudo rm /snap/bin/kubectl

curl -sfL https://get.k3s.io | sudo sh -

sudo kubectl get nodes

⚠️ k3s tourne en root et écrit son kubeconfig dans /etc/rancher/k3s/k3s.yaml, lisible uniquement par root. Sans étape supplémentaire, toute commande kubectl doit être préfixée par sudo — ce qui casse l'autocomplétion, les alias, et tout outil qui lit ~/.kube/config (Lens, k9s, plugins krew...).

La solution recommandée : copier ce kubeconfig dans le vôtre, en vous en rendant propriétaire.

mkdir -p ~/.kube
sudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
sudo chown $(id -u):$(id -g) ~/.kube/config
chmod 600 ~/.kube/config

Désormais kubectl get nodes (sans sudo) doit fonctionner :

kubectl get nodes
kubectl version

Cette copie est figée : si k3s régénère son kubeconfig (rare), il faudra recopier. Pour un poste de travail durable, il est aussi possible de configurer k3s au moment de l'installation pour qu'il écrive un fichier accessible à un groupe dédié (--write-kubeconfig-mode 640 + --write-kubeconfig-group), mais la copie manuelle suffit largement pour ce cours.


Étape 2 - Configurer bash completion et alias​

Objectif : Travailler efficacement en ligne de commande.

  • Action : Installer l'autocomplétion kubectl et les alias du tips ci-dessus
    Observation : La touche <Tab> complète les commandes et noms de ressources kubectl
Indice
sudo apt install bash-completion
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ${HOME}/.bashrc

La liste complète des raccourcis : https://blog.heptio.com/kubectl-resource-short-names-heptioprotip-c8eff9fb7202


Étape 3 - Explorer le cluster​

Objectif : Comprendre la structure d'un cluster Kubernetes.

  • Action : Afficher le kubeconfig
    Observation : Le fichier indique le cluster, l'utilisateur et le contexte courant. Repérez l'adresse de l'API server et le certificat.

  • Action : Lister les nodes et leurs caractéristiques
    Observation : kubectl describe node/<nom> montre les ressources disponibles, les labels, et les pods qui tournent dessus

  • Action : Lister tous les namespaces, puis toutes les ressources de kube-system
    Observation : Le namespace kube-system contient les composants internes de Kubernetes eux-mêmes sous forme de pods

  • Action : Lister toutes les ressources de tous les namespaces
    Observation : kubectl get all -A montre tout le cluster

Indice
kubectl config view
kubectl get nodes
kubectl describe node/<nom-du-node>
kubectl get namespaces
kubectl get all -n kube-system
kubectl get all -A
kubectl describe namespace/kube-system

Étape 4 - Créer un namespace​

Objectif : Isoler vos ressources dans un espace dédié.

  • Action : Créer le namespace mynamespace
    Observation : Il apparaît dans kubectl get namespaces
Indice
kubectl create namespace mynamespace

Étape 5 - Déployer une application en CLI​

Objectif : Créer et explorer un déploiement impératif.

  • Action : Créer un déploiement demonstration avec l'image monachus/rancher-demo
    Observation : kubectl describe deployment/demonstration montre les événements de création

  • Action : Scaler le déploiement à 5 réplicas
    Observation : kubectl get pods montre 5 pods, les événements de scaling apparaissent dans le describe

  • Action : Exposer le déploiement via un service NodePort sur le port 8080
    Observation : kubectl get services montre le service avec un port 3xxxx assigné

Indice
kubectl create deployment demonstration --image=monachus/rancher-demo
kubectl describe deployment/demonstration
kubectl get pods

kubectl scale deployment demonstration --replicas=5
kubectl describe deployment/demonstration

kubectl expose deployment demonstration --type=NodePort --port=8080 --name=demonstration-service
kubectl get services

Étape 6 - Déployer et inspecter un pod dans votre namespace​

Objectif : Créer, observer, exécuter des commandes dans et supprimer un pod.

  • Action : Lancer un pod ubuntu avec l'image ubuntu:latest dans mynamespace, commande tail -f /dev/null
    Observation : Le pod est en état Running dans kubectl get pod -n mynamespace

  • Action : Inspecter le pod avec get et describe
    Observation : describe montre les événements, l'image, le node, les conditions du pod

  • Action : Afficher le manifeste YAML complet du pod
    Observation : Le YAML généré décrit l'état complet tel que Kubernetes le voit

  • Action : Supprimer le pod
    Observation : Le pod disparaît de la liste

Indice
kubectl run ubuntu --image=ubuntu:latest --namespace mynamespace -- tail -f /dev/null

kubectl get pod ubuntu -n mynamespace
kubectl describe pod ubuntu -n mynamespace
kubectl get pod ubuntu -n mynamespace -o yaml

# Filtrer une info précise avec jsonpath
kubectl get pod ubuntu -n mynamespace -o jsonpath='{.spec.containers[0].image}'

kubectl delete pod ubuntu -n mynamespace

Étape 7 - Outils CLI supplémentaires​

Objectif : Découvrir l'écosystème kubectl.

  • Action : Installer krew (gestionnaire de plugins kubectl) puis kubectx et kubens
    Observation : kubectx liste vos contextes, kubens liste vos namespaces et permet d'en choisir un par défaut
Indice
# Installer krew : https://krew.sigs.k8s.io/docs/user-guide/setup/install/
kubectl krew install ctx
kubectl krew install ns

kubectx # changer de cluster
kubens # changer de namespace courant

Avancé​

  • Relancer le pod sans tail -f /dev/null. Que se passe-t-il ? Pourquoi ?

  • Utiliser kubectl get pod ubuntu -o jsonpath='{.status.phase}' pour filtrer l'état

  • Lister tous les événements : kubectl get events --sort-by .lastTimestamp -n mynamespace

  • Installer viddy (alternative à watch) pour observer l'évolution des ressources en temps réel

  • Essayer kubectl port-forward svc/demonstration-service 8080:8080 — quelle différence avec le NodePort ?


Solution​

Afficher
kubectl config view
kubectl create namespace mynamespace
kubectl run ubuntu --image=ubuntu:latest --namespace mynamespace -- tail -f /dev/null
kubectl get pod ubuntu --namespace mynamespace
kubectl describe pod ubuntu --namespace mynamespace
kubectl get pod ubuntu -o yaml --namespace mynamespace
kubectl delete pod ubuntu --namespace mynamespace