Perbarui kontainer Docker tanpa downtime

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. Tetapi menyebarkan gambar berarti downtime karena saya harus menghapus wadah lama sebelum saya dapat membuat yang baru, jadi hanya ada satu wadah yang mengikat ke port 80/443.

Tapi bagaimana saya bisa menyebarkan pembaruan ini dengan nol downtime? Haruskah saya menggunakan penyeimbang beban dan menggunakan komunikasi antar kontainer? Dan bagaimana cara memperbarui penyeimbang beban?

Skenario target ideal

Ya, Anda harus menggunakan load balancer dan memperbarui satu instance pada satu waktu. Saya Tidak yakin di mana komunikasi antar kontainer masuk.

Sebagai contoh, bayangkan Anda memiliki load balancer yang melayani situs Anda A. pengguna hanya terhubung ke as dan hanya mengetahuinya 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 meng-upgrade backend, yang dalam hal ini adalah contoh Apache.

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

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

Perhatikan bahwa ada buka permintaan untuk peningkatan kontainer Docker di tempat, dari Nov 2013, tetapi tampaknya tidak memiliki banyak kemajuan sehingga solusi di atas adalah apa yang harus Anda lakukan sementara itu.

Apa yang harus dilakukan untuk situs langsung yang ada

Agaknya, Anda menanyakan ini karena Anda sudah menjalankan situs langsung dalam model ini dan Anda ingin meningkatkannya tanpa waktu henti. Jadi, kita perlu mencapai keadaan target ideal di atas, tetapi secara bertahap.

Mari kita asumsikan bahwa:

  • Anda memiliki nama DNS yang menunjuk ke penampung Anda
  • penampung Anda berjalan pada beberapa alamat IP
  • pengguna Anda tidak tahu alamat IP penampung dan tidak dikodekan dengan keras di mana pun

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

Kemudian, ikuti langkah berikut:

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

Cara memperbarui penyeimbang beban

Cara yang mudah (hosted)

Pilihan termudah adalah tidak menjalankan penyeimbang Anda sendiri. Misalnya, jika Anda menggunakan platform cloud yang menyediakan load balancing 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 lain (yaitu, DNS) akan membantu. Mari kita asumsikan sebagai berikut:

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

Kami melanjutkan sebagai berikut:

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

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

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

dan kau sudah selesai.

Detail, diagram, dan perkakas

Lihat ini write - up dan alat-alat yang dapat membantu Anda mengotomatisasi proses, tetapi ide umum adalah sama:

Moral

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