Au cours de nos TPs nous allons passer rapidement en revue deux manières de mettre en place Kubernetes :
k3s
Nous allons d’abord passer par la première option.
kubectl
kubectl est le point d’entré universel pour contrôler tous les type de cluster kubernetes. C’est un client en ligne de commande qui communique en REST avec l’API d’un cluster.
Nous allons explorer kubectl au fur et à mesure des TPs. Cependant à noter que :
kubectl
peut gérer plusieurs clusters/configurations et switcher entre ces configurationskubectl
est nécessaire pour le client graphique Lens
que nous utiliserons plus tard.La méthode d’installation importe peu. Pour installer kubectl sur Ubuntu nous ferons simplement: sudo snap install kubectl --classic
.
kubectl version
pour afficher la version du client kubectl.Pour permettre à kubectl
de compléter le nom des commandes et ressources avec <Tab>
il est utile d’installer l’autocomplétion pour Bash :
sudo apt install bash-completion
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ${HOME}/.bashrc
Vous pouvez désormais appuyer sur <Tab>
pour compléter vos commandes kubectl
, c’est très utile !
k3s
K3s est une distribution de Kubernetes orientée vers la création de petits clusters de production notamment pour l’informatique embarquée et l’Edge computing. Elle a la caractéristique de rassembler les différents composants d’un cluster kubernetes en un seul “binaire” pouvant s’exécuter en mode master
(noeud du control plane) ou agent
(noeud de calcul).
Avec K3s, il est possible d’installer un petit cluster d’un seul noeud en une commande ce que nous allons faire ici:
curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="--disable=traefik" sh -
La configuration kubectl pour notre nouveau cluster k3s est dans le fichier /etc/rancher/k3s/k3s.yaml
et accessible en lecture uniquement par root
. Pour se connecter au cluster on peut donc faire (parmis d’autre méthodes pour gérer la kubeconfig):
~/.kube
sudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
sudo chown $USER ~/.kube/config
export KUBECONFIG=~/.kube/config
ou rechargez votre terminalkubectl get nodes
qui devrait renvoyer quelque chose proche de:NAME STATUS ROLES AGE VERSION
vnc-stagiaire-... Ready control-plane,master 10m v1.21.7+k3s1
Notre cluster k8s est plein d’objets divers, organisés entre eux de façon dynamique pour décrire des applications, tâches de calcul, services et droits d’accès. La première étape consiste à explorer un peu le cluster :
kubectl get nodes
) puis affichez ses caractéristiques avec kubectl describe node/<nom du node>
.La commande get
est générique et peut être utilisée pour récupérer la liste de tous les types de ressources.
De même, la commande describe
peut s’appliquer à tout objet k8s. On doit cependant préfixer le nom de l’objet par son type (ex : node/<nom du node>
ou nodes <nom du node>
) car k8s ne peut pas deviner ce que l’on cherche quand plusieurs ressources ont le même nom.
kubectl get all
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2m34s
Il semble qu’il n’y a qu’une ressource dans notre cluster. Il s’agit du service d’API Kubernetes, pour qu’on puisse communiquer avec le cluster.
En réalité il y en a généralement d’autres cachés dans les autres namespaces
. En effet les éléments internes de Kubernetes tournent eux-mêmes sous forme de services et de daemons Kubernetes. Les namespaces sont des groupes qui servent à isoler les ressources de façon logique et en termes de droits (avec le Role-Based Access Control (RBAC) de Kubernetes).
Pour vérifier cela on peut :
kubectl get namespaces
Un cluster Kubernetes a généralement un namespace appelé default
dans lequel les commandes sont lancées et les ressources créées si on ne précise rien. Il a également aussi un namespace kube-system
dans lequel résident les processus et ressources système de k8s. Pour préciser le namespace on peut rajouter l’argument -n
à la plupart des commandes k8s.
Pour lister les ressources liées au kubectl get all -n kube-system
.
Ou encore : kubectl get all --all-namespaces
(peut être abrégé en kubectl get all -A
) qui permet d’afficher le contenu de tous les namespaces en même temps.
Pour avoir des informations sur un namespace : kubectl describe namespace/kube-system
Nous allons maintenant déployer une première application conteneurisée. Le déploiement est un peu plus complexe qu’avec Docker, en particulier car il est séparé en plusieurs objets et plus configurable.
kubectl create deployment demonstration --image=monachus/rancher-demo
.Cette commande crée un objet de type deployment
. Nous pourvons étudier ce deployment avec la commande kubectl describe deployment/demonstration
.
Notez la liste des événements sur ce déploiement en bas de la description.
De la même façon que dans la partie précédente, listez les pods
avec kubectl
. Combien y en a-t-il ?
Agrandissons ce déploiement avec kubectl scale deployment demonstration --replicas=5
kubectl describe deployment/demonstration
permet de constater que le service est bien passé à 5 replicas.
A ce stade impossible d’afficher l’application : le déploiement n’est pas encore accessible de l’extérieur du cluster. Pour régler cela nous devons l’exposer grace à un service :
kubectl expose deployment demonstration --type=NodePort --port=8080 --name=demonstration-service
Affichons la liste des services pour voir le résultat: kubectl get services
Un service permet de créer un point d’accès unique exposant notre déploiement. Ici nous utilisons le type Nodeport car nous voulons que le service soit accessible de l’extérieur par l’intermédiaire d’un forwarding de port.
Une méthode pour accéder à un service (quel que soit sont type) en mode développement est de forwarder le traffic par l’intermédiaire de kubectl (et des composants kube-proxy installés sur chaque noeuds du cluster).
kubectl port-forward svc/demonstration-service 8080:8080 --address 127.0.0.1
http://localhost:8080
. Quelle différence avec l’exposition précédente via minikube ?=> Un seul conteneur s’affiche. En effet kubectl port-forward
sert à créer une connexion de developpement/debug qui pointe toujours vers le même pod en arrière plan.
Pour exposer cette application en production sur un véritable cluster, nous devrions plutôt avoir recours à un service de type un LoadBalancer. Nous y reviendrons dans le cours sur les objets kubernetes.
Pour gagner du temps on dans les commandes Kubernetes on peut définir un alias: alias kc='kubectl'
(à mettre dans votre .bash_profile
en faisant echo "alias kc='kubectl'" >> ~/.bash_profile
, puis en faisant source ~/.bash_profile
).
Vous pouvez ensuite remplacer kubectl
par kc
dans les commandes.
Également pour gagner du temps en ligne de commande, la plupart des mots-clés de type Kubernetes peuvent être abrégés :
services
devient svc
deployments
devient deploy
La liste complète : https://blog.heptio.com/kubectl-resource-short-names-heptioprotip-c8eff9fb7202
Je vais louer pour vous montrer un cluster kubernetes managé. Vous pouvez également louez le votre si vous préférez en créant un compte chez ce provider de cloud.
La création prend environ 5 minutes.
kubeconfig
(Download Kubeconfig).Ce fichier contient la configuration kubectl adaptée pour la connexion à notre cluster.
Listez les contextes avec kubectl config get-contexts
et affichez les contexte courant avec kubectl config current-context
.
Changez de contexte avec kubectl config use-context <nom_contexte>
.
Testons quelle connexion nous utilisons avec avec kubectl get nodes
.
Observons les derniers évènements arrivés à notre cluster avec kubectl get events --watch
.
Le moyen le plus classique pour avoir une vue d’ensemble des ressources d’un cluster est d’utiliser la Dashboard officielle. Cette Dashboard est généralement installée par défaut lorsqu’on loue un cluster chez un provider.
On peut aussi l’installer dans minikube ou k3s.
Lens est une interface graphique (un client “lourd”) pour Kubernetes. Elle se connecte en utilisant kubectl et la configuration ~/.kube/config
par défaut et nous permettra d’accéder à un dashboard puissant et agréable à utiliser.
Vous pouvez l’installer en lançant ces commandes :
## Ajouter OpenLens
curl -LO https://github.com/MuhammedKalkan/OpenLens/releases/download/v6.5.2-366/OpenLens-6.5.2-366.amd64.deb
sudo dpkg -i OpenLens-6.5.2-366.amd64.deb
OpenLens