Kubernetes'i görüntüyü tekrar çekmeye nasıl zorlarım?


161

GKE üzerinde Kubernetes aşağıdaki çoğaltma denetleyicisi var:

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

Şimdi, eğer dersem

kubectl rolling-update myapp --image=us.gcr.io/project-107012/myapp:5c3dda6b

haddeleme güncellemesi yapılır, ancak yeniden çekme işlemi gerçekleştirilmez. Neden?


12
Sadece aynı etiketle farklı bir görüntü verdim. Farklı bir etiket vermek gerekirse, imagePullPolicyalanda hiçbir nokta göremiyorum .
Torsten Bronger

4
Belirli bir etiketi kullanmak istiyorum, ancak en yeni sürümü.
Torsten Bronger

3
@TorstenBronger Bence bu Kubernetes / Docker teorisinde önemli bir değişiklik. İki farklı zamanda resim çekebilirsiniz: etiket (en sondan farklı) ve iki farklı resim elde etmek sorun yaratır. Etiket, sürüm numarasına benzer. Görüntü değiştiğinde her zaman etiketi değiştirmek daha iyi bir uygulamadır.
duct_tape_coder

2
Değişir. Çok kararlı bir API'ye sahip bir yazılım var ancak güvenlik güncellemeleri var. Sonra, açıkça söylemek zorunda kalmadan en son sürümü istiyorum.
Torsten Bronger

1
@TorstenBronger Kullanmayla ilgili olarak latestyapma. En son, en son etiketi ile daha yakın zamanda görüntüyü çeker. İstediğiniz bir SemVer serisi. ~ 1.2.3 örneğin. bu, etiketleri => 1.2.3 ile <1.3.0 arasında olan görüntüler çeker. Görüntü satıcısı SemVer'i takip ettiği sürece sizin bilginiz (ve bu önemli bir parçadır) geriye doğru kırılma değişikliği eklenmedi (bilerek) ve yeni özelliklerin eklenmediği (olası güvenlik endişesi). Lütfen, asla latestüretim sistemlerinde kullanmayınız .
David J Eddy

Yanıtlar:


141

Kubernetes, aşağıdaki durumlarda Pod oluşturma işlemini gerçekleştirir ( güncelleme resimleri belgesine bakın ):

  • Etiketli resimleri kullanma :latest
  • imagePullPolicy: Always belirtildi

Her zaman çekmek istiyorsanız bu harika. Peki ya isteğe bağlı olarak yapmak isterseniz : Örneğin, kullanmak some-public-image:latestistediğiniz ancak yalnızca yeni bir sürümü istendiğinde manuel olarak çekmek istiyorsanız. Şu anda şunları yapabilirsiniz:

  • Set imagePullPolicyiçin IfNotPresentya Neverve -çekme öncesi : en son önbelleğe böylece her küme düğümünde çekin görüntüleri elle, daha sonra yapmak kubectl rolling-updateveya Pod'umuz yeniden başlatmak için benzer (çirkin kolay kırılan kesmek!)
  • Geçici olarak değiştirin imagePullPolicy, yapın kubectl apply, bölmeyi yeniden başlatın (örn. kubectl rolling-update), Geri alın imagePullPolicy, yeniden yapın kubectl apply(çirkin!)
  • some-public-image:latestÖzel veri havuzunuza çekin ve itin ve kubectl rolling-update(ağır!)

İsteğe bağlı çekme için iyi bir çözüm yoktur. Bu değişiklik olursa lütfen yorum yapın; Bu cevabı güncelleyeceğim.


Kubernetes'in kullanırken Pod oluşturma işlemini çekeceğini söylüyorsunuz :latest- ya patching? her zaman en yeni / en yeni görüntüyü çekiyor mu? Benim için çalışmıyor gibi görünüyor :(
pkyeck

Yamanızın bir Pod'un yeniden oluşturulmasını zorlayıp zorlamadığına bağlıdır. Büyük olasılıkla değil, o zaman tekrar çekmeyecek. Bölmeyi manuel olarak öldürebilir veya güncellenmiş etiketle benzersiz ve yama içeren bir etiketle etiketleyebilirsiniz.
Wernight

Bu farklı bir sorunun cevabıdır. Yeniden çekmeye zorlamak istedim .
Torsten Bronger

Bu, GCR'den yeni bir çekim yapmaya zorlamamı sağladı. :latestYeni bir görüntüye işaret eden bir etiketim vardı kubectl rolling-updateve bölmeleri güncellemek için çalıştım.
Randy L

Teşekkürler. Pull & Push yaklaşımı için gitti.
Bas

77

Kişi, imagePullPolicyspesifikasyon verileri içinde değil, konteyner verileri içinde gruplanmalıdır. Ancak garip bulduğum için bununla ilgili bir konu açtım. Ayrıca hata mesajı yok.

Yani, bu özellik snippet'i çalışır:

spec:
  containers:
  - name: myapp
    image: myregistry.com/myapp:5c3dda6b
    ports:
    - containerPort: 80
    imagePullPolicy: Always
  imagePullSecrets:
    - name: myregistry.com-registry-key

3
imagePullPolicy(veya etiketleme :latest) her zaman çekmek istiyorsanız iyidir, ancak istekte bulunma sorununu çözmez.
Wernight

1
Evet, soruda belirtildiği gibi her zaman çekmek istiyorum .
Torsten Bronger

1
Kullanılması imagePullPolicy: Alwayskonteyner tanımı içinde olacak kubernetesile etiketlenmiş resimleri getirme :latestonlardan daha yeni bir sürümü kayıt defterine itilir zaman?
pkaramol

