Kubernetes, görüntüyü güncellemek için Dağıtım nasıl yapılır


132

Özel docker imajımla tek bölmeli dağıtımım var:

containers:
  - name: mycontainer
    image: myimage:latest

Geliştirme sırasında yeni en son sürümü göndermek ve Dağıtımı güncellemek istiyorum. Açıkça etiket / sürüm tanımlamadan ve her derleme için artırmadan bunu nasıl yapacağınızı bulamıyorum

kubectl set image deployment/my-deployment mycontainer=myimage:1.9.1

Yanıtlar:


151

Kapsülünüzü bir yetkisiz dönemle (örneğin, kapsayıcı başlangıç ​​süresine ve görüntü boyutuna bağlı olarak 30 saniye veya daha fazla) yapılandırabilir ve ayarlayabilirsiniz "imagePullPolicy: "Always". Ve kullanın kubectl delete pod pod_name. Yeni bir kapsayıcı oluşturulacak ve en son görüntü otomatik olarak indirilecek, ardından eski kapsayıcı sonlandırılacaktır.

Misal:

spec:
  terminationGracePeriodSeconds: 30
  containers:
  - name: my_container
    image: my_image:latest
    imagePullPolicy: "Always"

Şu anda otomatik derlemeler ve resim etiketleme için Jenkins kullanıyorum ve şuna benzer:

kubectl --user="kube-user" --server="https://kubemaster.example.com"  --token=$ACCESS_TOKEN set image deployment/my-deployment mycontainer=myimage:"$BUILD_NUMBER-$SHORT_GIT_COMMIT"

Başka bir numara da başlangıçta çalıştırmaktır:

kubectl set image deployment/my-deployment mycontainer=myimage:latest

ve sonra:

kubectl set image deployment/my-deployment mycontainer=myimage

Aslında, sürekli güncellemeyi tetikleyecektir, ancak imagePullPolicy: "Always"ayarladığınızdan da emin olun .

Güncelleme:

Gördüğüm başka bir numara, resim adını değiştirmek zorunda olmadığın yerde, örneğin bir sürekli güncellemeyi tetikleyecek bir alanın değerini değiştirmektir terminationGracePeriodSeconds. Bunu aşağıdaki gibi bir yama kullanarak kubectl edit deployment your_deploymentveya kullanarak yapabilirsiniz kubectl apply -f your_deployment.yaml:

kubectl patch deployment your_deployment -p \
  '{"spec":{"template":{"spec":{"terminationGracePeriodSeconds":31}}}}'

Her zaman sayı değerini değiştirdiğinizden emin olun.


1
Aslında bu senin numaran fena değil, resmimi düşünürsek: lastet ve resmim temelde aynı, teşekkürler!
21

1
Bu numara daha çok bir hata gibi görünüyor, neden onu iki kez belirtmemiz gerektiğinden emin değil.
sürat uçağı

2
Bir kubernetes dağıtımının aynı görüntüyü kullanarak yeni bir kapsül başlatmasını istiyorsanız (ve bu numara yalnızca "en son" etiketle çalışır), onu bir etiket olmadan belirtmeniz gerekir. Bir dahaki sefere "en son" etiketi ekleyin ve güncellemeyi tetikleyecektir. Sıra tersine çevrilebilir, önemli değil. Üretimde asla "en son" etiketi kullanmazsınız, ancak geliştirme amacıyla bazen bundan faydalanabilirsiniz.
Camil

2
Sadece en yenisi için çalışır. Varsayılan olarak, en azından docker hub'ında, bir görüntüyü etiketlemeyerek "en yeni" etiketi üstlenir. Ama onsuz da çalışacak. Bu örnek, bir üretim ortamında isteyeceğiniz bir şey değildir ve geliştirme aşamasında da yararlanabileceğiniz çok fazla kullanım durumu yoktur. Bir görüntüyü CI / CD aracı kullanarak otomatik olarak güncellemenin daha iyi yöntemleri vardır.
Camil

11
Etiketi her değiştirdiğinizde ve kubectl set imagekomutu çalıştırdığınızda , kubernetes sürekli bir güncelleme gerçekleştirir. Örneğin, "repo / myimage: latest" ı dağıttığınızı varsayalım. Bu arada resminiz değiştirildi ve "v0.2" etiketi ile depoya aktarıldı. Çalıştırarak bir güncelleme gerçekleştirebilirsiniz. kubectl set image deployment/my-deployment mycontainer=myimage:v0.2Bu görüntü aynı zamanda "en son" etiketine sahip olacaktır.
Camil

74

GÜNCELLEME 2019-06-24

@Jodiug yorumuna bağlı olarak, bir 1.15sürümünüz varsa şu komutu kullanabilirsiniz:

kubectl rollout restart deployment/demo

Sorun hakkında daha fazlasını okuyun:

https://github.com/kubernetes/kubernetes/issues/13488


