- Glasskube est présenté comme un gestionnaire de paquets open source pour Kubernetes, qui rendrait le déploiement, les mises à jour et la configuration 20 fois plus rapides qu’avec des outils comme Helm ou Kustomize
- Les utilisateurs peuvent déployer des paquets via l’UI Glasskube, la CLI ou une approche GitOps ; l’outil s’inspire de la simplicité de Homebrew et de npm
- Ses principales fonctionnalités incluent l’installation de paquets depuis l’UI sans rechercher de dépôts Helm, la saisie de configuration typée, l’injection de valeurs entre paquets, l’installation tenant compte des dépendances et des mises à jour sûres prétestées
- Tous les paquets Glasskube sont gérés comme des ressources personnalisées et peuvent être manipulés via GitOps ; plusieurs dépôts ainsi que le déploiement de private packages sont également pris en charge
- Il prend actuellement en charge Kubernetes Dashboard, cert-manager, Ingress-NGINX Controller, Kube Prometheus Stack, Cloud Native PG, etc. ; la version bêta peut être installée avec Homebrew
Le problème de gestion de paquets Kubernetes que Glasskube veut résoudre
- Glasskube est un gestionnaire de paquets open source pour Kubernetes
- Il est présenté comme rendant le déploiement, la mise à jour et la configuration de paquets dans Kubernetes 20 fois plus rapides qu’avec des outils comme Helm ou Kustomize
- Inspiré par la simplicité de Homebrew et de npm, il permet aux utilisateurs de choisir l’une des approches suivantes
- l’UI Glasskube
- la CLI Glasskube
- le déploiement direct de paquets via GitOps
- Son développement part de l’expérience acquise pendant plus de cinq ans dans l’écosystème Kubernetes, avec des difficultés récurrentes autour de la gestion de paquets, de la configuration et du déploiement
- Dans les workflows existants, beaucoup de temps était consacré à créer des modèles et à rédiger de la documentation pour des commandes et concepts difficiles à comprendre
- Des outils comme Homebrew, apt et dnf, simples à utiliser et peu problématiques, ont servi de point de comparaison pour le développement de Glasskube
Flux d’installation et de configuration
- La version bêta peut être installée avec Homebrew
brew install glasskube/tap/glasskube
- Les autres options d’installation sont disponibles dans le guide d’installation
- Après l’installation de la CLI, exécutez la commande suivante pour installer les composants nécessaires dans le cluster
glasskube bootstrap
- Une fois le bootstrap du cluster terminé, vous pouvez démarrer l’UI du gestionnaire de paquets
glasskube serve
- Cette commande ouvre
http://localhost:8580 dans le navigateur par défaut, où l’utilisateur peut parcourir et installer les paquets disponibles
UI, configuration et gestion des dépendances
- L’UI Glasskube regroupe tous les paquets au même endroit, permettant d’installer des paquets dans le cluster sans devoir rechercher séparément des dépôts Helm
- La configuration des paquets peut être définie avec des entrées typées via l’UI ou un questionnaire interactif en CLI
- Il est facile d’injecter des valeurs depuis d’autres paquets, ConfigMap ou Secret
- L’approche proposée évite l’usage de fichiers
values.yaml non typés et non documentés
- La gestion des dépendances permet aux paquets Glasskube d’être utilisés et référencés par plusieurs autres paquets
- Les paquets dépendants sont installés dans le namespace approprié
- Le README décrit cela comme « la façon dont les umbrella charts auraient dû fonctionner dès le départ »
Mises à jour, GitOps et prise en charge des dépôts
- Les mises à jour de paquets permettent de prévisualiser une pending update vers la version souhaitée, puis de l’exécuter en un clic ou via une commande CLI
- Toutes les mises à jour sont prétestées avec la suite de tests Glasskube
- Les réactions et commentaires sur les paquets peuvent être laissés dans les GitHub discussions ou directement dans l’UI Glasskube
- L’intégration GitOps repose sur la gestion de tous les paquets Glasskube comme des ressources personnalisées
- Une intégration avec Renovate est également en cours ; l’issue correspondante se trouve sur renovatebot/renovate#29322
- Plusieurs dépôts et des private packages peuvent être utilisés
- Cela peut servir à déployer des paquets de services internes à l’entreprise
- Le scénario mis en avant consiste à permettre aux développeurs de configurer facilement des services internes à jour
Architecture d’installation des paquets
- Le flux
glasskube install [package] repose sur une architecture dans laquelle l’UI ou la CLI utilise à la fois le dépôt de paquets et l’API Kubernetes via le Client
- L’UI se connecte au Client via le serveur local
http://localhost:8580
- La CLI se connecte au Client via la CLI cobra
- Le Client consulte d’abord le Package Repo pour la validation du paquet
- Après validation, il crée une ressource personnalisée
Package dans l’API Kubernetes
- Dans le cluster,
PackageController et PackageInfoController effectuent la réconciliation (reconcile)
PackageController réconcilie Package et crée PackageInfo si nécessaire
PackageInfoController met à jour le manifest du paquet depuis le dépôt de paquets
- Le manifest mis à jour est reflété dans
PackageInfo
- Ensuite,
PackageController déploie le paquet dans Kubernetes
- Kubernetes renvoie l’état du paquet au Client
Paquets pris en charge et informations sur le projet
- Glasskube prend déjà en charge plusieurs paquets
- La liste complète des paquets pris en charge et à venir est disponible sur glasskube.dev/packages
- Le projet associé Glasskube Apps Operator
glasskube/operator existe également
- Les problèmes, bugs et demandes de fonctionnalités peuvent être signalés via Discord ou les issues GitHub
- Glasskube est distribué sous licence Apache 2.0
1 commentaires
Avis sur Hacker News
C’est peut-être un pas dans la bonne direction, mais le plus gros problème actuel de la gestion de paquets Kubernetes semble difficile à résoudre avec un gestionnaire de paquets
Ce qui est le plus pénible au quotidien, c’est l’empilement de YAML imbriqué sur plusieurs niveaux, avec un résultat imprévisible
Par exemple, un ArgoCD ApplicationSet crée plusieurs Applications, ces Applications rendent des charts Helm, et ces charts contiennent des CRD utilisés par des opérateurs arbitraires comme Strimzi, Grafana ou Vector
YAML a une syntaxe pauvre et il n’existe pas non plus de standard pour le rendu de templates, si bien qu’il est presque impossible de savoir quel YAML sera réellement injecté dans l’API Kubernetes après une modification au niveau le plus haut
Au final, cela mène chaque mois à des essais-erreurs, à des déploiements blue-green coûteux et à des centaines de minutes de débogage
À mon avis, la bonne direction est de prendre en charge un vrai langage de programmation
Idéalement, il faudrait un système de types statique qui ne soit pas Turing-complet et dont la terminaison soit garantie ; quelque chose comme un Starlark typé semblerait approprié
L’idée est que glasskube[bot] commente les pull requests GitOps avec le diff exact des ressources qui changeront réellement dans tous les clusters concernés
Ce diff est produit par un contrôleur exécuté dans le cluster
On peut voir cela comme une analyse à la codecov, mais dédiée aux changements de ressources
Cela semble être une approche intéressante de la gestion de paquets, et ça paraît adapté à des usages du type cluster à la Homebrew
Cela dit, personnellement, ne serait-ce que pour maintenir la cohérence dans le dépôt, je préfère la combinaison helmfile + Renovate + pipeline
Par exemple, un bouton
update allme semble assez effrayant sur un cluster qui compte vraimentPour des projets personnels, cela reste un outil sympa
Le contrôleur de paquets ressemble beaucoup au Tiller de l’ancien Helm, qui a posé de gros problèmes de sécurité dans de nombreuses entreprises avant d’être retiré dans Helm 3 au profit d’un traitement côté client basé sur des configmaps ; je suis curieux de voir comment ce projet compte dépasser ce problème
Il est aussi possible de les configurer dans le CLI avec les flags
--dry-runet--output yaml, puis de les mettre dans GitNous travaillons également sur des pull requests qui prennent en charge les mises à jour de paquets avec Renovate : https://github.com/renovatebot/renovate/issues/29322
Helm 3 est désormais un outil côté client, il ne peut donc pas imposer lui-même de RBAC
OLM a introduit les Operator Groups(https://olm.operatorframework.io/docs/advanced-tasks/operato...) afin de fournir des permissions au niveau des opérateurs
On pourrait introduire quelque chose de similaire dans les paquets Glasskube ; Glasskube lui-même aura toujours besoin de permissions assez élevées, mais il serait possible de limiter la portée des paquets et d’ajouter des permissions plus granulaires
Traditionnellement, les packages d’applications sont des binaires immuables à version figée avec des étapes avant et après installation ; ils sont construits pour une plateforme donnée et des dépendances précises, et les possibilités de configuration à l’installation sont extrêmement limitées.
Si les packages fonctionnent bien, c’est parce qu’ils sont conçus pour un environnement très spécifique et que l’on minimise ce qui peut être modifié à l’installation.
Malgré cela, même dans ce cadre étroit, les packages de systèmes d’exploitation nécessitent en permanence énormément de tests, de développement et de correctifs.
Si le package que vous installez aujourd’hui paraît simple, c’est peut-être parce que des centaines d’heures ont été consacrées à la plateforme, aux composants et aux versions actuels.
Les « packages » Kubernetes ne sont pas vraiment des packages : ce sont plutôt des ensembles d’instructions décrivant les composants à installer et à configurer, et ils regroupent souvent plusieurs applications distinctes.
Cette différence se manifeste de deux façons : les « packages » K8s ont une définition très lâche, donc beaucoup de variabilité, et toutes sortes de personnes les créent de toutes sortes de manières, avec toutes sortes d’hypothèses sur l’état du système cible.
Pour qu’un « package » Kubernetes fonctionne, plusieurs couches de dépendances et de configuration doivent être alignées.
La version de l’API K8s, la manière dont les composants K8s sont installés et exécutés, les ACL, l’absence de composants existants susceptibles d’entrer en conflit, le verrouillage des versions des composants et conteneurs installés par le package ainsi que leur compatibilité avec le reste du cluster, sans oublier la configuration utilisateur : tout doit correspondre.
Les mises à niveau sont tout aussi confuses, faute de notion d’arbre de versions stables ou de rolling release ; c’est un peu comme installer des fichiers
.deb,.rpmou.dmgarbitraires sur un système d’exploitation en espérant que tout se passe bien.Aujourd’hui, rien ne prend tout cela en charge.
Pour rendre le packaging Kubernetes aussi fluide que le packaging de binaires par plateforme, il faudrait toute une communauté de mainteneurs, ainsi qu’une approche de type rolling release à la Homebrew ou des branches de versions stables.
Au final, il faudrait qu’un projet comme ArtifactHub ou Homebrew gère tous les packages d’une seule et même manière, ce qui représente un gros chantier et ne semble absolument pas rentable.
L’idée est de centraliser toutes les mises à jour et de les tester via des workflows CI/CD, afin que les utilisateurs bénéficient de mises à niveau testées et fluides.
Les utilisateurs peuvent aussi héberger leurs propres dépôts et packages, mais par défaut nous voulons fournir directement un ensemble de packages assumé.
Nous réfléchissons déjà à la construction pour différentes versions ou différents environnements Kubernetes, et ce sera probablement nécessaire un jour si l’on veut intégrer davantage de configuration à l’étape de build.
Je ne suis pas sûr qu’un gestionnaire de packages K8s puisse devenir aussi simple que brew ou apt.
C’est particulièrement lié au fait que les valeurs varient selon l’environnement cible, et que presque tous les utilisateurs ont un environnement « flocon de neige » qui leur est propre.
Utiliser des invites de type REPL ou une interface web pour configurer ces valeurs ne m’attire pas.
La douleur principale reste non résolue : écrire des charts Helm est pénible, il faut gérer les valeurs par environnement, et j’aimerais qu’on n’ait pas à relier les valeurs entre charts.
Les équipes plateforme construisent des plateformes internes pour développeurs afin de standardiser davantage la configuration Kubernetes entre les équipes et les clusters, et de ne laisser aux développeurs que de petites modifications.
D’expérience, ces configurations disparates doivent être réduites, et c’est aussi l’une des raisons pour lesquelles nous avons créé Glasskube.
Je suis d’accord à 100 % pour dire qu’écrire des charts Helm est pénible, et nous voulons changer cela à l’avenir.
Les packages Glasskube restent configurables, mais fournissent des valeurs par défaut pertinentes.
Glasskube permet de référencer facilement les valeurs de configuration d’autres packages, afin de ne pas devoir fournir plusieurs fois la même valeur.
Je crée beaucoup d’opérateurs Kubernetes et je rencontre souvent les problèmes liés à Helm et OLM.
La documentation dit que « les mises à niveau des CRD sont prises en charge par Glasskube afin d’éviter que les CR et les opérateurs ne divergent », mais chercher « CRD » dans la documentation ne donne aucun résultat concret.
C’est aujourd’hui l’une des plus grandes douleurs avec Helm ; je me demande donc si vous pouvez partager votre plan.
[1] <https://stackable.tech/en/>
[2] <https://www.youtube.com/watch?v=Q8OSYOgBdCc>
C’est géré via Manifest ou helm-controller.
La documentation sera mise à jour.
Je pense que Kubernetes est fondamentalement limité par un modèle d’opérateur trop simpliste.
L’idée générale me plaît, mais réduire tout le modèle à « état actuel, état souhaité, prochaine action » est en pratique impossible.
Au final, tout le workflow se retrouve dans la logique de prochaine action, et comme il y a trop d’opérateurs qui observent le même état du système, il est difficile de savoir comment les différents composants vont interagir.
Les problèmes de Helm sont un sous-cas de ce problème plus large.
Par analogie, c’est le même type de problème que celui que la programmation front-end rencontre avec le DOM.
Introduire un paradigme de DOM virtuel/réducteur, comme React, aiderait beaucoup à résoudre ce type de problème.
Il y a un état, un objectif et des perturbations par rapport à cet objectif ; si l’on veut un outil puissant et flexible, ce niveau d’abstraction me paraît approprié.
Le problème, c’est que les caractéristiques physiques et la disposition de la machine font une telle différence que le coût pour les virtualiser ou les simuler de façon pertinente est trop élevé.
À la place, on vérifie donc que l’état de configuration fonctionne sur un sous-ensemble de la structure physique.
C’est l’approche consistant à avoir des environnements
dev,stagingetprod, et à utiliser des déploiements colorés, de l’analyse canary, des rollouts partiels, etc.Si l’utilisation de K8s nécessite ce genre d’outil, il vaut probablement mieux choisir une autre solution.
Kubernetes n’a pas été conçu pour être utilisé sans connaissances préalables, et il est difficile.
À moins de construire un PaaS complet, il est difficile d’échapper à cette complexité.
Cet outil me semble mal orienté côté marketing
Ça n’a pas grand-chose à voir avec Helm
Pour moi, Helm est avant tout un langage de templating, pas un gestionnaire de paquets, et une façon de configurer et d’installer dans des clusters K8s via kubeapps, le CLI Helm et ArgoCD
Cette approche casse aussi un excellent paradigme d’IaC
Car une fois ArgoCD bootstrapé, l’idéal est d’avoir une architecture qui ne fait que référencer des dépôts Git
La démo ne montre pas comment utiliser les fonctionnalités de templating comme la prise en charge des
form, elle montre seulement le resteJ’ai toujours le sentiment qu’il y a quelque chose qui cloche avec Helm, donc honnêtement l’outil lui-même me plaît, mais avec l’approche actuelle je pense qu’il va échouer
Les grandes entreprises n’en ont pas besoin, il sera donc difficile d’obtenir une adoption suffisante
Kubeapps comme Helm fonctionnent bien, et même si l’objectif est de remplacer Helm, il est probable que la prise en charge de Helm reste longtemps
Le problème de Helm, c’est que plus les charts grossissent, plus ils deviennent complexes
Avoir pratiquement tout dans un seul dossier
templates, c’est le bazar ; YAML n’est pas adapté aux templates, etvalues.yamldevient beaucoup trop grosVous trouverez plus de détails sur les options de configuration dans la documentation de configuration des paquets : https://glasskube.dev/docs/design/package-config/
L’argument de vente selon lequel ce serait plus rapide que Helm ne m’attire pas vraiment
Je n’ai jamais eu l’impression que le problème de Helm était la vitesse
Ça a l’air intéressant
Une courte explication de la façon dont cela s’intègre aux outils existants comme ArgoCD, ou s’y compare, aiderait à comprendre
J’ai regardé la vidéo, et comme l’un des outils installés était Argo, cela occupe clairement une autre niche, mais je ne vois pas encore vraiment laquelle
Il est souvent utilisé pour permettre aux développeurs de consulter l’état des applications cœur de métier de l’entreprise sans accès au cluster
Glasskube se concentre sur les paquets dont dépendent ces applications principales
Il gère le cycle de vie des composants d’infrastructure, teste les mises à jour et fournit des chemins de mise à niveau
Vous pouvez aussi placer des paquets Glasskube dans un dépôt GitOps et les synchroniser vers le cluster avec ArgoCD ; PackageController s’occupe du reste