Ich habe den folgenden Replikationscontroller in Kubernetes auf 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
Nun, wenn ich sage
kubectl rolling-update myapp --image=us.gcr.io/project-107012/myapp:5c3dda6b
Das fortlaufende Update wird durchgeführt, aber kein erneutes Ziehen. Warum?
image
pull
kubernetes
Torsten Bronger
quelle
quelle
imagePullPolicy
Feld.latest
tun Sie es nicht. Neueste wird das, nun, neuere Bild mit dem neuesten Tag ziehen. Was Sie wollen, ist eine SemVer-Reihe. ~ 1.2.3 zum Beispiel. Dadurch werden Bilder mit Tags zwischen> = 1.2.3 und <1.3.0 abgerufen. Solange der Image-Anbieter SemVer nach Ihrem Wissen folgt (und dies ist der wichtige Teil), wurden (absichtlich) keine rückwärtsbrechenden Änderungen hinzugefügt und keine neuen Funktionen hinzugefügt (mögliche Sicherheitsbedenken). Bitte, bitte niemalslatest
in Produktionssystemen verwenden.Antworten:
Kubernetes zieht bei der Pod-Erstellung Folgendes ein (siehe Dokument zum Aktualisieren von Bildern ):
:latest
imagePullPolicy: Always
angegebenDas ist toll, wenn du immer ziehen willst. Was aber, wenn Sie es bei Bedarf tun möchten : Zum Beispiel, wenn Sie
some-public-image:latest
eine neuere Version verwenden möchten, aber nur manuell abrufen möchten, wenn Sie danach fragen. Sie können derzeit:imagePullPolicy
zuIfNotPresent
oderNever
und Pre-pull : Ziehen Sie Bilder manuell auf jedem Cluster - Knoten , so dass die letzte zwischengespeichert wird, dann tut einemkubectl rolling-update
oder ähnlichen Pods (hässlich leicht gebrochen Hack!) Neu zu startenimagePullPolicy
, akubectl apply
ausführen, Pod neu starten (z. B.kubectl rolling-update
), zurücksetzenimagePullPolicy
, a wiederholenkubectl apply
(hässlich!)some-public-image:latest
zu Ihrem privaten Repository und machen Sie einekubectl rolling-update
(schwere!)Keine gute Lösung für On-Demand-Pull. Wenn sich dies ändert, kommentieren Sie bitte; Ich werde diese Antwort aktualisieren.
quelle
:latest
- was ist mitpatch
ing? zieht es auch immer das neueste / neueste Bild? Scheint nicht für mich zu arbeiten :(:latest
Tag, das auf ein neues Bild zeigte, und daskubectl rolling-update
arbeitete daran, die Pods zu aktualisieren.Man muss
imagePullPolicy
innerhalb der Containerdaten gruppieren, anstatt innerhalb der Spezifikationsdaten. Ich habe jedoch ein Problem dazu eingereicht, weil ich es seltsam finde. Außerdem gibt es keine Fehlermeldung.Dieses Spezifikations-Snippet funktioniert also:
quelle
imagePullPolicy
(oder Markieren:latest
) ist gut, wenn Sie immer ziehen möchten, aber die Frage des Ziehens auf Nachfrage nicht lösen.imagePullPolicy: Always
innerhalb der Containerdefinition werdenkubernetes
Abrufbilder markiert, mit denen markiert wird,:latest
wenn eine neuere Version davon in die Registrierung verschoben wird.imagePullPolicy: Always
Kubernetes wird lediglich angewiesen, immer ein Bild aus der Registrierung abzurufen . Welches Bild es wird, wird durchimage
Attribut konfiguriert . Wenn Sie es so konfigurierenimage: your-image:latest
, wird dasyour-image
Bild immer mit demlatest
Tag abgerufen.Mein Hack während der Entwicklung besteht darin, mein Bereitstellungsmanifest so zu ändern, dass das neueste Tag hinzugefügt wird, und immer so zu ziehen
Dann lösche ich den Pod manuell
Da es sich um eine Bereitstellung handelt, erstellt Kubernetes den Pod automatisch neu und ruft das neueste Image ab.
quelle
Eine beliebte Problemumgehung besteht darin, die Bereitstellung mit einer Dummy-Anmerkung (oder Beschriftung) zu patchen:
Angenommen, Ihre Bereitstellung erfüllt diese Anforderungen , führt dies dazu, dass K8s ein neues Image abrufen und erneut bereitstellen.
quelle
ImagePullPolicy
als Immer . Anmerkungen wiedeployment.kubernetes.io/revision: "v-someversion"
undkubernetes.io/change-cause: the reason
können sehr hilfreich sein und führen zu unveränderlichen Bereitstellungen.Es wird einen neuen Befehl geben, dies direkt zu tun:
Erstellen Sie einen neuen
kubectl rollout restart
Befehl, der einen fortlaufenden Neustart einer Bereitstellung ausführt.Die Pull-Anfrage wurde zusammengeführt. Es wird Teil der Version sein
1.15
( Changelog )quelle
Anscheinend müssen Sie jetzt, wenn Sie ein fortlaufendes Update mit dem
--image
gleichen Argument wie das vorhandene Container-Image ausführen , auch ein angeben--image-pull-policy
. Der folgende Befehl sollte ein Ziehen des Bildes erzwingen, wenn es mit dem Containerbild identisch ist:kubectl rolling-update myapp --image=us.gcr.io/project-107012/myapp:5c3dda6b --image-pull-policy Always
quelle
quelle
Mit dem Befehl in
kubectl rollout restart deploy YOUR-DEPLOYMENT
Kombination mit einerimagePullPolicy: Always
Richtlinie können Sie jetzt alle Pods mit einer neuesten Version Ihres Images neu starten.quelle
Der fortlaufende Aktualisierungsbefehl geht bei Angabe eines Image-Arguments davon aus, dass sich das Image von dem unterscheidet, das derzeit im Replikationscontroller vorhanden ist.
quelle
--image
Flagge übergeben.Sie können
imagePullPolicy: Always
in Ihrer Bereitstellungsdatei definieren .quelle
Die Image-Pull-Richtlinie hilft immer dabei, das Image jedes Mal abzurufen, wenn ein neuer Pod erstellt wird (dies kann in jedem Fall das Skalieren der Replikate oder das Stempeln des Pods und das Erstellen eines neuen Pods sein).
Wenn Sie jedoch das Image des aktuell ausgeführten Pods aktualisieren möchten, ist die Bereitstellung der beste Weg. Sie können problemlos einwandfrei aktualisieren (hauptsächlich, wenn Sie ein dauerhaftes Volume an den Pod angeschlossen haben) :)
quelle