Perbarui wadah Docker tanpa downtime

17

Katakanlah saya memiliki wadah Docker dengan server web (seperti Apache 2). Sekarang saya ingin memperbarui OS di bawahnya. Jawaban SF ini mengatakan cara terbaik adalah membangun kembali gambar dasar dan gambar Apache saya. Tapi menyebarkan gambar berarti downtime karena saya harus menghapus wadah yang lama sebelum saya bisa membuat yang baru, jadi hanya ada satu wadah yang mengikat ke port 80/443.

Tetapi bagaimana saya bisa menggunakan pembaruan ini dengan nol downtime? Haruskah saya menggunakan penyeimbang beban dan menggunakan komunikasi antar wadah? Dan bagaimana cara memperbarui penyeimbang beban?

das_j
sumber

Jawaban:

18

Skenario target ideal

Ya, Anda harus menggunakan penyeimbang beban dan memperbarui satu contoh sekaligus. Saya tidak yakin di mana komunikasi antar-wadah masuk.

Sebagai contoh, bayangkan Anda memiliki penyeimbang beban yang melayani situs Anda A. Pengguna hanya terhubung sebagai dan hanya tahu sebagai "A". Penyeimbang beban tahu bahwa ada dua atau lebih backend (B, C, dll.), Dan apakah itu VM atau kontainer tidak masalah.

Kemudian, Anda ingin memutakhirkan backend, yang dalam hal ini adalah instance Apache.

  1. keluarkan B dari backend yang memenuhi syarat untuk load balancer sehingga tidak lagi menerima lalu lintas apa pun.
  2. tunggu permintaan yang sekarang hidup untuk dilayani dan koneksi yang ada ditutup.
  3. perbarui wadah atau VM yang mendasarinya yang melayani B
  4. restart B, tunggu sampai memuat dan mulai bekerja
  5. uji B untuk memastikan itu melayani permintaan baru dengan benar
  6. tambahkan B kembali ke kumpulan backend penyeimbang beban untuk mengaktifkan kembali lalu lintas

Kemudian, lakukan proses yang sama untuk C, D, dll.

Perhatikan bahwa ada permintaan terbuka untuk peningkatan tempat-tempat kontainer Docker , mulai November 2013, tetapi tampaknya tidak ada banyak kemajuan sehingga solusi di atas adalah apa yang harus Anda lakukan dalam waktu yang berarti.

Apa yang harus dilakukan untuk situs langsung yang ada

Mungkin, Anda menanyakan hal ini karena Anda sudah menjalankan situs langsung dalam model ini dan Anda ingin memutakhirkannya tanpa downtime. Jadi, kita perlu mencapai kondisi target ideal di atas, tetapi secara bertahap.

Mari kita asumsikan bahwa:

  • Anda memiliki nama DNS yang menunjuk ke wadah Anda
  • kontainer Anda berjalan pada beberapa alamat IP
  • pengguna Anda tidak tahu alamat IP kontainer dan itu bukan kode tempat

Jika asumsi ini salah, Anda harus memperbaikinya terlebih dahulu sehingga ini benar.

Kemudian, ikuti langkah-langkah ini:

  1. buat penyeimbang beban di IP baru dan arahkan ke wadah yang ada sebagai satu-satunya backend
  2. ubah DNS untuk menunjuk ke load balancer daripada IP kontainer secara langsung
  3. tambahkan backend Apache identik dengan setup wadah VM + yang sama
  4. sekarang Anda memiliki penyeimbang beban dengan dua backend B dan C, jadi ikuti petunjuk di bagian "skenario target ideal" untuk memutakhirkannya satu per satu

Cara memperbarui penyeimbang beban

Cara mudah (dihosting)

Opsi termudah adalah tidak menjalankan penyeimbang Anda sendiri. Misalnya, jika Anda menggunakan platform cloud yang menyediakan penyeimbangan beban sebagai layanan, pertimbangkan untuk menggunakannya dan kemudian pemeliharaan dan pembaruan penyeimbang beban tidak menjadi masalah.

Cara manual

Jika Anda menjalankan penyeimbang beban Anda sendiri, menambahkan lapisan tipuan lainnya (yaitu, DNS) akan membantu. Mari kita asumsikan sebagai berikut:

  • bahwa kami memiliki nama host yang menyelesaikan IP dari load balancer A kami yang ingin kami perbarui
  • penyeimbang beban kami memiliki kumpulan backend P1, P2, dll.

Kami melanjutkan sebagai berikut:

  • buat penyeimbang beban B baru dengan versi perangkat lunak baru
  • tambahkan semua instance pool backend P1, P2, dll. ke load balancer B baru kami sebagai backends
  • tambahkan alamat IP B ke resolusi DNS bersama dengan A

    • sekarang kami secara efektif menggunakan DNS sebagai penyeimbang beban
    • jika entri untuk A dan B tidak berbobot, mereka secara efektif 50-50
    • sekarang perhatikan untuk melihat bagaimana B berkinerja, apakah ada kesalahan, dll.
    • jika ada yang salah dengan B, batalkan sebagai berikut:

      1. hapus B dari konfigurasi DNS
      2. tunggu entri B dalam DNS menghilang (yaitu, tunggu TTL berakhir)
      3. menolak B
  • anggap Anda telah melakukan tes "burn-in" untuk B dan semuanya baik-baik saja
  • perbarui prioritas dan berat untuk B dalam DNS secara bertahap
  • hapus A dari DNS sepenuhnya
  • tunggu DNS TTL kedaluwarsa; A seharusnya tidak mendapatkan permintaan apa pun lagi
  • menolak A

dan kamu sudah selesai.

Detail, diagram, dan perkakas

Lihat artikel dan alat ini yang dapat membantu Anda mengotomatiskan proses, tetapi gagasan umumnya sama:

Moral

"Semua masalah dalam ilmu komputer dapat diselesaikan dengan tingkat tipuan yang lain, kecuali tentu saja untuk masalah tipuan yang terlalu banyak." - David Wheeler

Misha Brukman
sumber
Tetapi ketika penyeimbang beban juga ada dalam sebuah wadah (saat menggunakan CoreOS), bagaimana cara memperbarui wadah ini?
das_j
@das_j Saya mengedit jawaban untuk menambahkan howto untuk memperbarui penyeimbang beban juga. Petunjuk: ini semua tentang tingkat tipuan yang lain. :-)
Misha Brukman
1
Semua dalam semua, ini terdengar seperti bagaimana seseorang akan memperbarui server fisik dan loadbalancers fisik juga.
Stefan Lasiewski
@StefanLasiewski Anda memang benar dan saya telah menghapus catatan "kontainer" di salah satu judul. Untuk pengguna eksternal, apakah aplikasi atau penyeimbang beban berjalan pada logam telanjang, wadah, atau VM, sebagian besar tidak terlihat.
Misha Brukman