Mettre à jour etcd de 3.2 vers 3.3
Dans le cas général, la mise à niveau d’etcd 3.2 vers 3.3 peut être effectuée sans interruption de service, par mise à niveau progressive :
- un par un, arrêtez les processus etcd v3.2 et remplacez-les par des processus etcd v3.3
- après avoir lancé tous les processus v3.3, les nouvelles fonctionnalités de la version v3.3 sont disponibles pour le cluster
Avant de lancer la mise à jour , lisez le reste du présent guide afin de vous préparer.
Listes de vérification pour la mise à jour
Lorsque on migre depuis la version v2 sans données v3
, le serveur etcd v3.2+ provoque une panne lorsqu’il restaure à partir d’un instantané existant mais qu’aucun fichier v3 ETCD_DATA_DIR/member/snap/db n’est présent. Cela se produit lorsque le serveur a été migré depuis la version v2 sans données v3 précédentes. Cela empêche également la perte accidentelle de données v3 (par exemple, le fichier db pourrait avoir été déplacé). etcd exige que les opérations après migration vers v3 ne soient effectuées que si des données v3 sont présentes. N’effectuez pas la mise à jour vers des versions v3 plus récentes tant que le serveur v3.0 ne contient pas de données v3.
si vous activez l’authentification et utilisez des baux (avec une durée de vie courte), il y a de fortes chances de rencontrer un problème
entraînant une incohérence des données. Il est fortement recommandé de mettre à jour vers 3.2.31 ou ultérieur avant toute mise à jour vers 3.3, afin de corriger ce problème. En outre, si un utilisateur sans autorisation envoie une requête LeaseRevoke à un nœud 3.3 pendant la mise à jour, cela peut encore provoquer une corruption des données. Le mieux est donc de s’assurer que votre environnement ne contient pas d’appels anormaux avant la mise à jour ; consultez #11691
pour plus de détails.
Changements de rupture mis en évidence dans 3.3.
Changement du type de valeur du drapeau etcd --auto-compaction-retention en string
Le drapeau --auto-compaction-retention a été modifié pour accepter des valeurs de type chaîne
avec une granularité plus fine
. À présent que --auto-compaction-retention accepte des valeurs de type chaîne, le champ du fichier YAML de configuration etcd auto-compaction-retention doit être de type string. Auparavant, --config-file etcd.config.yaml pouvait inclure le champ auto-compaction-retention: 24, désormais il doit être auto-compaction-retention: "24" ou auto-compaction-retention: "24h". Si configuré comme --auto-compaction-mode periodic --auto-compaction-retention "24h", la valeur de durée pour le drapeau --auto-compaction-retention doit être valide pour la fonction time.ParseDuration
en Go.
Modifier *etcdserver.ServerConfig en etcdserver.ServerConfig
etcdserver.EtcdServer a modifié le type de son champ membre *etcdserver.ServerConfig en etcdserver.ServerConfig. Et etcdserver.NewServer prend désormais etcdserver.ServerConfig, plutôt que *etcdserver.ServerConfig.
Avant et après (par exemple k8s.io/kubernetes/test/e2e_node/services/etcd.go )
Ajout du champ embed.Config.LogOutput
Notez que ce champ a été renommé en embed.Config.LogOutputs et est de type []string à partir de la version 3.4. Consultez le guide de mise à jour vers la version 3.4
pour plus de détails.
Le champ LogOutput est ajouté à embed.Config :
Auparavant, les avertissements du serveur gRPC étaient journalisés dans etcdserver.
À compter de la version 3.3, les journaux du serveur gRPC sont désactivés par défaut.
Notez que la méthode embed.Config.SetupLogging a été dépréciée à partir de la version v3.4. Consultez le guide de mise à jour vers la version v3.4
pour plus de détails.
Définissez le champ embed.Config.Debug sur true pour activer les journaux du serveur gRPC.
Modifier la réponse de l’endpoint /health
Précédemment, [endpoint]:[client-port]/health renvoyait une valeur JSON marshalisée manuellement. La version 3.3 définit désormais la structure etcdhttp.Health
.
Notez que dans les versions v3.3.0-rc.0, v3.3.0-rc.1 et v3.3.0-rc.2, etcdhttp.Health possède des champs "health" et "errors" de type booléen. Afin de garantir la compatibilité descendante, nous avons rétabli le champ "health" vers le type string et supprimé le champ "errors". Les informations de santé supplémentaires seront fournies via des API séparées.
Modifier les points d’entrée HTTP de la passerelle gRPC (remplacé /v3alpha par /v3beta)
Avant
Après
Les requêtes vers les points de terminaison /v3alpha seront redirigées vers /v3beta, et /v3alpha sera supprimé dans la version 3.4.
Modifier les limites de taille maximale des requêtes
3.3 permet désormais des limites de taille de requête personnalisées pour le serveur et le côté client. Dans les versions précédentes (v3.2.10, v3.2.11), la taille de réponse du client était limitée à 4 MiB.
Les limites de requêtes côté serveur peuvent être configurées à l’aide du drapeau --max-request-bytes :
Ou configurez le champ embed.Config.MaxRequestBytes :
Si non spécifié, la limite côté serveur est par défaut de 1,5 MiB.
Les limites de requêtes côté client doivent être configurées en fonction des limites côté serveur.
Si non spécifié, la limite d’envoi côté client est par défaut fixée à 2 MiB (1,5 MiB + surcharge gRPC) et la limite de réception à math.MaxInt32. Voir clientv3 godoc
pour plus de détails.
Modifier les signatures des fonctions d’enveloppe du client gRPC brut
3.3 modifie les signatures de fonction du wrapper client gRPC clientv3. Ce changement était nécessaire pour prendre en charge les options personnalisées grpc.CallOption sur les limites de taille de message
.
Avant et après
Changer le type d’erreur de l’API clientv3 Snapshot
Précédemment, l’API clientv3 Snapshot renvoyait des erreurs de type [grpc/*status.statusError] brutes. La version 3.3 les traduit désormais en types d’erreurs publiques correspondants, afin de maintenir une cohérence avec les autres API.
Avant
Après
Changer la sortie de la commande etcdctl lease timetolive
Précédemment, la commande lease timetolive LEASE_ID sur un bail expiré affichait -1s pour le nombre de secondes restantes. La version 3.3 affiche désormais des messages plus clairs.
Avant
Après
Modifier les imports golang.org/x/net/context
clientv3 a déprécié golang.org/x/net/context. Si un projet inclut golang.org/x/net/context dans son répertoire vendor pour d’autres parties du code (par exemple, du code généré par etcd pour les protocoles buffer) et importe github.com/coreos/etcd/clientv3, une version de Go 1.9 ou ultérieure est requise pour la compilation.
Avant
Après
Modifier la dépendance gRPC
3.3 exige désormais grpc/grpc-go
v1.7.5.
Dépréciation de grpclog.Logger
grpclog.Logger a été déprécié en faveur de grpclog.LoggerV2
. clientv3.Logger est désormais grpclog.LoggerV2.
Avant
Après
Dépréciation de grpc.ErrClientConnTimeout
Précédemment, l’erreur grpc.ErrClientConnTimeout était renvoyée en cas de délai d’attente lors de la connexion client. La version 3.3 renvoie désormais context.DeadlineExceeded (voir #8504
).
Avant
Après
Changement du registre conteneur officiel
etcd utilise désormais gcr.io/etcd-development/etcd
comme registre conteneur principal, et quay.io/coreos/etcd
comme secondaire.
Avant
Après
Mises à jour vers v3.3.14 ou une version ultérieure
v3.3.14 a dû intégrer certaines fonctionnalités de la version 3.4, tout en cherchant à minimiser les différences entre les implémentations du répartiteur de charge client. Cette version corrige “kube-apiserver 1.13.x refuse de fonctionner lorsque le premier serveur etcd n’est pas disponible” (kubernetes#72102) .
grpc.ErrClientConnClosing a été déprécié dans gRPC >= 1.10
.
Le nouveau répartiteur de charge client
utilise un résolveur asynchrone pour transmettre les points de terminaison à la fonction de connexion gRPC. En conséquence, v3.3.14
ou une version ultérieure nécessite l’option grpc.WithBlock pour attendre que la connexion sous-jacente soit active.
Veuillez consulter CHANGELOG pour obtenir la liste complète des modifications.
Liste de vérification pour la mise à jour du serveur
Exigences de mise à jour
Pour mettre à jour un déploiement etcd existant vers la version 3.3, le cluster en cours d’exécution doit être la version 3.2 ou ultérieure. Si la version est antérieure à 3.2, veuillez mettre à jour vers la version 3.2 avant de procéder à la mise à jour vers la version 3.3.
En outre, pour garantir une mise à niveau progressive sans incident, le cluster en cours d’exécution doit être sain. Vérifiez l’état de santé du cluster à l’aide de la commande etcdctl endpoint health avant de poursuivre.
Préparation
Avant de mettre à jour etcd, testez toujours les services dépendants d’etcd dans un environnement de préproduction avant de déployer la mise à jour dans l’environnement de production.
Avant de commencer, sauvegardez les données etcd
. Si une erreur survient lors de la mise à jour, il sera possible d’utiliser cette sauvegarde pour rétrograder
vers la version existante d’etcd. Veuillez noter que la commande snapshot ne sauvegarde que les données v3. Pour les données v2, consultez sauvegarde du magasin de données v2
.
Versions mixtes
Lors d’une mise à jour, un cluster etcd prend en charge des versions mixtes de membres et fonctionne selon le protocole de la version commune la plus basse. Le cluster est considéré comme mis à jour uniquement lorsque tous ses membres ont été mis à jour vers la version 3.3. En interne, les membres etcd négocient entre eux afin de déterminer la version globale du cluster, qui contrôle la version signalée et les fonctionnalités prises en charge.
Limitations
Note : Si le cluster ne contient que des données v3 et aucune donnée v2, il n’est pas soumis à cette limitation.
Si le cluster sert un jeu de données v2 dont la taille dépasse 50 Mo, chaque membre nouvellement mis à jour peut prendre jusqu’à deux minutes pour rattraper le cluster existant. Vérifiez la taille d’un instantané récent afin d’estimer la taille totale des données. Autrement dit, le plus sûr est d’attendre deux minutes entre chaque mise à jour de membre.
Pour une taille totale de données bien plus importante, de 100 Mo ou plus, ce processus unique peut prendre encore plus de temps. Les administrateurs de clusters etcd très volumineux de cette ampleur peuvent librement contacter l’équipe etcd avant la mise à jour, et nous serons heureux de leur fournir des conseils sur la procédure.
Rétrogradation
Si tous les membres ont été mis à jour vers la version v3.3, le cluster sera mis à jour vers la v3.3, et un retour en arrière depuis cet état finalisé est impossible. Si toutefois un seul membre reste en version v3.2, le cluster et ses opérations restent “v3.2”, et il est possible, depuis cet état de cluster mixte, de revenir à l’utilisation d’un binaire etcd v3.2 sur tous les membres.
Veuillez sauvegarder le répertoire de données de tous les membres etcd afin de permettre la rétrogradation du cluster, même après sa mise à jour complète.
Procédure de mise à jour
Cet exemple montre comment mettre à jour un cluster etcd v3.2 composé de 3 membres, en cours d’exécution sur une machine locale.
1. Vérifier les prérequis de mise à jour
Le cluster est-il sain et en cours d’exécution sous la version 3.2.x ?
2. Arrêtez le processus etcd existant
Lorsque chaque processus etcd est arrêté, les autres membres du cluster enregistrent des erreurs attendues. Cela est normal, car la connexion avec un membre du cluster a été (temporairement) interrompue :
Il est recommandé de procéder à une sauvegarde des données etcd à cette étape afin de disposer d’un chemin de retour en cas de problème :
3. Remplacer le binaire par etcd v3.3 et démarrer le nouveau processus etcd
Le nouvel etcd v3.3 publiera ses informations dans le cluster :
Vérifiez que chaque membre, puis l’ensemble du cluster, devient sain avec le nouveau binaire etcd v3.3 :
Les membres mis à jour émettront des avertissements similaires au suivant jusqu’à ce que l’intégralité du cluster soit mise à jour. C’est normal et cessera une fois que tous les membres du cluster etcd auront été mis à jour vers la version 3.3 :
4. Répétez l’étape 2 à l’étape 3 pour tous les autres membres
5. Terminer
Lorsque tous les membres sont mis à jour, le cluster signalera avec succès la mise à jour vers la version 3.3 :