Mam następujący kontroler replikacji w Kubernetes w GKE:
apiVersion: v1
kind: ReplicationController
metadata:
name: myapp
labels:
app: myapp
spec:
replicas: 2
selector:
app: myapp
deployment: initial
template:
metadata:
labels:
app: myapp
deployment: initial
spec:
containers:
- name: myapp
image: myregistry.com/myapp:5c3dda6b
ports:
- containerPort: 80
imagePullPolicy: Always
imagePullSecrets:
- name: myregistry.com-registry-key
Teraz, jeśli powiem
kubectl rolling-update myapp --image=us.gcr.io/project-107012/myapp:5c3dda6b
przeprowadzana jest aktualizacja krocząca, ale bez ponownego ściągania. Czemu?
image
pull
kubernetes
Torsten Bronger
źródło
źródło
imagePullPolicy
dziedzinie.latest
, nie rób tego. Najnowszy pobierze, no cóż, nowszy obraz z najnowszym tagiem. To, czego chcesz, to seria SemVer. ~ 1.2.3 na przykład. spowoduje to pobranie obrazów z tagami z zakresu od> = 1.2.3 do <1.3.0. Tak długo, jak dostawca obrazu podąża za SemVer, wiesz (i jest to ważna część), nie dodano żadnych wstecznych zmian (celowo) i nie dodano żadnych nowych funkcji (możliwe zagrożenie bezpieczeństwa). Proszę nigdy nie używaćlatest
w systemach produkcyjnych.Odpowiedzi:
Kubernetes pobierze po utworzeniu Poda, jeśli (zobacz dokument aktualizujący obrazy ):
:latest
imagePullPolicy: Always
jest specyficzneTo jest świetne, jeśli chcesz zawsze ciągnąć. Ale co, jeśli chcesz to zrobić na żądanie : na przykład, jeśli chcesz użyć,
some-public-image:latest
ale chcesz ręcznie pobrać nowszą wersję tylko wtedy, gdy o to poprosisz. Obecnie możesz:imagePullPolicy
doIfNotPresent
lubNever
i pre-pull : pull obrazów ręcznie na każdym węźle klastra więc ostatni są buforowane, a następnie zrobićkubectl rolling-update
lub podobny do ponownego uruchomienia Pods (brzydki łamliwe siekać!)imagePullPolicy
, zróbkubectl apply
, zrestartuj kapsułę (np.kubectl rolling-update
), PrzywróćimagePullPolicy
, ponówkubectl apply
(brzydka!)some-public-image:latest
do swojego prywatnego repozytorium i wykonajkubectl rolling-update
(ciężki!)Brak dobrego rozwiązania dla ściągania na żądanie. Jeśli to się zmieni, prosimy o komentarz; Zaktualizuję tę odpowiedź.
źródło
:latest
- a co zpatch
ing? czy zawsze pobiera również najnowszy / najnowszy obraz? Wydaje się, że nie działa dla mnie :(:latest
tag, który wskazywał na nowy obraz ikubectl rolling-update
pracowałem nad aktualizacją strąków.Należy zgrupować
imagePullPolicy
wewnątrz danych kontenera zamiast wewnątrz danych specyfikacji. Jednak zgłosiłem problem w tej sprawie, ponieważ wydaje mi się to dziwne. Poza tym nie ma komunikatu o błędzie.Tak więc ten fragment specyfikacji działa:
źródło
imagePullPolicy
(lub tagowanie:latest
) jest dobre, jeśli chcesz zawsze ciągnąć, ale nie rozwiązuje problemu ciągnięcia na żądanie.imagePullPolicy: Always
wewnątrz definicji kontenera spowodujekubernetes
pobranie obrazów z tagiem za:latest
każdym razem, gdy ich nowsza wersja zostanie przesłana do rejestru?imagePullPolicy: Always
po prostu mówi Kubernetesowi, aby zawsze pobierał obraz z rejestru. Jaki obraz będzie konfigurowany przezimage
atrybut. Jeśli skonfigurujesz go takimage: your-image:latest
, zawsze będzie ściągałyour-image
obraz zlatest
tagiem.Mój hack podczas programowania polega na zmianie manifestu wdrożenia, dodaniu najnowszego tagu i zawsze w ten sposób
Następnie ręcznie usuwam kapsułę
Ponieważ jest to Wdrożenie, Kubernetes automatycznie odtworzy kapsułę i pobierze najnowszy obraz.
źródło
Popularne obejście jest plaster rozmieszczenie z adnotacją manekina (lub etykiet):
Zakładając, że wdrożenie spełnia te wymagania , spowoduje to, że K8 pobierze nowy obraz i ponownie wdroży.
źródło
ImagePullPolicy
jako Zawsze . adnotacje takie jakdeployment.kubernetes.io/revision: "v-someversion"
ikubernetes.io/change-cause: the reason
mogą być bardzo pomocne i zmierzają w kierunku niezmiennych wdrożeń.Pojawi się nowe polecenie, które bezpośrednio to zrobi:
Utwórz nowe
kubectl rollout restart
polecenie, które wykonuje stopniowy restart wdrożenia.Wyciągnąć wniosek Got scalone. Będzie częścią wersji
1.15
( dziennik zmian )źródło
Najwyraźniej teraz, gdy uruchamiasz aktualizację kroczącą z
--image
argumentem takim samym jak istniejący obraz kontenera, musisz również określić plik--image-pull-policy
. Poniższe polecenie powinno wymusić wyciągnięcie obrazu, gdy jest taki sam jak obraz kontenera:kubectl rolling-update myapp --image=us.gcr.io/project-107012/myapp:5c3dda6b --image-pull-policy Always
źródło
źródło
Teraz polecenie
kubectl rollout restart deploy YOUR-DEPLOYMENT
połączone zimagePullPolicy: Always
polityką pozwoli ci ponownie uruchomić wszystkie pody z najnowszą wersją obrazu.źródło
Polecenie rolling update, gdy podano argument image, zakłada, że obraz jest inny niż ten, który obecnie istnieje w kontrolerze replikacji.
źródło
--image
flagę.Możesz zdefiniować
imagePullPolicy: Always
w pliku wdrożenia.źródło
Zasada ściągania obrazu zawsze faktycznie pomaga w ściągnięciu obrazu za każdym razem, gdy tworzony jest nowy pod (w każdym przypadku może to być skalowanie replik lub umieranie zasobnika i tworzenie nowego zasobnika)
Ale jeśli chcesz zaktualizować obraz aktualnie działającego poda, najlepszym sposobem jest wdrożenie. Pozostawia bezbłędną aktualizację bez żadnego problemu (głównie gdy masz stały wolumin dołączony do kapsuły) :)
źródło