Peki kubernetes GitHub projesinde bu konu hakkında ilginç bir tartışma var. Sorunu görün: https://github.com/kubernetes/kubernetes/issues/33664

Orada açıklanan çözümlerden ikisinden birini öneririm.

İlk

1. Dağıtımı hazırlayın

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: demo
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: demo
    spec:
      containers:
      - name: demo
        image: registry.example.com/apps/demo:master
        imagePullPolicy: Always
        env:
        - name: FOR_GODS_SAKE_PLEASE_REDEPLOY
          value: 'THIS_STRING_IS_REPLACED_DURING_BUILD'

2.Deploy

sed -ie "s/THIS_STRING_IS_REPLACED_DURING_BUILD/$(date)/g" deployment.yml
kubectl apply -f deployment.yml

İkinci (tek astar):

kubectl patch deployment web -p \
  "{\"spec\":{\"template\":{\"metadata\":{\"labels\":{\"date\":\"`date +'%s'`\"}}}}}"

Elbette imagePullPolicy: Alwaysher iki durumda da gereklidir.


İlgili başka bir numara buldum. Herhangi bir özel dağıtım adı belirtmeden sadece "kubectl sunumunu yeniden başlatmayı" yaparsanız, "hepsini" yapacaktır.
Lennart Rolland

22
kubectl rollout restart deployment myapp

Bu, sıralı bir güncellemeyi tetiklemenin ve kubectl rolloutbenzer geri dönüşler tarafından sağlanan diğer işlemler için eski çoğaltma kümelerini yerinde bırakmanın mevcut yoludur .


@Prathameshdhanawade yama işleminin hiçbir undokomutu veya eşdeğeri yoktur .
Martin Peter

7

Görüntüyü oluşturmak için Gitlab-CI kullanıyorum ve ardından onu doğrudan GCK'ya dağıtıyorum. Bir etiketi mevcut commit-short-sha'ya değiştiren, kabın herhangi bir gerçek ayarını değiştirmeden bir sıralı güncelleme elde etmek için düzgün küçük bir numara kullanırsanız.

Komutum şuna benziyor:

kubectl patch deployment my-deployment -p "{\"spec\":{\"template\":{\"metadata\":{\"labels\":{\"build\":\"$CI_COMMIT_SHORT_SHA\"}}}}}}"

Her derlemede değiştiği sürece etiket için herhangi bir adı ve herhangi bir değeri kullanabileceğiniz yer.

İyi eğlenceler!


6

Görünüşe göre k8 bizden her dağıtım için farklı bir imaj etiketi sağlamamızı bekliyor. Benim varsayılan stratejidir Yapı numarası ile etiketleyerek, CI sistemi oluşturmak yapmak ve liman işçilerinin görüntüleri itmek olacaktır: xpmatteo/foobar:456.

Yerel geliştirme için aşağıdaki gibi bir komut dosyası veya makefile kullanmak uygun olabilir:

# create a unique tag    
VERSION:=$(shell date +%Y%m%d%H%M%S)
TAG=xpmatteo/foobar:$(VERSION)

deploy:
    npm run-script build
    docker build -t $(TAG) . 
    docker push $(TAG)
    sed s%IMAGE_TAG_PLACEHOLDER%$(TAG)% foobar-deployment.yaml | kubectl apply -f - --record

sedKomut gerçek oluşturulan görüntü etiketiyle dağıtım belgesinde bir yer tutucu değiştirir.


kubernetes, herhangi bir görüntünün en son sürümünü almak için dağıtımı yeni bir etiketle güncellemenizi gerektirmez, "en son" en yaygın örnektir.
Dave White

1

Kapsayıcıya alma uygulamalarını dağıtmak için Azure DevOps kullanıyorum, derleme kimliğini kullanarak bu sorunun üstesinden kolayca gelebiliyorum

Her derlendiğinde ve yeni Yapı Kimliğini oluşturduğunda, bu derleme kimliğini docker görüntüsü için etiket olarak kullanıyorum burada örnek

imagename: buildID

görüntünüz başarıyla oluşturulduktan (CI) sonra, dağıtım yml dosyasındaki CD ardışık düzeninde görüntü adını şu şekilde verdim

imagename: env: buildID

burada evn: buildid, build ID değerine sahip olan azure devops değişkenidir.

şimdi her seferinde derlemek (CI) ve dağıtmak (CD) için yeni değişikliklerim var.

CI / CD için tanım oluşturmanız gerekiyorsa lütfen yorum yapın.


Manifesto, deponun bir parçasıdır. Bunun için en iyi uygulamaların ne olduğunu anlamıyorum. Görüntüyü ardışık düzen içinde oluşturursam, güncellenmiş bildirimi öğrenmek için zorlamalı mıyım? veya eserler için güncellenmiş bir manifesto üretmeli miyim (ve böylece depodaki manifesto, gerçek etiketli görüntü olmadan sadece bir şablon olabilir)?
pablete
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.