Redémarrez les pods lors de la mise à jour de la configuration dans Kubernetes?

Je sais que l’on a parlé de la possibilité de redémarrer automatiquement les modules lorsqu’une carte de configuration change, mais à ma connaissance, ce n’est pas encore disponible dans Kubernetes 1.2.

Donc, ce que je voudrais faire, c’est un “redémarrage progressif” de la ressource de déploiement associée aux modules consommant la carte de configuration. Est-il possible, et si tel est le cas, de forcer le redémarrage d’un déploiement dans Kubernetes sans rien changer au modèle actuel? Est-ce actuellement la meilleure façon de le faire ou existe-t-il une meilleure option?

Signaler un pod sur la mise à jour de la carte de configuration est une fonctionnalité en cours de réalisation ( https://github.com/kubernetes/kubernetes/issues/22368 ).

Vous pouvez toujours écrire un pid1 personnalisé qui remarque que le confimap a changé et redémarre votre application.

Vous pouvez également par exemple: monter la même carte de configuration dans 2 conteneurs, exposer une vérification de santé http dans le deuxième conteneur qui échoue si le hachage du contenu de la carte de configuration change pod partager le même espace de nom de réseau). Le kubelet redémarre votre premier conteneur lorsque la sonde échoue.

Bien sûr, si vous ne vous souciez pas des nœuds sur lesquels les modules sont activés, vous pouvez simplement les supprimer et le contrôleur de réplication les “redémarrera” pour vous.

La meilleure solution actuelle à ce problème (référencée en profondeur dans https://github.com/kubernetes/kubernetes/issues/22368 lié dans la réponse fraternelle) consiste à utiliser les déploiements et à considérer que vos ConfigMaps sont immuables.

Lorsque vous souhaitez modifier votre configuration, créez un nouveau ConfigMap avec les modifications que vous souhaitez apporter et indiquez votre déploiement sur le nouveau ConfigMap. Si la nouvelle configuration est interrompue, le déploiement refuse de réduire votre ReplicaSet en cours de fonctionnement. Si la nouvelle configuration fonctionne, votre ancien ReplicaSet sera mis à l’échelle à 0 réplicas et supprimé, et de nouveaux pods seront démarrés avec la nouvelle configuration.

Pas tout à fait aussi rapide que de simplement modifier le fichier ConfigMap en place, mais beaucoup plus sûr.

https://github.com/kubernetes/helm/blob/master/docs/charts_tips_and_sortingcks.md#user-content-automatically-roll-deployments-when-configmaps-or-srrets-change

Souvent, les configmaps ou les secrets sont injectés en tant que fichiers de configuration dans des conteneurs. Selon l’application, un redémarrage peut être requirejs si ceux-ci sont mis à jour avec une helm upgrade ultérieure de la helm upgrade , mais si la spécification de déploiement elle-même n’a pas changé, l’application continue à fonctionner avec l’ancienne configuration.

La fonction sha256sum peut être utilisée avec la fonction include pour garantir la mise à jour d’une section de modèle de déploiement si une autre spécification change:

 kind: Deployment spec: template: metadata: annotations: checksum/config: {{ include (print $.Template.BasePath "/secret.yaml") . | sha256sum }} [...] 

Dans mon cas, pour certaines raisons, $.Template.BasePath ne fonctionnait pas mais $.Chart.Name fait:

 spec: replicas: 1 template: metadata: labels: app: admin-app annotations: checksum/config: {{ include (print $.Chart.Name "/templates/" $.Chart.Name "-configmap.yaml") . | sha256sum }} 

Vous pouvez mettre à jour une étiquette de métadonnées non pertinente pour votre déploiement. cela déclenchera une mise à jour continue

par exemple:

 metadata: labels: configmap-version: 1 

Un autre moyen consiste à le coller dans la section de commande du déploiement:

 ... command: [ "echo", " option = value\n other_option = value\n " ] ... 

Sinon, pour le rendre plus semblable à ConfigMap, utilisez un déploiement supplémentaire qui hébergera simplement cette configuration dans la section de command et exécutera kubectl create tout en ajoutant une version unique à son nom (comme le calcul d’un hachage du contenu) et modifier tous les déploiements qui utilisent cette configuration:

 ... command: [ "/usr/sbin/kubectl-apply-config.sh", " option = value\n other_option = value\n " ] ... 

Je vais probablement poster kubectl-apply-config.sh si cela fonctionne.

(ne fais pas ça; ça a l’air dommage)