Amazon ECS (Docker): wadah yang mengikat ke alamat IP tertentu

24

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.

Markus R
sumber
Saya mengalami masalah yang sama dengan alur kerja kami. aws ecs describe-container-instancessepertinya tidak membantu. Mereka tampaknya benar-benar ingin mendorong Anda untuk menggunakan ELB, yang untuk kasus kami agak bodoh.
four43
Tampaknya ada satu cara untuk melakukannya sekarang (Q4 2017): stackoverflow.com/a/46577872/6309
VonC

Jawaban:

4

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

Adam Keck
sumber
13
Ca-ching! 18 dolar sebulan untuk satu ELB. Sekarang, siapa yang mau layanan mikro dengan ECS? aws.amazon.com/elasticloadbalancing/pricing
Knots
1
@ Knots kami memiliki masalah yang sama. Kemudian kami beralih ke Lambda + API Gateway dan biaya kami turun menjadi 10 sen.
grepe
Sekarang Anda dapat menggunakan ALB tunggal (bukan ELB klasik) untuk semua layanan Anda, bukan 1 per layanan. Mereka harus berada pada nama host yang berbeda atau jalur yang berbeda pada nama host.
AJ Brown
4

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/1ke wadah 1, elb-domain.com/2ke 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.

server {
    server_name domain1.com;
    listen 80;
    access_log /var/log/nginx/access.log vhost;
    location / {
        proxy_pass http://elb-domain.com/1;
    }
}

Tentu saja, jika Anda benar-benar mendengarkan IP Anda dapat menghilangkan server_namegaris 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.

Navigasi
sumber
1

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.

  • Buat gugus khusus untuk layanan Anda dengan persyaratan ini
  • Buat Instance EC2 AMI-Optimized menggunakan jenis instance yang Anda sukai
    • Pastikan untuk menetapkan contoh itu ke klaster di atas menggunakan opsi UserData seperti yang dijelaskan dalam panduan itu.
  • Buat TaskDefinition dengan NetworkMode diatur ke "jembatan" (sama seperti desktop Anda)
  • Buat Definisi Layanan dengan:
    • LaunchType diatur ke EC2
    • Cluster diatur ke cluster yang Anda buat di atas
    • Definisi tugas diatur ke definisi tugas yang Anda buat di atas
  • Tetapkan setiap grup keamanan ke instance EC2 seperti yang Anda lakukan sebaliknya.

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.

Patrick Twohig
sumber