Możesz skonfigurować swój pod z okresem karencji (na przykład 30 sekund lub więcej, w zależności od czasu uruchamiania kontenera i rozmiaru obrazu) i ustawić "imagePullPolicy: "Always"
. I użyj kubectl delete pod pod_name
. Zostanie utworzony nowy kontener, a najnowszy obraz zostanie automatycznie pobrany, a stary kontener zostanie zamknięty.
Przykład:
spec:
terminationGracePeriodSeconds: 30
containers:
- name: my_container
image: my_image:latest
imagePullPolicy: "Always"
Obecnie używam Jenkinsa do automatycznych kompilacji i tagowania obrazów i wygląda to mniej więcej tak:
kubectl --user="kube-user" --server="https://kubemaster.example.com" --token=$ACCESS_TOKEN set image deployment/my-deployment mycontainer=myimage:"$BUILD_NUMBER-$SHORT_GIT_COMMIT"
Inną sztuczką jest uruchomienie:
kubectl set image deployment/my-deployment mycontainer=myimage:latest
i wtedy:
kubectl set image deployment/my-deployment mycontainer=myimage
W rzeczywistości będzie wyzwalać aktualizację kroczącą, ale upewnij się, że również imagePullPolicy: "Always"
ustawiłeś.
Aktualizacja:
Kolejną sztuczką, którą znalazłem, w której nie musisz zmieniać nazwy obrazu, jest zmiana wartości pola, które wyzwoli aktualizację kroczącą, na przykład terminationGracePeriodSeconds
. Możesz to zrobić za pomocą kubectl edit deployment your_deployment
lub kubectl apply -f your_deployment.yaml
lub używając takiej łatki:
kubectl patch deployment your_deployment -p \
'{"spec":{"template":{"spec":{"terminationGracePeriodSeconds":31}}}}'
Upewnij się tylko, że zawsze zmieniasz wartość liczbową.
kubectl set image
polecenie, kubernetes wykona aktualizację kroczącą. Na przykład, powiedzmy, że wdrożyłeś „repo / myimage: latest”. W międzyczasie obraz został zmieniony i przesłany do repozytorium z tagiem „v0.2”. Możesz przeprowadzić aktualizację, uruchamiając.kubectl set image deployment/my-deployment mycontainer=myimage:v0.2
Ten obraz będzie miał również tag „najnowszy”.AKTUALIZACJA 24.06.2019
Na podstawie komentarza @Jodiug, jeśli masz
1.15
wersję, możesz użyć polecenia:Przeczytaj więcej na ten temat:
https://github.com/kubernetes/kubernetes/issues/13488
Cóż, jest ciekawa dyskusja na ten temat w projekcie kubernetes GitHub. Zobacz problem: https://github.com/kubernetes/kubernetes/issues/33664
Z opisanych tam rozwiązań sugerowałbym jedno z dwóch.
Pierwszy
1. Przygotuj wdrożenie
2. wdrożyć
Drugi (jedna wkładka):
Oczywiście
imagePullPolicy: Always
jest to wymagane w obu przypadkach.źródło
Jest to obecny sposób wyzwalania aktualizacji kroczącej i pozostawienia starych zestawów replik na miejscu dla innych operacji zapewnianych przez
kubectl rollout
podobne wycofywanie zmian.źródło
undo
polecenia ani odpowiednika.Używam Gitlab-CI do budowania obrazu, a następnie wdrażam go bezpośrednio do GCK. Jeśli użyjesz zgrabnej małej sztuczki, aby uzyskać aktualizację kroczącą bez zmiany jakichkolwiek rzeczywistych ustawień kontenera, czyli zmianę etykiety na bieżącą zatwierdzoną-krótką-sha.
Moje polecenie wygląda tak:
Gdzie możesz użyć dowolnej nazwy i dowolnej wartości dla etykiety, o ile zmienia się ona przy każdej kompilacji.
Baw się dobrze!
źródło
Wygląda na to, że k8s oczekuje od nas dostarczenia innego tagu obrazu dla każdego wdrożenia. Domyślną strategią byłoby, aby system CI generować i przesunąć obrazy Döcker, znakowanie je z numerem kompilacji:
xpmatteo/foobar:456
.W przypadku lokalnego rozwoju może być wygodne użycie skryptu lub pliku makefile, takiego jak ten:
sed
Komenda zastępuje zastępczy w dokumencie rozmieszczania z rzeczywistego obrazu generowanego tagu.źródło
Używam Azure DevOps do wdrażania aplikacji w kontenerach, łatwo mogę rozwiązać ten problem, używając identyfikatora kompilacji
Za każdym razem, gdy kompiluje i generuje nowy identyfikator kompilacji, używam tego identyfikatora kompilacji jako tagu dla obrazu dockera, na przykład
nazwa zdjęcia: buildID
po pomyślnym zbudowaniu obrazu (CI) w potoku CD w pliku yml wdrożenia mam nadać nazwę obrazu jako
nazwa zdjęcia: env: buildID
tutaj evn: buildid jest zmienną Azure Devops, która ma wartość identyfikatora kompilacji.
więc teraz za każdym razem, gdy mam nowe zmiany do kompilacji (CI) i wdrożenia (CD).
prosimy o komentarz, jeśli potrzebujesz definicji kompilacji dla CI / CD.
źródło