Saya bermain dengan Amazon ECS (pengemasan ulang Docker) dan saya menemukan ada satu kemampuan Docker yang tampaknya tidak disediakan ECS. Yaitu, saya ingin memiliki beberapa kontainer berjalan secara instan, dan memiliki permintaan masuk ke alamat IP 1 peta ke wadah 1, dan permintaan datang ke alamat IP 2 peta ke wadah 2, dll.
Di Docker, mengikat wadah ke alamat IP tertentu dilakukan melalui:
docker run -p myHostIPAddr:80:8080 imageName command
Namun, di Amazon ECS, sepertinya tidak ada cara untuk melakukan ini.
Saya telah membuat instance EC2 dengan beberapa alamat IP elastis. Saat mengonfigurasi wadah sebagai bagian dari definisi tugas, dimungkinkan untuk memetakan port host ke port kontainer. Namun, tidak seperti Docker, ECS tidak menyediakan cara untuk menentukan alamat IP host sebagai bagian dari pemetaan.
Sentuhan tambahan adalah bahwa saya ingin permintaan keluar dari wadah N untuk memiliki alamat IP eksternal wadah N.
Apakah ada cara untuk melakukan semua hal di atas?
Saya telah melihat melalui dokumentasi AWS CLI, serta AWS SDK untuk Java. Saya dapat melihat bahwa CLI dapat mengembalikan array networkBindings yang mengandung elemen-elemen seperti ini:
{
"bindIP": "0.0.0.0",
"containerPort": 8021,
"hostPort": 8021
},
dan Java SDK memiliki kelas bernama NetworkBinding yang mewakili informasi yang sama. Namun, info ini tampaknya hanya keluaran, sebagai tanggapan atas permintaan. Saya tidak dapat menemukan cara untuk memberikan informasi yang mengikat ini ke ECS.
Alasan saya ingin melakukan ini adalah karena saya ingin mengatur VM yang sama sekali berbeda untuk konstituensi yang berbeda, menggunakan wadah yang berbeda yang berpotensi pada instance EC2 yang sama. Setiap VM akan memiliki server web sendiri (termasuk sertifikat SSL yang berbeda), serta layanan FTP dan SSH sendiri.
Terima kasih.
sumber
aws ecs describe-container-instances
sepertinya tidak membantu. Mereka tampaknya benar-benar ingin mendorong Anda untuk menggunakan ELB, yang untuk kasus kami agak bodoh.Jawaban:
Satu opsi: Buat ELB untuk setiap klien, dan kemudian tetapkan wadah tertentu untuk setiap ELB.
[1] http://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-load-balancing.html
sumber
Inilah cara aktual dan logis untuk melakukannya. Kedengarannya terlalu rumit tetapi Anda benar-benar dapat mengimplementasikannya dalam hitungan menit, dan itu berfungsi. Saya sebenarnya mengimplementasikannya saat kita bicara.
Anda membuat tugas untuk setiap wadah, dan Anda membuat layanan untuk setiap tugas, ditambah dengan grup target untuk setiap layanan. Dan kemudian Anda membuat hanya 1 Penyeimbang Beban Elastis.
Penyeimbang beban elastis berbasis aplikasi dapat merutekan permintaan berdasarkan jalur yang diminta. Menggunakan grup target, Anda dapat merutekan permintaan yang datang
elb-domain.com/1
ke wadah 1,elb-domain.com/2
ke wadah 2, dll.Sekarang Anda tinggal selangkah lagi. Buat server proxy terbalik.
Dalam kasus saya, kami menggunakan nginx, sehingga Anda dapat membuat server nginx dengan IP sebanyak yang Anda inginkan, dan menggunakan kapabilitas proxy reverse nginx, Anda dapat merutekan IP ke jalur ELB Anda, yang kemudian mengarahkannya ke wadah yang benar (s). Berikut ini contoh jika Anda menggunakan domain.
Tentu saja, jika Anda benar-benar mendengarkan IP Anda dapat menghilangkan
server_name
garis dan hanya mendengarkan antarmuka yang sesuai.Ini sebenarnya lebih baik daripada menetapkan IP statis per kontainer karena ini memungkinkan Anda untuk memiliki cluster mesin buruh pelabuhan di mana permintaan diseimbangkan dengan cluster tersebut untuk masing-masing "IP" Anda. Menciptakan mesin tidak akan mempengaruhi IP statis dan Anda tidak perlu mengulang banyak konfigurasi.
Meskipun ini tidak sepenuhnya menjawab pertanyaan Anda karena itu tidak akan memungkinkan Anda untuk menggunakan FTP dan SSH, saya berpendapat bahwa Anda tidak boleh menggunakan Docker untuk melakukan itu, dan Anda harus menggunakan server cloud sebagai gantinya. Jika Anda menggunakan Docker, maka daripada memperbarui server menggunakan FTP atau SSH, Anda harus memperbarui wadah itu sendiri. Namun, untuk HTTP dan HTTPS, metode ini berfungsi dengan sempurna.
sumber
Anda tidak bisa ke wadah itu sendiri, tetapi Anda bisa membuat contoh EC2 yang didedikasikan untuk wadah tertentu. Lalu, di mana Anda perlu mengakses layanan itu, Anda bisa mereferensikan host EC2 yang menjalankan container.
Meskipun Anda masih berbicara langsung ke instance EC2, Anda dapat mengontrol IP wadah (secara tidak langsung) seperti yang Anda lakukan pada instance EC2. Ini menghemat Anda sakit kepala menjalankan layanan pada "bare metal" yang memungkinkan Anda untuk lebih mudah mengelola dan mengkonfigurasi layanan dan konfigurasi di dalamnya.
sumber