Load Balancers dalam sistem orkestrasi (Kubernetes, Nomad, dan lainnya) memiliki lebih banyak persyaratan daripada sekadar load balancing. Pertama, Load Balancer harus dapat membaca direktori dengan daftar layanan yang lalu lintasnya harus dialihkan (atau, sebagai opsi, memungkinkan layanan mendaftar untuk memasukkannya dalam lalu lintas). Kedua, lakukan secara dinamis, karena sistem orkestrasi dapat setiap saat menambah atau mengurangi jumlah replika layanan, atau memindahkannya ke alamat lain di jaringan. Dan ketiga, lakukan itu tanpa menghentikan lalu lintas.
Dalam posting hari ini, saya akan menjelaskan bekerja dengan dua Load Balancers - Traefik dan HAProxy. Load Balancers ini memiliki kemampuan untuk bekerja dengan daftar alat orkestrasi yang mengesankan. Contoh-contoh akan menjelaskan cara bekerja dengan sistem orkestrasi Nomad.
Di
posting terakhir saya sudah memberi contoh Load Balancers - Fabio. Batasannya: hanya berfungsi dengan protokol http / https, dan hanya berfungsi dengan Konsul. Tidak seperti Fabio, Load Balancers Traefik bekerja dengan sejumlah sistem berbeda yang mengesankan. Berikut adalah sebagian daftar yang diambil dari situs pengembang: Docker, mode Swarm, Kubernetes, Marathon, Konsul, Etcd, Rancher, Amazon ECS, ...
Saya akan melanjutkan contoh dari
posting sebelumnya , di mana beberapa replika layanan Django dibuat.
Traefik dapat diunduh dari situs pengembang sebagai file yang dapat dieksekusi untuk sistem operasi yang paling umum. Untuk berintegrasi dengan Nomad (sebenarnya dengan Konsul), Anda perlu membuat file konfigurasi:
[entryPoints] [entryPoints.http] address = ":5001" [web] address = ":8080" [consulCatalog] endpoint = "127.0.0.1:8500" domain = "consul.localhost" exposedByDefault = false prefix = "traefik"
Dan kemudian jalankan perintah dengan file konfigurasi yang diberikan:
traefik -c nomad/traefik.toml
Setelah itu, UI Traefik akan tersedia di port 8080, yang belum menerbitkan layanan apa pun. Ada beberapa cara untuk menerbitkan layanan, yang pada akhirnya melakukan hal yang sama - mereka memuat data kunci / nilai ke dalam sistem Traefik. Kami akan mengambil kesempatan untuk mengatur pasangan kunci / nilai melalui tag layanan. Mari kita perluas file konfigurasi layanan Django dengan parameter tag:
job "django-job" { datacenters = ["dc1"] type = "service" group "django-group" { count = 3 restart { attempts = 2 interval = "30m" delay = "15s" mode = "fail" } ephemeral_disk { size = 300 } task "django-job" { driver = "docker" config { image = "apapacy/tut-django:1.0.1" port_map { lb = 8000 } } resources { network { mbits = 10 port "lb" {} } } service { name = "django" tags = [ "traefik.enable=true", "traefik.frontend.entryPoints=http", "traefik.frontend.rule=Host:localhost;PathStrip:/test", "traefik.tags=exposed" ] port = "lb" check { name = "alive" type = "http" path = "/" interval = "10s" timeout = "2s" } } } } }
Dalam contoh ini, layanan akan dipublikasikan pada host host lokal dan dipasang pada rute / test. Traefik telah mengembangkan sistem aturan yang fleksibel dan lengkap untuk mengkonfigurasi rute, termasuk bekerja dengan ekspresi reguler. Daftar parameter untuk
aturan dalam dokumentasi pengembang.
Setelah menjalankan
nomad job run nomad/django.conf
aturan diterapkan dan lalu lintas dari Load Balancer akan diarahkan ke layanan. Dengan demikian, Anda dapat mengubah parameter ini, menggunakan opsi layanan baru dengan perintah
nomad job run nomad/django.conf
, dan semua perubahan akan diterapkan tanpa mengganggu lalu lintas yang mengganggu.
Kerugian dari Traefik adalah ia bekerja dengan protokol keluarga http / https (untuk berjaga-jaga, saya perhatikan bahwa keluarga ini juga menyertakan soket web). Tetapi masih ada kemungkinan bahwa akan ada kebutuhan untuk bekerja dengan protokol lain. Jadi mari kita beralih ke solusi yang lebih luas berikutnya berdasarkan HAProxy. Beberapa waktu yang lalu, HAProxy memiliki masalah dengan soft loading, yang membuatnya sulit untuk menggunakannya dengan sistem orkestrasi (selama restart, perlu untuk menghentikan pergerakan paket di tingkat jaringan). Sekarang ini bukan lagi masalah.
Pertama, Anda perlu menginstal haproxy di komputer Anda. Di sini, opsi memasang di dalam wadah tidak akan berfungsi. Dalam haproxy, baru-baru ini menjadi mungkin untuk memulai kembali proses dalam mode "lunak", tetapi wadah buruh pelabuhan masih berhenti, karena proses kedua sebenarnya dimulai dengan haproxy, itu hanya berubah dalam mode siaga - yang tidak bekerja dengan buruh pelabuhan dan prinsipnya "satu -kontainer adalah satu proses. "
Agar haproxy berfungsi, Anda harus memiliki file konfigurasi yang berisi aturan yang diperlukan. Nomad (sebenarnya di Konsul) menggunakan sistem template yang dapat menghasilkan konfigurasi:
global debug defaults log global mode http option httplog option dontlognull timeout connect 5000 timeout client 50000 timeout server 50000 frontend http_front bind *:5001 stats uri /haproxy?stats default_backend http_back backend http_back balance roundrobin{{range service "django"}} server {{.Node}} {{.Address}}:{{.Port}} check{{end}}
Kata kunci
range
dalam hal ini bertindak sebagai iterator. Untuk tiga layanan "Django", file konfigurasi berikut akan dihasilkan:
global debug defaults log global mode http option httplog option dontlognull timeout connect 5000 timeout client 50000 timeout server 50000 frontend http_front bind *:5001 stats uri /haproxy?stats default_backend http_back backend http_back balance roundrobin server 228.195.86.224 127.0.0.1:21469 check server 228.195.86.224 127.0.0.1:25872 check server 228.195.86.224 127.0.0.1:25865 check
Perpustakaan
https://github.com/hashicorp/consul-template digunakan untuk memulai proses pembuatan menurut templat on the fly. Dari sumber daya pengembang, Anda dapat mengunduh file yang dapat dieksekusi untuk semua sistem operasi umum, dan memulai proses atas nama pengguna yang tidak sah dengan perintah:
consul-template -template="haproxy/haproxy.cfg.tmpl:haproxy/haproxy.cfg:./haproxy/haproxy.reload.sh"
Parameter
-template
berisi parameter yang dipisahkan titik dua 1) nama templat, 2) nama file konfigurasi yang dihasilkan 3) perintah yang dieksekusi setelah file dihasilkan. File akan dihasilkan secara otomatis jika variabel yang termasuk dalam templat diubah (misalnya, jumlah replika layanan django diubah).
Setelah memulai mesin templat yang akan menghasilkan konfigurasi pertama, Anda dapat menjalankan haproxy:
haproxy -D -f haproxy/haproxy.cfg -p `pwd`/haproxy.pid
Kami secara eksplisit menentukan file pid untuk dapat mengirim sinyal ke "soft" overload haproxy:
haproxy -D -f ./haproxy/haproxy.cfg -p `pwd`/haproxy.pid -sf $(cat `pwd`/haproxy.pid)
Dalam contoh ini, layanan diterbitkan pada port 5001. Pada port yang sama, Anda dapat melihat statistik haproxy sendiri di alamat
/haproxy?stats
.
DIPERBARUI 02/24/2019 10:43 PM
Menurut komentar
@ usego , penyempurnaan tambahan dilakukan pada pengoperasian haproxy dalam wadah buruh pelabuhan, khususnya sesuai dengan fragmen dari dokumentasi
github.com/neo4j/docker-library-docs/tree/master/haproxy#reloading-configMemuat ulang konfigurasi
Jika Anda menggunakan bind mount untuk konfigurasi dan telah mengedit file haproxy.cfg Anda, Anda dapat menggunakan fitur muat ulang HAProxy yang anggun dengan mengirimkan SIGHUP ke wadah:
$ docker kill -s HUP my-running-haproxy
Script entrypoint pada gambar memeriksa untuk menjalankan perintah haproxy dan menggantinya dengan haproxy-systemd-wrapper dari HAProxy hulu yang menangani penanganan sinyal untuk melakukan pengisian ulang yang anggun. Di bawah tenda ini menggunakan opsi -sf dari haproxy sehingga "ada dua jendela kecil dari beberapa milidetik masing-masing di mana ada kemungkinan bahwa beberapa kegagalan koneksi akan terlihat selama beban tinggi" (lihat Menghentikan dan memulai kembali HAProxy).
Dengan pendekatan ini, konfigurasi benar-benar dimuat ulang, tetapi sebagai akibat dari gangguan proses saat ini. Dan ini berarti bahwa layanan tersebut akan memiliki, meskipun sangat tidak signifikan, namun demikian periode tidak dapat diaksesnya dan beberapa pelanggan mungkin mengamati pesan kesalahan. Tetapi kadang-kadang ini bukan kriteria seleksi utama. Karena itu, saya akan memberikan tambahan konfigurasi docker-compose.yml untuk meluncurkan haproxy di docker:
version: '3' services: haproxy_lb: image: haproxy volumes: - ./haproxy:/usr/local/etc/haproxy network_mode: host
Perintah yang akan membebani konfigurasi haproxy juga akan berubah:
consul-template -template="haproxy/haproxy.cfg.tmpl:haproxy/haproxy.cfg:docker kill -s HUP $(docker-compose ps -q haproxy_lb)"
Keuntungan dari implementasi ini termasuk kemampuan untuk bekerja tanpa menginstal haproxy.
Kode sampel tersedia di repositori.Tautan yang bermanfaat:
1.www.haproxy.com/blog/haproxy-and-consul-with-dns-for-service-discovery2.m.mattmclaugh.com/traefik-and-consul-catalog-example-2c33fc1480c03.www.hashicorp.com/blog/load-balancing-strategies-for-consulapapacy@gmail.com
24 Februari 2019