1
@pkaramol No. imagePullPolicy: Alwaysbasitçe Kubernetes'e her zaman kayıt defterinden resim çekmesini söyler. Hangi görüntüye imageözelliğe göre yapılandırılır . Bunu olarak yapılandırırsanız image: your-image:latest, your-imageresmi her zaman latestetiketi ile çeker .
Aralık'ta Gajus

26

Geliştirme sırasındaki hack'im, en son etiketi eklemek ve her zaman böyle çekmek için Dağıtım bildirimimi değiştirmek

image: etoews/my-image:latest
imagePullPolicy: Always

Sonra bölmeyi elle siliyorum

kubectl delete pod my-app-3498980157-2zxhd

Bir Dağıtım olduğu için Kubernetes bölmeyi otomatik olarak yeniden oluşturur ve en son görüntüyü çeker.


Ben "dağıtım" nesnenin "istenen devlet" binaları yararlanmak gibi ... öneri için teşekkürler!
Marcello de Sales

2
Stratejinin yalnızca hizmetteki arızalar ve kesinti süreleri tolere edilebilirse uygulanabilir olduğunu belirtmek gerekir. Geliştirme için makul gibi görünüyor, ancak üretim stratejisi için bu stratejiyi asla yerine getirmem.
digitaldreamer

Konuşlamayı düzenleyin, imagePullPolicy'i her zaman olarak değiştirin ve bölmeyi silmek Everett'in önerdiği gibi benim için yeterliydi. Bu bir geliştirme ortamı. kubernetes.io/docs/concepts/containers/images
Jos Roberto Almaraz

17

Bir popüler geçici çözüm bir kukla açıklama (veya etiket) ile dağıtım yama geçerli:

kubectl patch deployment <name> -p \
  "{\"spec\":{\"template\":{\"metadata\":{\"annotations\":{\"date\":\"`date +'%s'`\"}}}}}"

Dağıtımınızın bu gereksinimleri karşıladığını varsayarsak , bu, K8'lerin yeni bir resim çekmesine ve yeniden konuşlandırmasına neden olur.


2
Evet, bunun için bir ek açıklama kullanıyorum.
Torsten Bronger

ne ek açıklaması?
Jeryl Cook

1
Başka bir karmaşık çözüm her ikisinin bir kombinasyonu olacaktır. ek açıklama eklemek ve Her zamanImagePullPolicy olarak ayarlamak . ek açıklamalar gibi ve değişmez dağıtımları doğru oldukça yararlı ve kafaları olabilir. deployment.kubernetes.io/revision: "v-someversion"kubernetes.io/change-cause: the reason
chandan

16

Bunu doğrudan yapmak için yeni bir komedi olacak:

kubectl rollout restartBir dağıtımın sürekli olarak yeniden başlatılmasını sağlayan yeni bir komut oluşturun .

Çekme isteği got birleşti. Sürümün bir parçası olacak 1.15( changelog )



Evet, yeni kubernet 1.15 sürümünde güncellemeyi tetiklemenin en iyi yolu budur.
Dolphin

7

Görünüşe göre şimdi --imagemevcut kapsayıcı görüntüsüyle aynı argümanla birlikte bir güncelleştirme çalıştırdığınızda, bir de belirtmeniz gerekir --image-pull-policy. Aşağıdaki komut, kapsayıcı görüntüsüyle aynı olduğunda görüntünün çekilmesini zorlamalıdır:

kubectl rolling-update myapp --image=us.gcr.io/project-107012/myapp:5c3dda6b --image-pull-policy Always


6
# Linux

kubectl patch deployment <name> -p "{\"spec\":{\"template\":{\"metadata\":{\"annotations\":{\"date\":\"`date +'%s'`\"}}}}}"

# windows

kubectl patch deployment <name> -p (-join("{\""spec\"":{\""template\"":{\""metadata\"":{\""annotations\"":{\""date\"":\""" , $(Get-Date -Format o).replace(':','-').replace('+','_') , "\""}}}}}"))

3

Artık, kubectl rollout restart deploy YOUR-DEPLOYMENTbir imagePullPolicy: Alwaysilke ile birleştirilen komut, tüm bölmelerinizi görüntünüzün en son sürümüyle yeniden başlatmanıza olanak tanır.


3

Yuvarlanan güncelleme komutu, bir görüntü bağımsız değişkeni verildiğinde, görüntünün çoğaltma denetleyicisinde varolandan farklı olduğunu varsayar .


Bu, resim etiketinin (diğer adın) farklı olması gerektiği anlamına mı geliyor?
Torsten Bronger

Evet, --imagebayrağı geçerseniz görüntü adı farklı olmalıdır .
Robert Bailey

1
Kendi cevabımın dediği gibi, resim adı aynı ise de çalışır. Basitçe imagePullPolicy yanlış yerdeydi. Savunmam için, k8s 1.0 belgeleri bu açıdan hatalı.
Torsten Bronger

Dokümanlar davranışla senkronize olmadığında sevmeliyim. : /
Robert Bailey

1
Bu url de eski.
Dan Tenenbaum


0

Görüntü çekme politikası her zaman yeni bir kapsül oluşturulduğunda her zaman görüntüyü çekmeye yardımcı olur (bu her durumda kopyaları ölçeklendirmek veya kapsül ölür ve yeni kapsül oluşturulduğunda)

Ancak, geçerli çalışan bölmenin görüntüsünü güncellemek istiyorsanız, dağıtım en iyi yoldur. Herhangi bir sorun yaşamadan kusursuz bir güncelleme yapmanızı sağlar (özellikle kapsüle kalıcı bir hacme sahip olduğunuzda) :)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.