Maintenir son infrastructure et ses applications à jours est devenu une nécessité ( et aurait dû toujours l'être..Avant même la mode de la cybersécurité...).
Mais il n’est pas toujours simple de suivre le rythme. Obnubilé par le besoin de nouveautés et la course aux fonctionnalités (pas toujours utiles), les releases se suivent, entremêlées parfois de bugs et de failles de sécurités.
Kubernetes n’échappe pas à la règle avec environ trois versions principales par an et des sorties tous les quatre mois.
Avant de se lancer sur l’opération d’upgrade en tant que telle, il est important d’avoir une bonne connaissance du cycle de vie de Kubernetes et de mettre en place sa stratégie de mise à jour.
La numérotation de K8S démarre par le numéro de la version principale. (Jusqu’à présent la 1).
Puis vient le numéro de release, par exemple 1.30, soit la trentième itération de la version 1.
À chaque changement de release correspondent des modifications fonctionnelles importantes. Certains objets peuvent passer à un état de stabilité différent dans l’API.
De nouveaux objets peuvent être introduits...et d’autres être retirés. De même les exigences de compatibilités avec d’autres composants peuvent être revues.
Il faut toujours être attentifs aux releases notes et se maintenir un minimum informé des évolutions de Kubernetes.
Chaque objet K8S respecte toujours un cycle en trois phases:
Un dernier état, non déclaré dans l’API, mais intéressant de connaitre est l’état Deprecated….Généralement un objet apparaissant ainsi dans une release note signifie qu’il finira par être retiré dans une version future…Mais qu’il est temps dès à présent d’apprendre à s’en passer si celui-ci est utilisé dans sa plateforme.
Il n’y a pas de règles quand au passage d’un objet d’une phase à une autre.
Ce n’est pas parce qu’une nouvelle release apparait que tous les objets de la branche Alpha passe en Beta.
Cela dépend du niveau d’avancement du développement propre à chaque objet, certains pouvant rester en alpha ou en beta durant de nombreuses versions.
Le support de chaque release est limité à 14 mois. Les 12 premiers mois sont considérés comme "actif" et peuvent acceuillir des améliorations et des évolutions fonctionnelles. Les deux derniers mois sont uniquement pris en compte pour des corrections de bugs et/ou des failles de sécurité. La plateforme évolue donc rapidement et on peut vite sortir du cadre.
Une troisième numérotation peut apparaitre par exemple,1.30.5. Ce dernier numéro est associé à un ensemble de patchs incluant le plus souvent des corrections de bugs ou de sécurité. Passé 14 mois après la sortie d'une release, il n’est plus possible de voir ce dernier numéro évoluer pour cette derniere.
Cliquez sur l'image pour l'agrandir.
Le schéma ci-dessus est donné à titre d'illustration, les versions ont été choisies arbitrairement et l'exemple part du premier mois de l'année uniquement pour simplifier l'explication.
Tout l’historique de version de Kubernetes est consultable ici.
L’approche de développement de K8S est particulière, elle fait appel à une rotation des équipes par release.
Pour chaque version, une nouvelle équipe est formée. Cette dernière est responsable de superviser tout le cycle de développement et de planification jusqu’à la publication de l’application (incluant les patchs).
Lorsqu’on passe à une nouvelle version par exemple de la 1.30.9 à la 1.31 , c’est une nouvelle équipe qui prend le relais. L’objectif est de distribuer les responsabilités et d’éviter la centralisation des connaissances au sein d’un petit groupe d’individu.
Cliquez sur l'image pour l'agrandir.
Par contre cela a pour conséquence des changements parfois importants entre les releases et maintenir à jour Kubernetes a longtemps été considéré comme pénible et complexe.
C’est notamment le cas dans l’usage d’une installation Vanilla comme j’ai pu le décrire dans mon cookbook sur le sujet.
Une installation Vanilla est une installation de Kubernetes directement réalisée à partir des composants de bases.
Contrairement à l’usage de distribution Kubernetes, comme OpenShift, avec une plateforme Vanilla, c’est à vous de gérer chaque dépendance entre les composants que vous avez déployé. Il n’y a pas de mises à jour intégrées ou prépackagées.
N’hésitez pas à faire un tour dans cette partie du site pour plus d’informations sur le sujet.
Néanmoins, on va voir à travers cette série d’articles qu’il est tout à fait possible de mettre à jour son cluster Kubernetes Vanilla. Il suffit de respecter certaines bonnes pratiques et d’être méthodique dans son approche.
Voici quelques recommandations issues de mon expérience:
Ce qu’il est important de retenir, c’est qu’il est préférable d’upgrader souvent que de laisser sa version prendre le large. Vous limitez ainsi les risques d’écart fonctionnel trop important et vous vous rassurez sur la procédure en augmentant votre maitrise. Rien ne vous empêche d’industrialiser une partie des actions et d’automatiser au fil de l’eau.
En termes de procédure, voici une proposition. Elle est bien sûr à détailler de votre côté et à adapter en fonction de votre configuration.
NB : concernant le CPI et le CSI vSphere, j’ai également une dépendance à mon infrastructure vMware. Par exemple, je dois m’assurer que la version de mes ESXi et de mon vCenter soient compatibles. C’est un élément à considérer également même si vous n’utilisez pas vSphere de votre côté. Si vous exploitez un driver CSI propre à un fournisseur de baie, comme Netapp par exemple, a vous de vous assurez de la compatibilité du triptyque version de Kubernetes/Driver CSI/Firmware de votre baie.
Arrivé à cette étape, j’ai normalement ma feuille de route concernant les mises à jour de tous les composants tiers que j’aurais à réaliser avant mon upgrade de Kubernetes ou juste après.
Voici une roadmap simplifiée des opérations à réaliser. Celle-ci reprend les points évoqués précédemment et s’appuie sur une logique d’usage d’un cluster Kubernetes déployé avec kubeadm, comme j’ai pu le décrire dans mon cookbook.
Je traite ainsi tous mes control plane, un par un pour ensuite poursuivre sur les worker. De la même manière je procède worker par worker avec toujours:
En fin d’opération, je devrais avoir tous mes nodes à la version cible.
Je peux poursuivre par la mise à jour des applications additionnelles:
(la liste est susceptible d’évoluer avec le temps).
Cliquez sur l'image pour l'agrandir.
Cet article détaillant la logique et les préparatifs à établir dans le cas d’un upgrade K8S est fortement lié à mon cookbook sur l’installation d’un cluster Kubernetes vanilla avec kubeadm.
Il est fort possible que vos clusters diffèrent du mien, et que les composants varient entre mon exemple et votre infrastructure. Cet article est donc à adapter à vos besoins, mais la logique globale peut s’appliquer à d’autres configurations. Cela reste vrai uniquement dans un usage de cluster type vanilla. Si vous utilisez un cluster managé chez un cloud provider ou une distribution K8S type OpenShift, il faut vous rapprocher de votre fournisseur/éditeur pour suivre leur guideline.
On peut procéder aux actions en live, mais je vous conseille fortement de réserver des plages d’interventions fonctions des possibilités de votre production. Les temps d’indisponibilité dépendent du déploiement de vos applications et de vos architectures applicatives. Si vous êtes dans des environnements type micro services avec une forte redondance de vos pods, alors les opérations devraient se faire en toute transparence. À l’inverse si vous avez des conteneurs unitaires, ils seront amenés à redémarrer et donc à provoquer des coupures. Dans tous les cas, il est toujours intéressant de se laisser une marge de manœuvre dans vos opérations au cas ou un incident se produirait.
Mon but est ici de mettre en avant la nécessité d’être rigoureux pour upgrader son cluster. Il est important de bien comprendre l’ordre des actions et de préparer son intervention. La plus grosse difficulté est de s’assurer de la matrice de compatibilité entre les différents composants. S’il faut obtenir une concordance avec la version cible, il faut aussi maintenir un fonctionnement avec la version actuelle.
Si vous upgradez un élément en prérequis de votre montée de version de k8S, mais que vous cassez le fonctionnement en place, ce n’est pas l’idéal. Encore une fois, si vous gardez un rythme de mise à jour régulier, ce type de problème ne devrait pas arriver.
Il ne faut pas avoir peur de se lancer dans un usage d’un cluster vanilla. Au fur à mesure des versions, les opérations se simplifient et il suffit souvent d’une bonne préparation pour que l’opération se fasse sans soucis. C’est le revers de la médaille de l’aspect modulaire de Kubernetes.
Il y’a les briques de bases et tous le restes…et quand on upgrade le cœur de la plateforme, il faut s’assurer que toute la suite continue de fonctionner. D’ailleurs après la théorie, on va pouvoir passer à la pratique, mais cela se fait dans cet article.