J'ai un déploiement avec un seul pod, avec mon image de menu fixe personnalisée comme:
containers:
- name: mycontainer
image: myimage:latest
Pendant le développement, je veux publier la dernière version et publier le déploiement à jour. Vous ne trouvez pas comment faire cela sans définir explicitement balise/version et l'incrémenter pour chaque construction
kubectl set image deployment/my-deployment mycontainer=myimage:1.9.1
Vous pouvez configurer votre pod avec une période de grâce (par exemple 30 secondes ou plus, en fonction du temps de démarrage du conteneur et de la taille de l'image) et définir "imagePullPolicy: "Always"
. Et utilisez kubectl delete pod pod_name
. Un nouveau conteneur sera créé et la dernière image automatiquement téléchargée, puis l'ancien conteneur sera résilié.
Exemple:
spec:
terminationGracePeriodSeconds: 30
containers:
- name: my_container
image: my_image:latest
imagePullPolicy: "Always"
J'utilise actuellement Jenkins pour les constructions automatisées et le balisage d'images. Cela ressemble à ceci:
kubectl --user="kube-user" --server="https://kubemaster.example.com" --token=$ACCESS_TOKEN set image deployment/my-deployment mycontainer=myimage:"$BUILD_NUMBER-$SHORT_GIT_COMMIT"
Une autre astuce consiste à lancer initialement:
kubectl set image deployment/my-deployment mycontainer=myimage:latest
puis:
kubectl set image deployment/my-deployment mycontainer=myimage
Cela déclenchera effectivement la mise à jour progressive, mais assurez-vous que vous avez également défini imagePullPolicy: "Always"
.
Mise à jour:
une autre astuce que j'ai trouvée, où vous n'avez pas besoin de changer le nom de l'image, est de changer la valeur d'un champ qui déclenchera une mise à jour progressive, comme terminationGracePeriodSeconds
. Vous pouvez le faire en utilisant kubectl edit deployment your_deployment
ou kubectl apply -f your_deployment.yaml
ou en utilisant un patch comme celui-ci:
kubectl patch deployment your_deployment -p \
'{"spec":{"template":{"spec":{"terminationGracePeriodSeconds":31}}}}'
Assurez-vous simplement de toujours changer la valeur numérique.
UPDATE 2019-06-24
Selon le commentaire @Jodiug, si vous avez une version 1.15
, vous pouvez utiliser la commande kubectl rollout restart deployment/demo
.
En savoir plus sur le sujet:
https://github.com/kubernetes/kubernetes/issues/13488
Il existe une discussion intéressante à ce sujet sur le projet kubernetes GitHub. Voir le numéro: https://github.com/kubernetes/kubernetes/issues/33664
Parmi les solutions décrites ici, je suggérerais un des deux.
1.Préparer le déploiement
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: demo
spec:
replicas: 1
template:
metadata:
labels:
app: demo
spec:
containers:
- name: demo
image: registry.example.com/apps/demo:master
imagePullPolicy: Always
env:
- name: FOR_GODS_SAKE_PLEASE_REDEPLOY
value: 'THIS_STRING_IS_REPLACED_DURING_BUILD'
2.Déployer
sed -ie "s/THIS_STRING_IS_REPLACED_DURING_BUILD/$(date)/g" deployment.yml
kubectl apply -f deployment.yml
kubectl patch deployment web -p \
"{\"spec\":{\"template\":{\"metadata\":{\"labels\":{\"date\":\"`date +'%s'`\"}}}}}"
Bien entendu, le imagePullPolicy: Always
est requis dans les deux cas.
Il semble que k8s s’attende à ce que nous fournissions une balise d’image différente pour chaque déploiement. Ma stratégie par défaut serait de faire en sorte que le système de CI génère et pousse les images du menu fixe, en leur attribuant le numéro de construction: xpmatteo/foobar:456
.
Pour le développement local, il peut être pratique d’utiliser un script ou un fichier make, comme ceci:
# create a unique tag
VERSION:=$(Shell date +%Y%m%d%H%M%S)
TAG=xpmatteo/foobar:$(VERSION)
deploy:
npm run-script build
docker build -t $(TAG) .
docker Push $(TAG)
sed s%IMAGE_TAG_PLACEHOLDER%$(TAG)% foobar-deployment.yaml | kubectl apply -f - --record
La commande sed
remplace un espace réservé dans le document de déploiement par la balise d'image générée.
J'utilise Gitlab-CI pour créer l'image, puis la déployer directement sur GCK. Si vous utilisez un petit truc bien astucieux pour réaliser une mise à jour propagée sans modifier aucun paramètre réel du conteneur, vous modifiez ainsi le libellé du commit-short-sha actuel.
Ma commande ressemble à ceci:
kubectl patch deployment my-deployment -p "{\"spec\":{\"template\":{\"metadata\":{\"labels\":{\"build\":\"$CI_COMMIT_SHORT_SHA\"}}}}}}"
Où vous pouvez utiliser n'importe quel nom et n'importe quelle valeur pour l'étiquette tant qu'il change à chaque construction.
S'amuser!