2019-11-26 15:00:39 +00:00
|
|
|
|
Mise en place
|
2022-05-12 07:30:16 +00:00
|
|
|
|
-------------
|
2019-11-26 15:00:39 +00:00
|
|
|
|
|
2022-02-24 19:43:43 +00:00
|
|
|
|
La mise en place d'un cluster Kuernetes est une opération qui peut s'avérer
|
|
|
|
|
très longue et complexe, car elle nécessite l'installation et la configuration
|
|
|
|
|
de nombreux composants avant de pouvoir être utilisé pleinement.
|
2021-09-11 12:41:43 +00:00
|
|
|
|
|
|
|
|
|
Cette opération n'étant pas très palpitante (c'est beaucoup de lecture de
|
|
|
|
|
documentations et d'heures passées à essayer de faire tomber en marche tous les
|
2022-06-26 19:08:01 +00:00
|
|
|
|
composants d'un seul coup), nous ne la verrons pas ici.
|
2021-09-11 12:41:43 +00:00
|
|
|
|
|
|
|
|
|
D'ailleurs, dans le milieu professionnel, il est plutôt rare de voir des
|
|
|
|
|
entreprises investir dans la gestion de leur propre cluster Kubernetes. La
|
2021-11-19 23:00:30 +00:00
|
|
|
|
plupart des entreprises qui font le choix d'utiliser Kubernetes pour gérer leurs
|
2021-09-11 12:41:43 +00:00
|
|
|
|
infrastructures, choisissent de passer par un prestataire. L'entreprise délègue
|
2021-11-19 23:00:30 +00:00
|
|
|
|
donc la gestion de son/ses cluster(s) à une autre entreprise, dont c'est le cœur de
|
2021-09-11 12:41:43 +00:00
|
|
|
|
métier. La plupart du temps, il va s'agir d'Amazon (via [Elastic Kubernetes
|
2022-02-24 19:43:43 +00:00
|
|
|
|
Service](https://aws.amazon.com/fr/eks/)), d'Azure [Kubernetes
|
2021-09-11 12:41:43 +00:00
|
|
|
|
Service](https://azure.microsoft.com/fr-fr/services/kubernetes-service/)) ou
|
|
|
|
|
Google ([Kubernetes Engine](https://cloud.google.com/kubernetes-engine/)), mais
|
|
|
|
|
d'autres acteurs plus petits existent aussi
|
|
|
|
|
([OVHcloud](https://www.ovhcloud.com/fr/public-cloud/kubernetes/), ...).
|
|
|
|
|
|
2021-11-19 23:00:30 +00:00
|
|
|
|
::::: {.more}
|
2021-09-11 12:41:43 +00:00
|
|
|
|
|
2021-11-19 23:00:30 +00:00
|
|
|
|
Pour l'IoT ou l'Edge Computing, sur du matériel léger, il existe le projet
|
2022-02-24 19:43:43 +00:00
|
|
|
|
k3s[^k3s] : il s'agit d'une distribution Kubernetes beaucoup plus simple à
|
2021-11-19 23:00:30 +00:00
|
|
|
|
déployer, et parfaitement adaptée à la production sur Raspberry Pi et autres.
|
|
|
|
|
|
|
|
|
|
:::::
|
|
|
|
|
|
2022-02-24 19:43:43 +00:00
|
|
|
|
[^k3s]: Lightweight Kubernetes : <https://k3s.io/>
|
2021-11-19 23:00:30 +00:00
|
|
|
|
|
2022-06-26 19:08:01 +00:00
|
|
|
|
Pour jouer, plusieurs solutions s'offrent à nous pour commencer à
|
2021-09-11 12:41:43 +00:00
|
|
|
|
utiliser Kubernetes facilement :
|
|
|
|
|
|
2022-02-24 19:43:43 +00:00
|
|
|
|
- [Docker Desktop (for Mac ou for Windows) :](#dockerdesktop) si vous êtes sur l'un de ces
|
2021-11-19 23:00:30 +00:00
|
|
|
|
systèmes c'est la solution la plus simple,
|
2022-02-24 19:43:43 +00:00
|
|
|
|
- [Kubernetes in Docker (kind) :](#kind) pour tenter l'aventure sur votre machine,
|
|
|
|
|
- [Play With Kubernetes :](#pwk) si vous ne vous en sortez pas avec `kind`.
|
2021-11-19 23:00:30 +00:00
|
|
|
|
|
2022-02-24 19:43:43 +00:00
|
|
|
|
### Docker for Mac/Windows {#dockerdesktop}
|
2021-11-19 23:00:30 +00:00
|
|
|
|
|
2022-05-12 00:46:31 +00:00
|
|
|
|
*Docker Desktop* pour Mac ou pour Windows intègre Kubernetes directement. Il
|
2021-11-19 23:00:30 +00:00
|
|
|
|
n'est pas activé par défaut, pour cela il convient d'activer l'option dans les
|
2022-02-24 19:43:43 +00:00
|
|
|
|
préférences de l'application :
|
2021-11-19 23:00:30 +00:00
|
|
|
|
|
2022-02-25 09:38:57 +00:00
|
|
|
|
![Paramètres de Docker Desktop](docker-desktop-k8s.png)
|
2021-11-19 23:00:30 +00:00
|
|
|
|
|
|
|
|
|
Une fois l'option activée, vous pouvez passer au chapitre suivant, la commande
|
|
|
|
|
`kubectl` devrait marcher directement pour vous. C'est principalement grâce à
|
|
|
|
|
cette commande que nous interagirons avec l'API de Kubernetes.
|
|
|
|
|
|
2022-02-24 19:43:43 +00:00
|
|
|
|
Une fois que tout sera opérationnel, nous devrions obtenir :
|
2021-11-19 23:00:30 +00:00
|
|
|
|
|
|
|
|
|
<div lang="en-US">
|
|
|
|
|
```
|
|
|
|
|
42sh$ kubectl version
|
2022-02-24 19:43:43 +00:00
|
|
|
|
Client Version: version.Info{Major:"1", minor:"22", GitVersion:"v1.22.2", [...]
|
|
|
|
|
Server Version: version.Info{Major:"1", minor:"21", GitVersion:"v1.21.5", [...]
|
2021-11-19 23:00:30 +00:00
|
|
|
|
```
|
|
|
|
|
</div>
|
2019-11-26 15:00:39 +00:00
|
|
|
|
|
|
|
|
|
|
2022-02-24 19:43:43 +00:00
|
|
|
|
### Kubernetes in Docker (kind) {#kind}
|
2019-11-26 15:00:39 +00:00
|
|
|
|
|
2021-11-19 23:00:30 +00:00
|
|
|
|
`kind` est un projet permettant de lancer un cluster Kubernetes directement via
|
2019-11-26 15:00:39 +00:00
|
|
|
|
Docker.
|
|
|
|
|
|
|
|
|
|
Pour commencer, il nous faudra télécharger le binaire (go, donc statique)
|
2022-02-24 19:43:43 +00:00
|
|
|
|
suivant (il existe pour Linux, macOS et Windows) :
|
2019-11-26 15:00:39 +00:00
|
|
|
|
|
2022-02-24 19:43:43 +00:00
|
|
|
|
<https://github.com/kubernetes-sigs/kind/releases/latest>
|
2021-11-19 23:00:30 +00:00
|
|
|
|
|
2022-02-24 19:43:43 +00:00
|
|
|
|
Placez le binaire (`chmod +x {}`) dans un endroit où il sera accessible de
|
|
|
|
|
votre `$PATH`.
|
2021-11-19 23:00:30 +00:00
|
|
|
|
|
2019-11-26 15:00:39 +00:00
|
|
|
|
|
2022-02-24 19:43:43 +00:00
|
|
|
|
Notre prochaine étape est de décrire le cluster que l'on souhaite avoir : 1
|
2021-11-19 23:00:30 +00:00
|
|
|
|
master et 2 workers, ça fera l'affaire. Attention tout de même de ne pas être
|
2022-02-24 19:43:43 +00:00
|
|
|
|
trop extravagant, car chaque nœud consomme pas mal de RAM ! Et puis nous
|
2021-11-19 23:00:30 +00:00
|
|
|
|
pourrons facilement changer cette configuration plus tard.
|
2019-11-26 15:00:39 +00:00
|
|
|
|
|
|
|
|
|
<div lang="en-US">
|
|
|
|
|
```bash
|
|
|
|
|
cat > my-cluster.yml <<EOF
|
|
|
|
|
kind: Cluster
|
2021-09-11 12:41:43 +00:00
|
|
|
|
apiVersion: kind.x-k8s.io/v1alpha4
|
2019-11-26 15:00:39 +00:00
|
|
|
|
nodes:
|
|
|
|
|
- role: control-plane
|
2021-09-11 12:41:43 +00:00
|
|
|
|
extraPortMappings:
|
|
|
|
|
- containerPort: 8080
|
|
|
|
|
hostPort: 12345
|
|
|
|
|
- containerPort: 30001
|
|
|
|
|
hostPort: 30001
|
|
|
|
|
- containerPort: 30002
|
|
|
|
|
hostPort: 30002
|
2019-11-26 15:00:39 +00:00
|
|
|
|
- role: worker
|
|
|
|
|
- role: worker
|
|
|
|
|
EOF
|
|
|
|
|
kind create cluster --config my-cluster.yml
|
|
|
|
|
```
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
La création du cluster peut prendre quelques minutes.
|
|
|
|
|
|
2022-02-24 19:43:43 +00:00
|
|
|
|
Profitons-en pour télécharger `kubectl` :\
|
|
|
|
|
<https://storage.googleapis.com/kubernetes-release/release/v1.22.2/bin/linux/amd64/kubectl>
|
2019-11-26 15:00:39 +00:00
|
|
|
|
|
2021-11-19 23:00:30 +00:00
|
|
|
|
C'est principalement grâce à cette commande que nous interagirons avec l'API de
|
2019-11-26 15:00:39 +00:00
|
|
|
|
Kubernetes.
|
|
|
|
|
|
2022-02-24 19:43:43 +00:00
|
|
|
|
Une fois que tout sera opérationnel, nous devrions obtenir :
|
2019-11-26 15:00:39 +00:00
|
|
|
|
|
|
|
|
|
<div lang="en-US">
|
|
|
|
|
```
|
|
|
|
|
42sh$ kubectl version
|
2022-02-24 19:43:43 +00:00
|
|
|
|
Client Version: Version.Info{Major:"1", Minor:"22", GitVersion:"v1.22.2", [...]
|
|
|
|
|
Server Version: Version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.5", [...]
|
2019-11-26 15:00:39 +00:00
|
|
|
|
```
|
|
|
|
|
</div>
|
|
|
|
|
|
2021-09-11 12:41:43 +00:00
|
|
|
|
Par défaut, `kubectl` va tenter de contacter le port local 2375, `kind` aura
|
|
|
|
|
pris soin de l'exposer pour vous au moment de la création du cluster.
|
|
|
|
|
|
2021-11-19 23:00:30 +00:00
|
|
|
|
Passez ensuite au chapitre suivant si vous avez réussi à mettre en place `kind`.
|
2019-11-26 15:00:39 +00:00
|
|
|
|
|
2022-02-24 19:43:43 +00:00
|
|
|
|
### Play With Kubernetes {#pwk}
|
2019-11-26 15:00:39 +00:00
|
|
|
|
|
2021-11-19 23:00:30 +00:00
|
|
|
|
::::: {.warning}
|
|
|
|
|
|
|
|
|
|
Cette section vous concerne uniquement si vous n'avez pas réussi à créer de
|
|
|
|
|
cluster Kubernetes selon les autres méthodes décrites.
|
|
|
|
|
|
|
|
|
|
:::::
|
|
|
|
|
|
2022-02-24 19:43:43 +00:00
|
|
|
|
De la même manière que pour les exercices utilisant Docker, si vous avez des
|
2019-11-26 15:00:39 +00:00
|
|
|
|
difficultés pour réaliser les exercices sur vos machines, vous pouvez utiliser
|
|
|
|
|
le projet [Play With K8s](https://play-with-k8s.com/) qui vous donnera accès à
|
2022-02-24 19:43:43 +00:00
|
|
|
|
un bac à sable avec lequel vous pourrez réaliser tous les exercices.
|
2019-11-26 15:00:39 +00:00
|
|
|
|
|
2022-02-24 19:43:43 +00:00
|
|
|
|
Il nous faut créer plusieurs instances, disons 3 : parmi elles, 1 instance sera
|
2019-11-26 15:00:39 +00:00
|
|
|
|
la master, nous l'utiliserons principalement, les deux autres ne feront
|
|
|
|
|
qu'exécuter des conteneurs, nous pourrons les oublier dès qu'on les aura
|
|
|
|
|
connectées au master.
|
|
|
|
|
|
|
|
|
|
Pour initialiser notre cluster Kubernetes, nous allons devoir créer notre
|
2022-02-24 19:43:43 +00:00
|
|
|
|
master. Pour cela, dans notre première instance, nous allons taper :
|
2019-11-26 15:00:39 +00:00
|
|
|
|
|
|
|
|
|
<div lang="en-US">
|
|
|
|
|
```bash
|
|
|
|
|
kubeadm init --apiserver-advertise-address $(hostname -i)
|
|
|
|
|
```
|
|
|
|
|
</div>
|
|
|
|
|
|
2021-11-19 23:00:30 +00:00
|
|
|
|
Cette action peut prendre quelques minutes et devrait se finir, si tout se
|
2022-02-24 19:43:43 +00:00
|
|
|
|
passe bien, par :
|
2019-11-26 15:00:39 +00:00
|
|
|
|
|
|
|
|
|
<div lang="en-US">
|
|
|
|
|
```
|
|
|
|
|
Your Kubernetes master has initialized successfully!
|
|
|
|
|
|
|
|
|
|
To start using your cluster, you need to run (as a regular user):
|
|
|
|
|
|
|
|
|
|
mkdir -p $HOME/.kube
|
|
|
|
|
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
|
|
|
|
|
sudo chown $(id -u):$(id -g) $HOME/.kube/config
|
|
|
|
|
|
|
|
|
|
You should now deploy a pod network to the cluster.
|
|
|
|
|
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
|
|
|
|
|
http://kubernetes.io/docs/admin/addons/
|
|
|
|
|
|
|
|
|
|
You can now join any number of machines by running the following on each node
|
|
|
|
|
as root:
|
|
|
|
|
|
2022-02-24 19:43:43 +00:00
|
|
|
|
kubeadm join --token TOKEN IPADDRESS --discovery-token-ca-cert-hash SHAHASH
|
2019-11-26 15:00:39 +00:00
|
|
|
|
```
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
Recopions ensuite la commande `kubeadm join ...` donnée dans le terminal, dans
|
|
|
|
|
nos deux autres instances. Cela permettra aux machines de se connecter au
|
|
|
|
|
master.
|
|
|
|
|
|
|
|
|
|
Dernière étape pour la mise en place de notre cluster, il s'agit de définir un
|
|
|
|
|
profil de politique réseau, sur le master (nous n'exécuterons plus de commande
|
2022-02-24 19:43:43 +00:00
|
|
|
|
sur les autres workers) :
|
2019-11-26 15:00:39 +00:00
|
|
|
|
|
|
|
|
|
<div lang="en-US">
|
|
|
|
|
```bash
|
|
|
|
|
kubectl apply -n kube-system -f \
|
2022-02-24 19:43:43 +00:00
|
|
|
|
"https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | \
|
|
|
|
|
base64 | tr -d '\n')"
|
2019-11-26 15:00:39 +00:00
|
|
|
|
```
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
2022-02-24 19:43:43 +00:00
|
|
|
|
### Minikube, k3d, MicroK8s, ...
|
2019-11-26 15:00:39 +00:00
|
|
|
|
|
2021-09-11 12:41:43 +00:00
|
|
|
|
Si les solutions précédentes ne sont pas adaptées à votre usage, de nombreuses
|
2019-11-26 15:00:39 +00:00
|
|
|
|
autres applications permettent de mettre en place un cluster plus ou moins
|
2021-11-19 23:00:30 +00:00
|
|
|
|
complet facilement.
|
2019-11-26 15:00:39 +00:00
|
|
|
|
|
|
|
|
|
Vous pouvez tenter d'utiliser
|
2021-11-19 23:00:30 +00:00
|
|
|
|
[k3d](https://k3d.io/),
|
2019-11-26 15:00:39 +00:00
|
|
|
|
[minikube](https://kubernetes.io/docs/setup/learning-environment/minikube/),
|
2021-11-19 23:00:30 +00:00
|
|
|
|
[microk8s](https://microk8s.io/), ...
|
|
|
|
|
|
|
|
|
|
##### `k3d` {-}
|
|
|
|
|
|
|
|
|
|
est un script similaire à `kind`, mais utilise `k3s`, une version plus légère
|
|
|
|
|
et compacte de Kubernetes.
|
|
|
|
|
|
2022-02-24 19:43:43 +00:00
|
|
|
|
Après l'avoir installé, vous pouvez lancer :
|
2021-11-19 23:00:30 +00:00
|
|
|
|
|
|
|
|
|
<div lang="en-US">
|
|
|
|
|
```bash
|
|
|
|
|
k3d cluster create mycluster --agents 2 --kubeconfig-switch-context
|
|
|
|
|
```
|
|
|
|
|
</div>
|