Actuellement, lors de la mise à jour d'un fichier secret kubernetes, pour appliquer les modifications, je dois exécuter kubectl apply -f my-secrets.yaml
. S'il y avait un conteneur en cours d'exécution, il utiliserait toujours les anciens secrets. Afin d'appliquer les nouveaux secrets sur le conteneur en cours d'exécution, j'exécute actuellement la commande kubectl replace -f my-pod.yaml
. Je me demandais si c'était la meilleure façon de mettre à jour un secret de conteneur en cours d'exécution, ou est-ce que je manque quelque chose.
Merci.
Les documents secrets pour les utilisateurs dites ceci:
Les secrets montés sont mis à jour automatiquement Lorsqu'un secret déjà consommé dans un volume est mis à jour, les clés projetées sont finalement mises à jour également. Le temps de mise à jour dépend de la période de synchronisation du kubelet.
Les secrets montés sont mis à jour. La question est de savoir quand. Dans le cas où le contenu d'un secret est mis à jour, cela ne signifie pas que votre application le consomme automatiquement. Il incombe à votre application de surveiller les modifications de fichiers dans ce scénario pour agir en conséquence. Dans cet esprit, vous devez actuellement faire un peu plus de travail. Une façon dont j'ai à l'esprit en ce moment serait d'exécuter un travail planifié dans Kubernetes qui parle à l'API Kubernetes pour lancer un nouveau déploiement de votre déploiement . De cette façon, vous pourriez théoriquement réaliser ce que vous voulez renouveler vos secrets. Ce n'est en quelque sorte pas élégant, mais c'est la seule façon dont je pense à l'heure actuelle. J'ai encore besoin de vérifier moi-même les concepts de Kubernetes. Restez avec moi.
En supposant que nous avons exécuté pod mypod [monté secret comme mysecret dans pod spec]
Nous pouvons supprimer le secret existant
kubectl delete secret mysecret
recréer le même secret avec le fichier mis à jour
kubectl create secret mysecret <updated file/s>
alors fais
kubectl apply -f ./mypod.yaml
vérifiez les secrets à l'intérieur de mypod, il sera mis à jour.
Pour les versions k8s> v1.15: kubectl rollout restart deployment $deploymentname
: cela redémarrera les pods progressivement sans provoquer de temps d'arrêt.
Au cas où quelqu'un (comme moi) voudrait forcer les pods de mise à jour roulants qui utilisent ces secrets. À partir de cela problème , l'astuce consiste à mettre à jour une variable Env à l'intérieur du conteneur, puis k8s lancera automatiquement la mise à jour de pods entiers
kubectl patch deployment mydeployment -p '{"spec":{"template":{"spec":{"containers":[{"name":"mycontainer","env":[{"name":"RESTART_","value":"'$(date +%s)'"}]}]}}}}'
De par sa conception, Kubernetes ne diffusera pas les mises à jour secrètes des pods en cours d'exécution. Si vous souhaitez mettre à jour la valeur secrète d'un pod, vous devez détruire et recréer le pod. Vous pouvez en savoir plus ici .