M41: Virtualization et Cloud Computing IRIC (S4)
TP
Installation et Configuration de Kubernetes
Au cours de nos TPs nous allons passer rapidement en revue deux manières de mettre en place
Kubernetes :
Un cluster de développement avec minikube
Un cluster managed loué chez un provider (Scaleway, DigitalOcean, Azure ou Google
Cloud)
Nous allons d’abord passer par la première option.
1. Découverte de Kubernetes
1.1. Installer le client CLI 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.
Noter que :
kubectl peut gérer plusieurs clusters/configurations et switcher entre ces configurations
kubectl est nécessaire pour le client graphique Lens que nous utiliserons plus tard.
Pour installer kubectl sur Ubuntu nous ferons simplement :
sudo snap install kubectl --classic
Pour afficher la version du client kubectl : kubectl version
1.2. Installer Minikube
Minikube est la version de développement de Kubernetes (en local) la plus répandue. Elle est
maintenue par la cloud native foundation et très proche de kubernetes upstream. Elle permet
de simuler un ou plusieurs nœuds de cluster sous forme de conteneurs docker ou de machines
virtuelles.
Pour installer minikube la méthode recommandée est indiquée
ici: [Link]
Pr H. IDRISSI
1
M41: Virtualization et Cloud Computing IRIC (S4)
Nous utiliserons classiquement docker comme runtime pour minikube (les nœuds k8s seront
des conteneurs simulant des serveurs). Ceci est une configuration de développement. Elle se
comporte cependant de façon très proche d’un véritable cluster.
Si Docker n’est pas installé, installer Docker avec la commande en une seule ligne :
curl -fsSL [Link] | sh
puis, ajoutez-vous au groupe Docker avec :
sudo usermod -a -G docker <votrenom>
pour que cela prenne effet, faites : sudo reboot .
Pour lancer le cluster faites simplement : minikube start
(il est également possible de préciser le nombre de cœurs de calcul, la mémoire et
d’autre paramètre pour adapter le cluster à nos besoins.)
Minikube configure automatiquement kubectl (dans le fichier ~/.kube/config) pour
qu’on puisse se connecter au cluster de développement.
Testez la connexion avec : kubectl get nodes
Affichez à nouveau la version : kubectl version
Cette fois-ci la version de kubernetes qui tourne sur le cluster actif est également affichée.
Idéalement le client et le cluster devrait être dans la même version mineure par
exemple 1.20.x.
Bash completion
Pour permettre à kubectl de compléter le nom des commandes et ressources avec <Tab> il
est utile d’installer l’auto-complétion pour Bash :
Vous pouvez désormais appuyer sur <Tab> pour compléter vos commandes kubectl, c’est
très utile !
Pr H. IDRISSI
2
M41: Virtualization et Cloud Computing IRIC (S4)
2. Explorer le cluster k8s
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 :
Listez les nœuds pour récupérer le nom de l’unique node : kubectl get nodes
Puis, affichez ses caractéristiques avec : kubectl describe node/minikube
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/minikube ou nodes minikube) car
k8s ne peut pas deviner ce que l’on cherche quand plusieurs ressources ont le même nom.
Pour afficher tous les types de ressources à la fois que l’on utilise :
kubectl get all
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 :
Afficher les namespaces : 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 y 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 namespace :
kubectl get all -n kube-system
Pr H. IDRISSI
3
M41: Virtualization et Cloud Computing IRIC (S4)
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
3. Déployer une Application
Nous allons maintenant déployer une première application conteneurisée. Le déploiement est
plus complexe qu’avec Docker (et Swarm), en particulier car il est séparé en plusieurs objets
et plus configurable.
Pour créer un déploiement en ligne de commande (par opposition au mode déclaratif
que nous verrons plus loin), on peut lancer par exemple :
kubectl create deployment microbot --image=monachus/rancher-demo
Cette commande crée un objet de type deployment. Nous pouvons étudier ce déploiement
avec la commande :
kubectl describe deployment/microbot
Agrandissons ce déploiement avec :
kubectl scale deployment microbot --replicas=5
kubectl describe deployment/microbot permet de constater que le
service est bien passé à 5 réplicas.
A ce stade le déploiement n’est pas encore accessible de l’extérieur du cluster pour cela nous
devons l’exposer en tant que service :
kubectl expose deployment microbot --type=NodePort --port=8080
--name=microbot-service
Affichons la liste des services pour voir le résultat : kubectl get services
Un service permet d’exposer un déploiement soit par port soit grâce à un loadbalancer.
Pr H. IDRISSI
4
M41: Virtualization et Cloud Computing IRIC (S4)
Pour exposer cette application sur le port de notre choix, nous devrions avoir recours à un
LoadBalancer.
Nous ne verrons pas ça ici (il faudrait utiliser l’addon MetalLB de Minikube).
Mais nous pouvons quand même lancer une commande dans notre environnement de dev:
kubectl port-forward svc/microbot-service 8080:8080 --address [Link]
Vous pouvez désormais accéder à votre app via : [Link]
Minikube intègre aussi une façon d’accéder à notre service : c’est la commande
minikube service microbot-service
Sauriez-vous expliquer ce que l’app fait ?
Simplifier les lignes de commande k8s
Pour gagner du temps dans les commandes Kubernetes, on définit généralement un
alias : alias kc='kubectl'
À mettre dans votre .bash_profile en faisant :
echo "alias kc='kubectl'" >> ~/.bash_profile
puis, 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 :
o services devient svc
o deployments devient deploy
o etc.
La liste complète : [Link]
c8eff9fb7202
Essayez d’afficher les serviceaccounts (users) et les namespaces avec une commande
courte.
4. Installer Lens
Lens est une interface graphique sympathique pour Kubernetes.
Pr H. IDRISSI
5
M41: Virtualization et Cloud Computing IRIC (S4)
Elle se connecte en utilisant la configuration ~/.kube/config par défaut et nous
permettra d’accéder à un dashboard bien plus agréable à utiliser.
Vous pouvez l’installer en lançant ces commandes :
5. Mettre en place un cluster K8s dans le cloud avec un
provider type DigitalOcean ou Scaleway
Créez un compte (ou récupérez un accès) sur DigitalOcean ou Scaleway
Créez un cluster Kubernetes avec l’interface DigitalOcean ou bien l’interface Scaleway
La création prend environ 5 minutes.
Sur DigitalOcean, il vous est proposé dans l’étape 3 ou sur la page de votre cluster
Kubernetes de télécharger le fichier kubeconfig. (download the cluster
configuration file, ou bien Download Config File).
De même, sur Scaleway, sur la page décrivant votre cluster, un gros bouton en bas de
la page vous incite à télécharger ce même fichier kubeconfig (Download
Kubeconfig).
Ce fichier contient la configuration kubectl adaptée pour la connexion à notre cluster.
6. Merger la configuration kubectl
Ouvrez avec gedit les fichiers kubeconfig et ~/.kube/config.
Fusionnez dans ~/.kube/config les éléments des listes YAML de:
clusters
contexts
users
Mettez la clé current-context : à <nom_cluster> (compléter avec votre
valeur).
Testons la connexion avec : kubectl get nodes
Pr H. IDRISSI
6
M41: Virtualization et Cloud Computing IRIC (S4)
7. Déployer l’Application
Lancez kubectl cluster-info , l’API du cluster est accessible depuis un nom
de domaine généré par le provider.
Déployez l’application microbot comme dans la partie précédente
avec minikube
Pour visitez l’application vous devez trouver l’IP publique d’un des nœuds du cluster
en listant les objets de type Service, ou sur la page du fournisseur de cloud.
8. Cloud Azure
Nous allons déployer une application dans Azure à l’aide de charts Helm
: [Link]
8.1. Helm
Dans Kubernetes la configuration des services / applications se fait généralement via de
multiples fichiers YAML.
Le langage YAML (Yet Another Markup Language) est un langage de sérialisation de données
lisible par l’homme servant à écrire des fichiers de configuration. Il est populaire, car il est
conçu pour être facile à comprendre par rapport à d’autres langages de programmation.
Pour toutes ces raisons, il est utilisé par des logiciels comme Kubernetes ou Ansible.
===> Les fichiers de kustomization
Il est courant de décrire un ensemble de ressources dans le même fichier, séparées par ---.
Mais on pourrait préférer rassembler plusieurs fichiers dans un même dossier et les appliquer
d’un coup. Pour cela K8s propose le concept de kustomization.
Exemple :
On peut ensuite l’appliquer avec kubectl apply -k ./
Pour visualiser l’ensemble des modifications avant de les appliquer :
Pr H. IDRISSI
7
M41: Virtualization et Cloud Computing IRIC (S4)
kubectl kustomize
(kubectl kustomize . | less pour mieux lire).
Quand on a une seule application cela reste gérable avec des kustomizations ou sans, mais
dès qu’on a plusieurs environnements, applications et services, on se retrouve vite submergées
de fichiers de centaines, voire de milliers, de lignes qui sont, de plus, assez semblables. Pour
pallier ce problème, il existe l’utilitaire Helm, qui produit les fichiers de déploiement que l’on
souhaite.
o Helm est le package manager recommandé par Kubernetes, il utilise les
fonctionnalités de templating du langage Go.
o Helm permet donc de déployer des applications / stacks complètes en utilisant un
système de templating et de dépendances, ce qui permet d’éviter la duplication et d’avoir
ainsi une arborescence cohérente pour nos fichiers de configuration.
o Helm propose également :
la possibilité de mettre les Charts dans un répertoire distant (Git, disque local
ou partagé…), et donc de distribuer ces Charts publiquement.
un système facilitant les Updates et Rollbacks de vos applications.
o Il existe des sortes de stores d’applications Kubernetes packagées avec Helm, le plus
gros d’entre eux est Kubeapps Hub,
8.2. Créer un Cluster AKS
Configurer l’environnement Azure
Tout d’abord, il faut créer un compte Azure. Si c’est la première fois, du crédit gratuit est
disponible : [Link] Ensuite on peut utiliser le Cloud Shell
Azure ou n’importe quel terminal.
Au préalable, installer kubectl, si ce n’est pas déjà fait (pas besoin dans le Cloud Shell) :
Pr H. IDRISSI
8
M41: Virtualization et Cloud Computing IRIC (S4)
Créer le Cluster k8s
Créer le registry pour les images Docker
Pour créer le registry, il faut choisir un nom unique, remplacez pommedeterrepoirekiwi par
un autre nom.
8.3. Pousser une image sur son registry Azure
Pour installer Docker :
curl -sSL [Link] | sudo sh
Pr H. IDRISSI
9
M41: Virtualization et Cloud Computing IRIC (S4)
8.4. Appliquer une Chart Helm
Pour installer Helm :
Curl
[Link]
-helm-3 | bash
Des messages s’affichent suite à l’application de la chart Helm, suivez les instructions pour
accéder au Wordpress.
Liens Utiles
Scaling d’application dans Azure
[Link]
Stockage dans Azure
[Link]
Registry dans Azure
[Link]
Terraform avec Azure
Terraform est un outil permettant de décrire des ressources cloud dans un fichier pour utiliser le
concept d’infrastructure-as-code avec tous les objets des fournisseurs de Cloud.
Pr H. IDRISSI
10
M41: Virtualization et Cloud Computing IRIC (S4)
[Link]
r
Le réseau dans Azure
Vidéo “K8s Networking in Azure”
[Link]
&index=2
Pr H. IDRISSI
11