Bagaimana cara memperbarui daftar server hulu nginx secara otomatis ketika aws ec2 perubahan nama host atau meningkat?

16

Saya ingin mengatur autoscaling di AWS. Saya tidak ingin menggunakan Elastic Load Balancer.

Autoscalling di Amazon menciptakan instance EC2 dengan mulus selama lonjakan permintaan untuk mempertahankan kinerja, dan menurun secara otomatis selama permintaan meninabobokan untuk meminimalkan biaya.

Karena instance EC2 ini dibuat secara otomatis, nama host mereka tidak diketahui oleh NGINX.

Saya tahu dan sudah memiliki pengaturan hulu di nginx hingga 10 contoh EC2.

Saya ingin dapat menambah / memperbarui / menghapus nama server secara otomatis ke konfigurasi hulu nginx saya, ketika autoscaling menambahkan / memperbarui / menghapus instance EC2.

Luis Lobo Borobia
sumber
1
Anda perlu menghapus "autoscaling" dari pertanyaan Anda. Autoscaling adalah istilah AWS. Saya pikir apa yang Anda maksud adalah Anda ingin skala secara otomatis (horizontal), dengan menambahkan lebih banyak node upstream ke nginx Anda bertindak sebagai LB, dan Anda bertanya bagaimana secara otomatis mengubah konfigurasi nginx Anda ketika node upstream ditambahkan / dihapus / dimodifikasi. Jika demikian, harap edit pertanyaan Anda sesuai.
talonx
sebenarnya, saya tahu apa itu autoscalling, dan saya ingin mengatakan itu. Saya ingin mencampur keduanya. Saya akan memperbarui pertanyaan.
Luis Lobo Borobia
1
Pertanyaannya lebih jelas sekarang, dalam maksudnya. Saya ingin memilih untuk membuka kembali, tetapi saya tidak melihat opsi - saya kira saya belum memiliki perwakilan yang cukup.
talonx
Terima kasih @talonx Saya harap orang lain dapat memilih untuk menemukan jawaban saya
Luis Lobo Borobia
1
Saya pikir Anda dapat menggabungkan notifikasi autoscaling AWS (dikirim menggunakan SNS) - dengan asumsi ia mengembalikan nama host dari instance yang baru dibuat / dihentikan - dan salah satu API nginx pihak ketiga untuk memperbarui dan memuat ulang konfigurasi nginx Anda. Maaf karena tidak jelas - Saya tidak terlalu terbiasa dengan autoscaling API.
talonx

Jawaban:

7

Ini dapat dicapai dengan menggunakan Amazon SDK (saya hampir selesai dengan itu, akan meletakkannya di github), memanfaatkan layanan SNS, EC2 dan Autoscaling.

Saya telah mengikuti langkah-langkah di bawah ini untuk mencapai ini:

  1. Aktifkan pemberitahuan HTTP dan berlangganan server web saya.
  2. Menambahkan hook siklus hidup dengan detak jantung 1 menit (untuk menunggu 1 menit sebelum mengakhiri) ke grup autoscaling saya untuk mengakhiri server
  3. Membuat file indeks untuk mengurai pesan untuk mendeteksi jenis pesan apa itu (mis. Luncurkan atau Hentikan)
  4. Setelah jenis acara diputuskan, saya meminta EC2 untuk mendapatkan ip pribadi dari instance tersebut
  5. Dalam hal Peluncuran tunggu hingga header 200 diterima dan kemudian tambahkan ip ke nginx config dan muat ulang
  6. Dalam kasus Terminate hapus IP dari config dan muat ulang nginx

Silakan temukan skrip di sini https://github.com/singhupendra/aws-autoscale

Upendra
sumber
Apakah Anda memposting ini di github? Saya mencoba melakukan hal yang sama dan bantuan apa pun akan dihargai.
Aaron
silakan gunakan - github.com/singhupendra/aws-autoscale
Upendra
2

