Kubernetes & Rancher — Introduction
Lexique des concepts K8s et des composants utilisés sur le cluster. Usage pratique de Rancher au quotidien pour ce repo : voir infra.md.
Lexique K8s
DaemonSet
- Pop 1 pod par nœud
Déploiement
- Objet qui pop des pods, et contrairement au DaemonSet, il n'est pas conscient des Nodes, il pop un pod quelque part
- Si on met le replica à 1, on a un pod par Déploiement
- Le volume est partagé entre les pods replica
- Ça sert par exemple quand tu dois partager un dossier de sessions en fichiers plats
StatefulSet
- Comme un déploiement, mais on réclame un volume de stockage PAR pod
- Si un seul replica, ça revient au même
- Ça sert pour faire un cluster de DB : on ne veut pas que les 2-3 pods modifient le même volume de DB, par contre les volumes se sync entre eux, donc on partage les ressources de lecture/écriture, mais la donnée est la même
Controller Network Interface (CNI)
- Quand K8s pop 1 pod, la CNI va lui assigner une IP interne automatiquement
- Il y a un DNS interne qui se met à jour régulièrement
Application
- Concept Rancher (pas un objet K8s natif) : regroupe Déploiement + Service + Ingress dans l'UI Rancher — voir infra.md
Pod
- Prend des secrets et des configmap
Network Policy
- Règles des ouvertures de flux entre les pods
- ⚠️ Actuellement, tous les flux sont ouverts
- Le fonctionnement actuel est donc d'utiliser les NP pour fermer un flux, et pas pour l'ouvrir
- À changer dans le futur
Ingress
- Routage de l'extérieur vers 1 service qui lui-même redirige vers le pod
- Génère des fichiers de configuration qu'il envoie à Kong qui les applique
Service
- A une IP stable, et un DNS interne qui distribue le trafic vers un Pod ou un ensemble de Pods
Ingress Controller
- Reverse proxy, on utilise Kong actuellement, et pas Nginx
- Il faudrait changer ça un jour
Stockage
- K8s ne fait pas de stockage, il implémente des objets de base qui font du stockage
- CSI (Container Storage Interface)
Ressources
- En général on ne met pas de limite de CPU
- Les limites de CPU sont exprimées en millième de CPU
- Il y a le request et le limit
PersistentVolume
- Disque provisionné dans le cluster, créé par une PVC (Persistent Volume Claim)
- Le pod génère une PVC
CSI (Container Storage Interface)
- Interface standardisée entre K8s et les solutions de stockage
- Longhorn implémente CSI
Composants
Rancher
- Rancher est un proxy de l'API de Kube au-dessus de Kubectl : il prend du yaml, le traduit en demandes à l'API Kube qui elle-même ordonne au controller manager la création de Pods
Longhorn
- Chaque nœud du cluster expose son stockage local
- Quand on crée un volume, Longhorn le réplique sur N nœuds ; si un nœud tombe, les répliques prennent le relai
- Création : définition d'une StorageClass avec provider
driver.longhorn.io, un pod référence la PVC, le pod voit un filesystem classique
Kong
- Reverse proxy
HelmChart
- Templates de configuration de déploiements
- À mettre à jour de temps en temps
Role Based Access Control (RBAC)
K8s utilise RBAC : l'idée est de définir qui peut faire quoi sur quelles ressources.
- Role — Définit des permissions dans un namespace donné
- ClusterRole — Définit des permissions sur tout le cluster, ou sur des ressources non-namespacées (nodes, PV, namespaces eux-mêmes...)
- RoleBinding — Lie un sujet à un Role (ou un ClusterRole) dans un namespace
- ClusterRoleBinding — Lie un sujet à un ClusterRole sur tout le cluster
Un ClusterRole peut être réutilisé avec un simple RoleBinding pour appliquer des permissions génériques sans les redéfinir par namespace :
| Type | Définition | Portée |
|---|---|---|
| Role | Quoi faire | Dans 1 namespace |
| ClusterRole | Quoi faire | Cluster-wide (ou réutilisable) |
| RoleBinding | Qui + role | Dans 1 namespace |
| ClusterRoleBinding | Qui + role | Partout |
La combinaison classique pour un outil comme Longhorn : un ClusterRole (car il doit accéder aux nodes, PV, et plusieurs namespaces) + un ClusterRoleBinding vers son ServiceAccount.
| Sujet RBAC | Description |
|---|---|
| User | Utilisateur humain (géré hors K8s, via certificats/OIDC) |
| Group | Groupe d'utilisateurs |
| ServiceAccount | Identité d'un pod/process dans le cluster |
Ajouter une variable d'env dans Rancher
Pour ajouter une variable d'env sur Rancher il faut aller dans Apps -> installedApps -> settings -> Edit/Upgrade -> Values
Dans ce fichier ajouter la variable d'env voulue (dans deployments / extraEnvVars) -> Tout en bas appuyer sur update
⚠️ En prod il faut également modifier dans deployments -> image -> tag le numéro de version pour que ça coincide avec celui actuellement en prod : cf (https://status.article-1.eu/)