ProHoster > Blog > administration > Volumes éphémères avec suivi de la capacité de stockage : EmptyDir sous stéroïdes
Volumes éphémères avec suivi de la capacité de stockage : EmptyDir sous stéroïdes
Certaines applications doivent également stocker des données, mais elles sont tout à fait à l'aise avec le fait que les données ne seront pas enregistrées après un redémarrage.
Par exemple, les services de mise en cache sont limités par la RAM, mais peuvent également déplacer des données rarement utilisées vers un stockage plus lent que la RAM, avec peu d’impact sur les performances globales. Les autres applications doivent être conscientes du fait que les fichiers peuvent contenir des entrées en lecture seule, telles que des paramètres ou des clés secrètes.
Kubernetes a déjà plusieurs types volumes éphémères, mais leur fonctionnalité est limitée à ce qui est implémenté dans les K8.
Éphémère Volumes CSI a permis à Kubernetes d'être étendu avec des pilotes CSI pour fournir la prise en charge de volumes locaux légers. De cette façon, il est possible d'utiliser structures arbitraires: paramètres, secrets, données d'identification, variables, etc. Les pilotes CSI doivent être modifiés pour prendre en charge cette fonctionnalité Kubernetes, car il est supposé que les pilotes standardisés classiques ne fonctionneront pas - mais il est supposé que de tels volumes peuvent être utilisés sur n'importe quel nœud sélectionné pour le pod.
Cela peut poser un problème pour les volumes qui consomment des ressources hôtes importantes ou pour le stockage disponible uniquement sur certains hôtes. C'est pourquoi Kubernetes 1.19 introduit deux nouvelles fonctionnalités de volume de test alpha qui sont conceptuellement similaires aux volumes EmptyDir :
volumes éphémères à usage général ;
Suivi de la capacité de stockage CSI.
Avantages de la nouvelle approche :
le stockage peut être local ou connecté via un réseau ;
les volumes peuvent avoir une taille spécifiée qui ne peut pas être dépassée par l'application ;
fonctionne avec tous les pilotes CSI qui prennent en charge le provisionnement de volumes persistants et (pour prendre en charge le suivi de la capacité) implémentent l'appel GetCapacity;
les volumes peuvent avoir des données initiales en fonction du pilote et des paramètres ;
toutes les opérations standards avec un volume (création d'un instantané, redimensionnement, etc.) sont prises en charge ;
les volumes peuvent être utilisés avec n'importe quel contrôleur d'application qui accepte une spécification de module ou de volume ;
Le planificateur Kubernetes sélectionne lui-même les nœuds appropriés, il n'est donc plus nécessaire de provisionner et de configurer des extensions de planificateur ou de modifier des webhooks.
Applications
Par conséquent, les volumes éphémères à usage général conviennent aux cas d’utilisation suivants :
Mémoire persistante en remplacement de la RAM pour Memcached
Dernières versions de memcached support supplémentaire en utilisant de la mémoire persistante (Intel Optane, etc., environ. traducteur) au lieu de la RAM normale. Lors du déploiement de Memcached via un contrôleur d'application, vous pouvez utiliser des volumes éphémères à usage général pour demander qu'un volume d'une taille donnée soit alloué à PMEM à l'aide du pilote CSI, par exemple PMEM-CSI.
Stockage local LVM comme espace de travail
Les applications qui fonctionnent avec des données plus volumineuses que la RAM peuvent nécessiter un stockage local avec une taille ou des mesures de performances que les volumes EmptyDir classiques de Kubernetes ne peuvent pas fournir. Par exemple, à cet effet, il a été écrit TopoLVM.
Accès en lecture seule aux volumes de données
L'allocation d'un volume peut entraîner la création d'un volume complet lorsque :
Ces volumes peuvent être montés en mode lecture seule.
Comment ça marche
Volumes éphémères à usage général
Une caractéristique clé des volumes éphémères à usage général est la nouvelle source de volume, EphemeralVolumeSource, contenant tous les champs permettant de créer une demande de volume (historiquement appelée demande de volume persistante, PVC). Nouveau contrôleur dans kube-controller-manager examine les pods qui créent une telle source de volume, puis crée un PVC pour ces pods. Pour le pilote CSI, cette requête ressemble aux autres, donc aucune prise en charge particulière n'est nécessaire ici.
Tant que de tels PVC existent, ils peuvent être utilisés comme n’importe quelle autre requête sur le volume. En particulier, ils peuvent être référencés comme source de données lors de la copie d'un volume ou de la création d'un instantané à partir d'un volume. L'objet PVC contient également l'état actuel du volume.
Les noms des PVC créés automatiquement sont prédéfinis : ils sont une combinaison du nom du pod et du nom du volume, séparés par un trait d'union. Les noms prédéfinis facilitent l'interaction avec le PVC car vous n'avez pas besoin de le rechercher si vous connaissez le nom du pod et le nom du volume. L'inconvénient est que le nom est peut-être déjà utilisé, ce qui est détecté par Kubernetes et, par conséquent, le démarrage du pod est bloqué.
Pour garantir que le volume est supprimé avec le pod, le contrôleur envoie une demande au volume appartenant au propriétaire. Lorsque le pod est supprimé, le mécanisme standard de garbage collection fonctionne, qui supprime à la fois la requête et le volume.
Les demandes sont mises en correspondance par le pilote de stockage via le mécanisme normal de la classe de stockage. Bien que les cours avec liaison immédiate et tardive (c'est-à-dire WaitForFirstConsumer) sont pris en charge, pour les volumes éphémères, il est logique d'utiliser WaitForFirstConsumer, le planificateur peut alors prendre en compte à la fois l'utilisation du nœud et la disponibilité du stockage lors de la sélection d'un nœud. Une nouvelle fonctionnalité apparaît ici.
Suivi de la capacité de stockage
En règle générale, le planificateur ne sait pas où le pilote CSI créera le volume. Il n'existe également aucun moyen pour le planificateur de contacter directement le conducteur pour demander ces informations. Par conséquent, le planificateur interroge les nœuds jusqu'à ce qu'il en trouve un sur lequel les volumes sont accessibles (liaison tardive) ou laisse entièrement le choix de l'emplacement au pilote (liaison immédiate).
nouveau APICSIStorageCapacity, qui est en phase alpha, permet de stocker les données nécessaires dans etcd afin qu'elles soient disponibles pour le planificateur. Contrairement à la prise en charge des volumes éphémères à usage général, lorsque vous déployez le pilote, vous devez activer le suivi de la capacité de stockage : external-provisioner devrait publier les informations de capacité reçues du conducteur via le canal normal GetCapacity.
Si le planificateur doit sélectionner un nœud pour un espace avec un volume non lié qui utilise une liaison tardive et que le pilote a activé cette fonctionnalité lors du déploiement en définissant l'indicateur CSIDriver.storageCapacity, les nœuds qui n'ont pas suffisamment de capacité de stockage seront automatiquement supprimés. Cela fonctionne à la fois pour les volumes éphémères et persistants à usage général, mais pas pour les volumes éphémères CSI car leurs paramètres ne peuvent pas être lus par Kubernetes.
Comme d'habitude, les volumes immédiatement liés sont créés avant la planification des pods, et leur emplacement est choisi par le pilote de stockage, donc lors de la configuration external-provisioner Par défaut, les classes de stockage avec liaison immédiate sont ignorées, puisque ces données ne seront de toute façon pas utilisées.
Étant donné que le planificateur Kubernetes est obligé de travailler avec des informations potentiellement obsolètes, rien ne garantit que la capacité sera disponible dans tous les cas lors de la création du volume, mais les chances qu'il soit créé sans nouvelle tentative sont néanmoins augmentées.
NB Vous pouvez obtenir des informations plus détaillées, ainsi que « vous entraîner sur le stand des chats » en toute sécurité et, en cas de situation totalement incompréhensible, bénéficier d'une assistance technique qualifiée lors de cours intensifs - Base Kubernetes aura lieu du 28 au 30 septembre, et pour les spécialistes plus avancés Méga Kubernetes 14-16 octobre.
sécurité
Capacité de stockage CSIS
Les objets CSIStorageCapacity résident dans des espaces de noms ; lors du déploiement de chaque pilote CSI dans son propre espace de noms, il est recommandé de restreindre les droits RBAC sur CSIStorageCapacity dans cet espace, car il est évident d'où proviennent les données. Kubernetes ne vérifie pas cela de toute façon, et généralement les pilotes sont placés dans le même espace de noms, donc en fin de compte, les pilotes sont censés fonctionner et ne pas publier de données incorrectes (et c'est là que ma carte a échoué, environ. traducteur basé sur une blague barbue)
Volumes éphémères à usage général
Si les utilisateurs ont le droit de créer un pod (directement ou indirectement), ils pourront également créer des volumes éphémères à usage général même s'ils n'ont pas le droit de créer une requête sur le volume. En effet, les contrôles d'autorisation RBAC sont appliqués au contrôleur qui crée le PVC, et non à l'utilisateur. C'est le principal changement à ajouter à votre compte, avant d'activer cette fonctionnalité sur les clusters où les utilisateurs non approuvés ne devraient pas avoir le droit de créer des volumes.
Exemple
Séparé branche PMEM-CSI contient toutes les modifications nécessaires pour exécuter un cluster Kubernetes 1.19 dans des machines virtuelles QEMU avec toutes les fonctionnalités de la phase alpha. Le code du pilote n'a pas changé, seul le déploiement a changé.
Sur une machine adaptée (Linux, un utilisateur normal peut utiliser Docker, voir ici détails), ces commandes feront apparaître le cluster et installeront le pilote PMEM-CSI :
git clone --branch=kubernetes-1-19-blog-post https://github.com/intel/pmem-csi.git
cd pmem-csi
export TEST_KUBERNETES_VERSION=1.19 TEST_FEATURE_GATES=CSIStorageCapacity=true,GenericEphemeralVolume=true TEST_PMEM_REGISTRY=intel
make start && echo && test/setup-deployment.sh
Une fois que tout a fonctionné, la sortie contiendra des instructions d'utilisation :
The test cluster is ready. Log in with [...]/pmem-csi/_work/pmem-govm/ssh.0, run
kubectl once logged in. Alternatively, use kubectl directly with the
following env variable:
KUBECONFIG=[...]/pmem-csi/_work/pmem-govm/kube.config
secret/pmem-csi-registry-secrets created
secret/pmem-csi-node-secrets created
serviceaccount/pmem-csi-controller created
...
To try out the pmem-csi driver ephemeral volumes:
cat deploy/kubernetes-1.19/pmem-app-ephemeral.yaml |
[...]/pmem-csi/_work/pmem-govm/ssh.0 kubectl create -f -
Les objets CSIStorageCapacity ne sont pas destinés à être lus par des humains, un certain traitement est donc requis. Les filtres du modèle Golang afficheront les classes de stockage, cet exemple affichera le nom, la topologie et la capacité :
Essayons de créer une application de démonstration avec un seul volume éphémère à usage général. Contenu du fichier pmem-app-ephemeral.yaml:
# This example Pod definition demonstrates
# how to use generic ephemeral inline volumes
# with a PMEM-CSI storage class.
kind: Pod
apiVersion: v1
metadata:
name: my-csi-app-inline-volume
spec:
containers:
- name: my-frontend
image: intel/pmem-csi-driver-test:v0.7.14
command: [ "sleep", "100000" ]
volumeMounts:
- mountPath: "/data"
name: my-csi-volume
volumes:
- name: my-csi-volume
ephemeral:
volumeClaimTemplate:
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 4Gi
storageClassName: pmem-csi-sc-late-binding
Après avoir créé, comme indiqué dans les instructions ci-dessus, nous disposons maintenant d'un pod et d'un PVC supplémentaires :
$ kubectl get pods/my-csi-app-inline-volume -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
my-csi-app-inline-volume 1/1 Running 0 6m58s 10.36.0.2 pmem-csi-pmem-govm-worker1 <none> <none>
$ kubectl get pvc/my-csi-app-inline-volume-my-csi-volume
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
my-csi-app-inline-volume-my-csi-volume Bound pvc-c11eb7ab-a4fa-46fe-b515-b366be908823 4Gi RWO pmem-csi-sc-late-binding 9m21s
Si une autre application a besoin de plus de 26620Mi, le planificateur n'en tiendra pas compte pmem-csi-pmem-govm-worker1 dans tous les cas.
Quelle est la prochaine?
Les deux fonctionnalités sont encore en développement. Plusieurs applications ont été ouvertes lors des tests alpha. Les liens vers la proposition d'amélioration documentent le travail qui doit être effectué pour passer à la phase bêta, ainsi que les alternatives qui ont déjà été envisagées et rejetées :