Saya memiliki pengontrol replikasi berikut di Kubernetes di 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
Sekarang, jika saya katakan
kubectl rolling-update myapp --image=us.gcr.io/project-107012/myapp:5c3dda6b
pembaruan bergulir dilakukan, tetapi tidak ada tarik ulang. Mengapa?
image
pull
kubernetes
Torsten Bronger
sumber
sumber
imagePullPolicy
lapangan.latest
, jangan lakukan itu. Terbaru akan menarik, well, gambar yang lebih baru dengan tag terbaru. Yang Anda inginkan adalah rentang SemVer. ~ 1.2.3 misalnya. ini akan menarik gambar dengan tag antara kisaran> = 1.2.3 dan <1.3.0. Selama vendor gambar mengikuti SemVer, Anda tahu (dan ini adalah bagian penting) tidak ada perubahan mundur yang ditambahkan (dengan sengaja) dan bahwa tidak ada fitur baru yang ditambahkan (kemungkinan masalah keamanan). Tolong, tolong jangan gunakanlatest
dalam sistem produksi.Jawaban:
Kubernetes akan memanfaatkan pembuatan Pod jika salah satu (lihat memperbarui-gambar doc ):
:latest
imagePullPolicy: Always
ditentukanIni bagus jika Anda ingin selalu menarik. Tetapi bagaimana jika Anda ingin melakukannya atas permintaan : Misalnya, jika Anda ingin menggunakan
some-public-image:latest
tetapi hanya ingin menarik versi yang lebih baru secara manual saat Anda memintanya. Anda saat ini dapat:imagePullPolicy
keIfNotPresent
atauNever
dan pra-tarik : Tarik gambar secara manual pada masing-masing simpul gugus sehingga yang terbaru di-cache, lalu lakukankubectl rolling-update
atau serupa untuk me-restart Pods (hack yang mudah rusak!)imagePullPolicy
, lakukan akubectl apply
, mulai ulang pod (mis.kubectl rolling-update
), KembalikanimagePullPolicy
, ulangikubectl apply
(jelek!)some-public-image:latest
ke repositori pribadi Anda dan lakukankubectl rolling-update
(berat!)Tidak ada solusi yang baik untuk tarikan sesuai permintaan. Jika itu berubah, beri komentar; Saya akan memperbarui jawaban ini.
sumber
:latest
- bagaimanapatch
dengan? apakah itu juga selalu menarik gambar terbaru / terbaru? Sepertinya tidak bekerja untuk saya :(:latest
tag yang menunjuk ke gambar baru, dankubectl rolling-update
berfungsi untuk memperbarui pod.Kita harus mengelompokkan
imagePullPolicy
di dalam data wadah alih-alih di dalam data spesifikasi. Namun, saya mengajukan masalah tentang ini karena saya merasa aneh. Selain itu, tidak ada pesan kesalahan.Jadi, cuplikan spesifikasi ini berfungsi:
sumber
imagePullPolicy
(atau pemberian tag:latest
) baik jika Anda ingin selalu menarik, tetapi tidak menyelesaikan pertanyaan tentang menarik berdasarkan permintaan.imagePullPolicy: Always
definisi dalam wadah akankubernetes
mengambil gambar dengan tag:latest
setiap kali versi yang lebih baru dari mereka didorong ke registri?imagePullPolicy: Always
hanya memberi tahu Kubernetes untuk selalu menarik gambar dari registri. Gambar apa yang akan dikonfigurasikan berdasarkanimage
atribut. Jika Anda mengonfigurasinyaimage: your-image:latest
, maka itu akan selalu menarikyour-image
gambar denganlatest
tag.Retas saya selama pengembangan adalah untuk mengubah manifes Penempatan saya untuk menambahkan tag terbaru dan selalu menarik seperti itu
Kemudian saya menghapus pod secara manual
Karena ini Penyebaran, Kubernetes akan secara otomatis membuat ulang pod dan menarik gambar terbaru.
sumber
Solusi populer adalah untuk menambal penyebaran dengan anotasi dummy (atau label):
Dengan asumsi penyebaran Anda memenuhi persyaratan ini, ini akan menyebabkan K8 menarik gambar baru dan memindahkan.
sumber
ImagePullPolicy
sebagai Selalu . penjelasan sepertideployment.kubernetes.io/revision: "v-someversion"
dankubernetes.io/change-cause: the reason
bisa sangat membantu dan menuju penyebaran yang tidak dapat diubah.Akan ada perintah baru untuk langsung melakukan itu:
Buat
kubectl rollout restart
perintah baru yang melakukan restart bergulir dari penerapan.The tarik permintaan Got digabung. Ini akan menjadi bagian dari versi
1.15
( changelog )sumber
Rupanya sekarang ketika Anda menjalankan pembaruan bergulir dengan
--image
argumen yang sama dengan gambar kontainer yang ada, Anda juga harus menentukan--image-pull-policy
. Perintah berikut harus memaksa tarikan gambar ketika itu sama dengan gambar wadah:kubectl rolling-update myapp --image=us.gcr.io/project-107012/myapp:5c3dda6b --image-pull-policy Always
sumber
sumber
Sekarang, perintah yang
kubectl rollout restart deploy YOUR-DEPLOYMENT
dikombinasikan denganimagePullPolicy: Always
kebijakan akan memungkinkan Anda untuk me-restart semua pod Anda dengan versi terbaru dari gambar Anda.sumber
Perintah pembaruan bergulir, ketika diberikan argumen gambar, mengasumsikan bahwa gambar berbeda dari apa yang saat ini ada di pengontrol replikasi.
sumber
--image
bendera.Anda dapat menentukan
imagePullPolicy: Always
dalam file penempatan Anda.sumber
Kebijakan tarik Gambar akan selalu benar-benar membantu menarik gambar setiap kali pod baru dibuat (ini bisa berupa penskalaan replika, atau pod dies dan pod baru dibuat)
Tetapi jika Anda ingin memperbarui gambar pod yang sedang berjalan, penerapan adalah cara terbaik. Ini membuat Anda tanpa cacat pembaruan tanpa masalah (terutama ketika Anda memiliki volume persisten terpasang ke pod) :)
sumber