Docker kapsayıcısını kesinti olmadan güncelleme


17

Diyelim ki bir web sunucusuna sahip bir Docker konteyneri var (Apache 2 gibi). Şimdi altındaki işletim sistemini güncellemek istiyorum. Bu SF yanıtı , en iyi yolun temel görüntüyü ve Apache görüntümü yeniden oluşturmak olduğunu söylüyor. Ancak görüntüyü dağıtmak kesinti anlamına gelir çünkü yenisini oluşturmadan önce eski kapsayıcıyı silmem gerekir, bu nedenle 80/443 numaralı bağlantı noktasına bağlanan yalnızca bir kap vardır.

Ancak bu güncellemeyi sıfır kesinti süresiyle nasıl dağıtabilirim? Bir yük dengeleyici ve konteynerler arası iletişim mi kullanmalıyım? Yük dengeleyiciyi nasıl güncelleyebilirim?

Yanıtlar:


18

İdeal hedef senaryosu

Evet, bir yük dengeleyici kullanmalı ve her seferinde bir örneği güncellemelisiniz. Konteynerler arası iletişimin nereden geldiğinden emin değilim.

Örnek olarak, A sitenize hizmet eden bir yük dengeleyiciniz olduğunu düşünün. Kullanıcılar yalnızca ona bağlanır ve yalnızca "A" olarak bilirler. Yük dengeleyici, iki veya daha fazla arka uç (B, C, vb.) Olduğunu ve bunların VM veya konteyner olup olmadığını fark eder.

Ardından, bu durumda Apache örnekleri olan arka uçları yükseltmek istersiniz.

  1. B'yi yük dengeleyicisinin uygun arka uçlarından çıkarın, böylece artık trafiği kabul etmiyor.
  2. o anda canlı olan isteklerin sunulmasını ve mevcut bağlantıların kapanmasını bekleyin.
  3. B'yi sunan kapsayıcıyı veya temel alınan VM'yi güncelleyin
  4. B'yi yeniden başlatın, yüklenmesini bekleyin ve çalışmaya başlayın
  5. yeni istekleri doğru bir şekilde sunduğundan emin olmak için B testini yapın
  6. trafiği yeniden etkinleştirmek için yük dengeleyici arka uç havuzuna B ekleyin

Ardından, aynı işlemi C, D vb. İçin yapın.

Kasım 2013'ten itibaren Docker kapsayıcılarının yerinde yükseltmeleri için açık bir istek olduğunu unutmayın , ancak çok fazla ilerleme kaydetmediği için yukarıdaki çözüm, bu arada yapmanız gereken şeydir.

Mevcut bir canlı site için ne yapmalı

Muhtemelen bunu soruyorsunuz çünkü zaten bu modelde canlı bir site çalıştırıyorsunuz ve kesinti olmadan yeni sürüme geçirmek istiyorsunuz. Bu nedenle, yukarıdaki ideal hedef duruma ulaşmamız gerekiyor, ancak artımlı olarak.

Diyelim ki:

  • kapsayıcınıza işaret eden bir DNS adınız var
  • kapsayıcınız bazı IP adreslerinde çalışıyor
  • kullanıcılarınız kabın IP adresini bilmiyor ve hiçbir yerde sabit kodlanmış değil

Bu varsayımlar yanlışsa, önce doğru olacak şekilde düzeltmelisiniz.

Ardından, şu adımları izleyin:

  1. yeni bir IP'de bir yük dengeleyici oluşturun ve onu mevcut kapsayıcıya tek arka ucu olarak gösterin
  2. DNS'yi doğrudan konteyner IP'si yerine yük dengeleyiciyi gösterecek şekilde değiştirin
  3. aynı VM + kapsayıcı kurulumuyla aynı Apache arka ucunu ekleyin
  4. şimdi B ve C iki arka ucuna sahip bir yük dengeleyiciniz var, bu yüzden onları birer birer yükseltmek için "ideal hedef senaryosu" bölümündeki talimatları izleyin

Yük dengeleyici nasıl güncellenir

Kolay (barındırılan) yol

En kolay seçenek kendi dengeleyicinizi çalıştırmamaktır. Örneğin, hizmet olarak yük dengeleme sağlayan bir bulut platformu kullanıyorsanız, bunu kullanmayı düşünün ve yük dengeleyicinin bakımı ve güncellenmesi sorun değildir.

Manuel yol

Kendi yük dengeleyicinizi çalıştırıyorsanız, başka bir dolaylama katmanı (DNS) eklemek yardımcı olacaktır. Aşağıdakileri varsayalım:

  • güncellemek istediğimiz yük dengeleyici A'nın IP'sine çözümleyen bir ana bilgisayar adımız olduğunu
  • yük dengeleyicimizin arka uç havuzu P1, P2 vb.

Aşağıdaki gibi devam ediyoruz:

  • Yeni yazılım sürümüyle yeni bir yük dengeleyici B oluşturun
  • tüm arka uç havuzu örneklerini P1, P2 vb. yeni yük dengeleyicimize B arka uç olarak ekleyin
  • B'nin IP adresini A ile birlikte DNS çözünürlüğüne ekleyin

    • şimdi DNS'yi etkili bir yük dengeleyici olarak kullanıyoruz
    • A ve B girişleri ağırlıksızsa, etkin bir şekilde 50-50
    • şimdi B'nin nasıl çalıştığını, herhangi bir hata olup olmadığını vb. görmek için izleyin.
    • B ile ilgili bir sorun varsa, aşağıdaki gibi geri alın:

      1. DNS yapılandırmasından B'yi kaldır
      2. DNS'deki B girişinin kaybolmasını bekleyin (yani, TTL'nin süresinin dolmasını bekleyin )
      3. B'yi aşağı çevir
  • B için "burn-in" testini yaptığınızı ve her şeyin yolunda olduğunu varsayalım
  • güncelleştirmek öncelik ve ağırlık yavaş yavaş DNS B
  • A'yı DNS'den tamamen kaldır
  • DNS TTL'nin süresinin dolmasını bekleyin; A artık herhangi bir istek almıyor olmalıdır
  • A çevir

ve işiniz bitti.

Ayrıntılar, diyagramlar ve takımlar

Süreci otomatikleştirmenize yardımcı olabilecek bu yazı ve araçlara bakın, ancak genel fikir aynıdır:

Ahlak

"Bilgisayar bilimlerindeki tüm problemler, elbette çok fazla dolaylama problemi hariç, başka bir dolaylama seviyesi ile çözülebilir." - David Wheeler


Ancak yük dengeleyici de bir kapta olduğunda (CoreOS kullanırken), bu kapsayıcıyı nasıl güncelleyebilirim?
das_j

@das_j Bir yük dengeleyicisini güncellemek için nasıl ekleyeceğimi de ekledim. İpucu: Her şey başka bir dolaylama seviyesiyle ilgilidir. :-)
Misha Brukman

1
Sonuçta, bu fiziksel sunucuları ve fiziksel yük dengeleyicileri nasıl güncelleyecek gibi görünüyor.
Stefan Lasiewski

@StefanLasiewski kesinlikle haklısın ve başlıklardan birinde "kapsayıcılar" notunu kaldırdım. Harici bir kullanıcı için, bir uygulama veya yük dengeleyici çıplak metal, konteyner veya VM üzerinde çalışıyor olsun, büyük ölçüde görünmezdir.
Misha Brukman
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.