Terima kasih @alonx, saya telah melakukan riset, Amazon Autoscale memiliki api untuk menanyakan status grup autoscaling saat ini, dan menyebutkan anggotanya. Ia mengembalikan id instance ( http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/api_requests.html#query-example ), lalu Anda dapat menggunakan alat bantu uraian untuk mendapatkan nama server ( http: // docs .aws.amazon.com / AWSEC2 / latest / CommandLineReference / ApiReference-cmd-DescribeInstances.html ) dan akhirnya buat ulang file include upstream. Saya bisa merasakan notifikasi Autoscaling untuk meluncurkan proses yang melakukan tugas-tugas ini.

Saya masih belum menerapkannya tetapi cara untuk pergi.

Anda juga dapat menggunakan Autocaling dengan SNS http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/ASGettingNotifications.html

Luis Lobo Borobia
sumber
Ini pada dasarnya apa yang saya lakukan. Saya menulis skrip ruby ​​yang berjalan setiap N menit. Menggunakan AWS SDK itu permintaan untuk anggota ASG dan menggunakan templat ERB itu menghasilkan konfigurasi baru. Jika konfigurasi baru berbeda dari konfigurasi saat ini, ia menyalinnya ke tempatnya dan memberi tahu daemon (haproxy dalam kasus saya) untuk memuat ulang konfigurasi. Perhatikan bahwa instance tetap dalam ASG sebentar setelah dihentikan, jadi pastikan instance.status ==: running. Juga perhatikan bahwa jika dibutuhkan N menit setelah instance diluncurkan untuk melayani permintaan, jangan gunakan itu sekarang> instance.launch_time + N.
Mark Wagner
@MarkWagner terima kasih. Apakah ada kemungkinan Anda dapat membagikan skrip itu di suatu tempat? Gist, github? Terima kasih!
Luis Lobo Borobia
Apakah Anda beruntung dengan skrip ini? Apakah ada contoh di github atau di tempat lain?
Aaron
Tidak, tetapi sekarang nginx-plus (versi berbayar) memungkinkan ini lebih.
Luis Lobo Borobia
1

Saya belum menerapkan ini belum sendiri, tapi aku melihat ke menggunakan On-the-fly rekonfigurasi dari nginx Ditambah . Saya berpikir bahwa AMI, atau manajemen konfigurasi (Wayang, Garam, atau semacamnya) yang mengatur contoh Grup Penskalaan Otomatis, dapat mencapai API konfigurasi ulang NGiNX (mungkin, melalui nama domain Route53 internal sehingga tidak ada IP tetap yang akan perlu digunakan), dan menambahkan dirinya ke cluster hulu untuk proksi terbalik. Setelah itu pemeriksaan kesehatan bawaan NGiNX kemudian akan mengambil alih untuk contoh [ditambahkan] itu, dan lepaskan jika itu menjadi tidak tersedia. Ini tampaknya solusi terbersih dan tidak ada penundaan dalam menambahkan instance, dan hampir tidak ada penundaan dalam menjatuhkannya karena NGiNX Plus memiliki fitur pemeriksaan kesehatan out-of-band.

Pendekatan ini menghindari perlunya mengatur sistem penemuan otomatis (Konsul, Serf, atau semacamnya) yang untuk pengaturan yang lebih kecil sering tampak seperti banyak overhead baik dalam hal pengaturan / administrasi maupun instance EC2 yang diperlukan. Konsul, misalnya, mensyaratkan minimal tiga instance harus stabil. Budak mungkin dapat menjalankan instans ASG sendiri, tetapi masih ada overhead untuk mempertahankannya, dan jika ASG turun menjadi satu atau dua instance, Anda akan kehilangan kuorum.

Akhirnya, ini dapat digabungkan dengan pemberitahuan otomatis tentang perubahan Kelompok Penskalaan Otomatis, mungkin pada server NGiNX yang digunakan untuk menyeimbangkan beban. Seorang pendengar yang dipicu oleh notifikasi seperti itu (ini mungkin yang dimaksud Upendra) kemudian dapat secara instan menambahkan instance baru ke NGiNX melalui API modifikasi saat terbang. Selain biaya NGiNX Plus, ini membuat orang bertanya-tanya mengapa ada orang yang menggunakan Elastic Load Balancer dengan banyak masalah di tempat pertama.

Mengedit 2015/12/07: ngx_openresty 's penyeimbang-by-lua ( lihat thread GitHub ini ) menawarkan solusi sumber lain yang mungkin terbuka untuk hot-menambahkan / menghapus server dari nginx kelompok hulu. Saya belum bereksperimen dengan ini sendiri, tetapi ingin menambahkan disebutkan di sini untuk siapa pun yang menemukan posting ini.

Ville
sumber