tuto: Update k8s

This commit is contained in:
nemunaire 2022-11-30 04:33:10 +01:00
commit c954191b1a
13 changed files with 211 additions and 147 deletions

View file

@ -1,14 +1,14 @@
Vue d'ensemble de Kubernetes
----------------------------
*Kubernetes* (prononcé Ku-ber-né-tice[^prononciation-k8s] en grec) est
un système open source d'orchestration et de gestion de
conteneurs. C'est-à-dire qu'il se charge de coller constamment aux
spécifications qu'on lui aura demandées.
*Kubernetes* (prononcé Ku-ber-né-tice[^prononciation-k8s] en grec) est un
système *open source* d'orchestration et de gestion de conteneurs. C'est-à-dire
qu'il se charge de faire coller constamment la liste des conteneurs qu'il voit
vivant aux spécifications qu'on lui aura demandées.
[^prononciation-k8s]: <https://github.com/kubernetes/kubernetes/issues/44308>
Ce projet est l'aboutissement de plus d'une dizaine d'années
Ce projet est l'aboutissement de plus d'une quinzaine d'années
d'expérience de gestion de conteneurs applicatifs chez Google
(rappelons que c'est eux qui ont poussé de nombreuses technologies
dans le noyau Linux, notamment les *cgroups*, ...).
@ -32,9 +32,15 @@ différentes méthodes ...
![Architecture de Kubernetes](k8s-archi.png)
Un cluster Kubernetes est composé dun (ou plusieurs) nœuds *master*, et dune série de *workers*.
Un cluster Kubernetes est composé dun (ou plusieurs) nœuds *control-plane*, et
dune série de nœuds *workers*.
Sur le(s) *master(s)*, on retrouve les composants suivants :
Le(s) *control-plane(s)* sont en charge de prendre des décisions globales sur
le déroulement des opérations du cluster : cela va de la détection d'anomalies
sur le cluster ou encore le traiter d'événements et l'organisation de leur
réponse, ...
On retrouve sur ces nœuds centraux les composants suivants :
API HTTP
: On distingue plusieurs API, elles sont toutes utilisées pour communiquer avec
@ -42,11 +48,15 @@ API HTTP
L'ordonnanceur
: Il a la responsabilité de monitorer les ressources utilisées sur chaque nœud
et de répartir les conteneurs en fonction des ressources disponibles.
et de répartir les nouveaux conteneurs en fonction des ressources
disponibles.
Le contrôleur
: Il va contrôler l'état des applications déployées au sein du cluster, pour
s'assurer d'être dans l'état désiré.
Les contrôleurs
: Ils vont contrôler l'état des différents composants déployées au sein du
cluster, pour s'assurer d'être dans l'état désiré. Il y a en fait plusieurs
contrôleurs ayant chacun la responsabilité de veiller sur une partie des
objets, ainsi que le `cloud-controller-manager` lorsque le cluster se trouve
chez un hébergeur cloud compatibles.
**`etcd`**
: Il s'agit d'une base de données clef/valeur, supportant la
@ -60,56 +70,24 @@ via deux composants :
`kubelet`
: C'est l'agent qui va se charger de créer les conteneurs et les manager, afin
de répondre aux spécifications.
de répondre aux spécifications demandées par les *control-planes*.
`kube-proxy`
: Ce programme va servir de load-balancer pour se connecter aux pods.
: Ce programme va servir de load-balancer pour se connecter aux conteneurs. Il
se base généralement sur le système de filtrage de paquet du système et est
donc amené à l'altérer.
Sans oublier le moteur de conteneurs (généralement Docker), qui va
effectivement se charger de lancer les conteneurs demandés par `kubelet`.
Sans oublier le moteur de conteneurs (généralement [CRI-O](https://cri-o.io/)),
qui va effectivement se charger de lancer les conteneurs demandés par
`kubelet`.
\
Évidemment, chaque élément de l'architecture est malléable à souhait, c'est la
raison pour laquelle il peut être très difficile de mettre en place une
architecture Kubernetes : avec ou sans haute-disponibilité, un nœud master
dédié au contrôle, avec un moteur de conteneur exotique (`rkt`, `ctr`, ...).
### *Resources*
Avec Docker, nous avons eu l'habitude de travailler avec des objets (images,
containers, networks, volumes, secrets, ...). Au sein de Kubernetes, cela
s'appelle des *resources* et elles sont très nombreuses.
Parmi les plus courantes, citons les types (désignés *Kind* dans l'API, rien à
voir avec le projet `kind` au début du sujet) suivants :
node
: il s'agit d'une machine de notre cluster (elle peut être physique ou
virtuelle).
pod
: un groupe de conteneurs travaillant ensemble. Il s'agit de la ressource que
l'on déploie sur un *node*. Les conteneurs au sein d'un *pod* ne peuvent pas
être séparés pour travailler sur deux *nodes* différents.
service
: c'est un point de terminaison (*endpoint*), stable dans le temps, sur lequel
on peut se connecter pour accéder à un ou plusieurs
conteneurs. Historiquement, appelés portails/*portals*, on les retrouve
encore quelques fois désignés ainsi dans de vieux articles.
namespace
: à ne pas confondre avec les *namespaces* Linux. Ici il s'agit d'espaces de
noms divers, pour Kubernetes.
secret
: comme `docker secret`, il s'agit d'un moyen de passer des données sensibles à
un conteneur.
Pour voir la liste complète des *resources*, on utilise : `kubectl
api-resources`.
architecture Kubernetes : avec ou sans haute-disponibilité, avec le bon nombre
de nœuds décideurs, avec un gestionnaire de réseau qui correspond aux besoins,
avec un moteur de conteneur exotique (`rkt`, `ctr`, ...), etc.
### Modèle réseau
@ -120,22 +98,66 @@ tous les conteneurs. Il ne doit pas y avoir de NAT, que ce soit entre les
élément, sans qu'il y ait de routage.
C'est un modèle assez simpliste au premier abord, mais en raison de la
nécessité de faire un minimum de filtrage, de nombreuses extensions viennent
compléter ce schéma...
diversité des infrastructures et des besoins différents de chacun, de
nombreuses extensions viennent compléter ce schéma.
Chaque plugin implémente la [spécification
La [spécification
CNI](https://github.com/containernetworking/cni/blob/master/SPEC.md#network-configuration)
(Container Network Interface). On trouve donc autant de plugins qu'il y a de
besoins en termes de réseau.
(pour Container Network Interface) définit l'interface commune que les plugins
doivent gérer : il s'agit de pouvoir ajouter et configurer une interface, la
supprimer ou de vérifier qu'une interface va bien.
Ainsi, à la création d'un conteneur, Kubernetes va laisser aux plugins CNI le
loisir d'allouer l'adresse IP, d'ajouter les interfaces réseaux adéquates, de
configurer les routes, les règles de pare-feu, ...
loisir d'ajouter les interfaces réseaux adéquates, d'allouer l'adresse IP, de
configurer les routes, les règles de pare-feu, ... quelque soit
l'infrastructure et la complexité du réseau utilisé derrière.
\
Terminons en ajoutant qu'un serveur DNS faisant autorité est nécessaire pour
que, de la même manière que Docker, il soit possible d'accéder aux autres
conteneurs via leur nom (sans qu'il ne soit nécessaire de le déclarer sur un
serveur de noms public). Il n'y a pas de projet de porté par Kubernetes pour
cela, mais cette tâche est généralement assurée par
[CoreDNS](https://coredns.io/).
### *Resources*
Avec Docker, nous avons eu l'habitude de travailler avec des objets (images,
containers, networks, volumes, secrets, ...). Au sein de Kubernetes, cela
s'appelle des *resources* et elles sont très nombreuses.
Parmi les plus courantes, citons les types (désignés *Kind* dans l'API, rien à
voir avec le projet `kind` dont on va parler par ailleurs) suivants :
node
: il s'agit d'une machine de notre cluster (elle peut être physique ou
virtuelle).
pod
: un groupe de conteneurs travaillant ensemble. C'est la ressource que l'on
déploie sur un *node*. Les conteneurs au sein d'un *pod* ne peuvent pas être
séparés pour travailler sur deux *nodes* différents.
service
: c'est un point de terminaison (*endpoint*), stable dans le temps, sur lequel
on peut se connecter pour accéder à un ou plusieurs
conteneurs. Historiquement, appelés portails/*portals*, on les retrouve
encore quelques fois désignés ainsi dans de vieux articles.
namespace
: à ne pas confondre avec les *namespaces* Linux. Ici il s'agit d'espaces
nommés que Kubernetes va utiliser pour regrouper des objets ensembles.
secret
: comme `docker secret`, il s'agit d'un moyen de passer des données sensibles à
un conteneur.
Pour voir la liste complète des *resources*, on utilise : `kubectl
api-resources`.
### Pour aller plus loin
* La documentation de Kubernetes : <https://kubernetes.io/docs/>
* A Reference Architecture for Deploying WSO2 Middleware on Kubernetes :\
<https://medium.com/containermind/a-reference-architecture-for-deploying-wso2-middleware-on-kubernetes-d4dee7601e8e>
* Les spécifications CNI : <https://github.com/containernetworking/cni/blob/master/SPEC.md#network-configuration>
* Les spécifications CNI : <https://github.com/containernetworking/cni/blob/main/SPEC.md>