Amazon ECS (Docker): belirli bir IP adresine bağlama kabı


24

Amazon ECS ile oynuyorum (Docker'ın yeniden paketlenmesi) ve ECS'nin sağlamadığı bir Docker yeteneği olduğunu buluyorum. Yani, bir örnekte birden fazla konteynerin çalışmasını ve IP adresi 1 eşlemesini konteyner 1'e gelmesini talep ediyorum ve IP adresi 2'ye eşleştirmeyi talep ediyorum, konteyner 2'ye vs.

Docker'da, bir konteynerin belirli bir IP adresine bağlanması şu şekilde yapılır:

docker run -p myHostIPAddr:80:8080 imageName command

Ancak, Amazon ECS'de bunu yapmanın bir yolu yok gibi görünüyor.

Birden fazla Elastik IP adresi olan bir EC2 örneği kurdum. Bir kabı görev tanımının bir parçası olarak yapılandırırken, ana bilgisayar bağlantı noktalarını taşıyıcı bağlantı noktalarıyla eşleştirmek mümkündür. Bununla birlikte, Docker'dan farklı olarak ECS, ana bilgisayar IP adresini eşlemenin bir parçası olarak belirtmenin bir yolunu sunmaz.

Ek bir bükülme, N kapsayıcısının dış taleplerinin N kapsayıcısının dış IP adresine sahip olmasını istememdir.

Yukarıdakilerin hepsini yapmanın bir yolu var mı?

AWS CLI belgelerine ve Java için AWS SDK'ya baktım. CLI'nin bunun gibi öğeleri içeren bir networkBindings dizisi döndürdüğünü görebiliyorum:

{
  "bindIP": "0.0.0.0", 
  "containerPort": 8021, 
  "hostPort": 8021
},

ve Java SDK, aynı bilgiyi temsil eden NetworkBinding adında bir sınıfa sahiptir. Ancak, bir talebe cevaben bu bilgi sadece çıktı olarak görünmektedir. ECS'ye bu bağlayıcı bilgiyi sağlamanın bir yolunu bulamıyorum.

Bunu yapmak istememin nedeni, aynı EC2 örneğinde potansiyel olarak farklı kaplar kullanarak farklı seçmenler için tamamen farklı sanal makineler kurmak istemem. Her VM kendi web sunucusuna (farklı SSL sertifikaları dahil) ve kendi FTP ve SSH servisine sahip olacaktır.

Teşekkürler.


İş akışımızda da aynı sorunu yaşıyorum. aws ecs describe-container-instancesyardımcı görünmüyor. Sizi gerçekten bir aptal olan bir ELB kullanmaya zorlamak istiyorlar gibi görünüyor.
four43

Şimdi yapmanın bir yolu var (Q4 2017): stackoverflow.com/a/46577872/6309
VonC

Yanıtlar:


4

Bir seçenek: Her müşteri için bir ELB oluşturun ve ardından her bir ELB'ye belirli kapsayıcılar atayın.

[1] http://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-load-balancing.html


13
Ca paralar! Bir ELB için ayda 18 dolar. Şimdi, kim ECS ile mikro hizmet almak ister? aws.amazon.com/elasticloadbalancing/pricing
Knots

1
@Knots aynı problemi yaşadık. Sonra Lambda + API Gateway'e geçtik ve maliyetimiz 10 kuruşa düştü.
grepe

Artık hizmet başına 1 yerine, tüm hizmetleriniz için tek bir ALB (klasik ELB'ler yerine) kullanabilirsiniz. Farklı ana bilgisayar adlarında veya ana bilgisayar adındaki farklı yollarda olmaları gerekir.
AJ Brown

4

İşte bunu yapmanın gerçek ve mantıklı bir yolu. Kulağa çok karışık geliyor ama aslında birkaç dakika içinde uygulayabilirsiniz ve işe yarıyor. Aslında konuştuğumuz gibi uyguluyorum.

Her kap için bir görev oluşturuyorsunuz ve her bir hizmet için bir hedef grupla birlikte her bir iş için bir hizmet oluşturuyorsunuz. Ve sonra sadece 1 Elastik Yük Dengeleyici yaratırsınız.

Uygulamaya dayalı elastik yük dengeleyiciler, talep edilen yola göre talepleri yönlendirebilir. Hedef grupları kullanarak, elb-domain.com/1konteyner 1'e, elb-domain.com/2konteyner 2'ye vb. Gelen istekleri yönlendirebilirsiniz .

Şimdi sadece bir adım uzaktasınız. Ters bir proxy sunucusu oluşturun.

Benim durumumda nginx kullanıyoruz, böylece istediğiniz kadar IP’ye sahip bir nginx sunucusu oluşturabilir ve nginx’in ters proxy özelliğini kullanarak IP’lerinizi ELB’in yollarına yönlendirebilirsiniz; (s). Etki alanları kullanıyorsanız, bir örnek.

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

Tabii ki, aslında IP'leri dinliyorsanız, server_namesatırı atlayabilir ve sadece ilgili arayüzleri dinleyebilirsiniz.

Bu aslında konteyner başına statik bir IP atamaktan daha iyidir, çünkü isteklerinizi "IP" lerinizin her biri için o küme üzerinde dengede tutulan docker makineleri kümelerine sahip olmanızı sağlar. Bir makineyi yeniden oluşturmak statik IP'yi etkilemez ve çok fazla yapılandırma yapmanız gerekmez.

Her ne kadar FTP ve SSH kullanmanıza izin vermediğinden sorunuzu tam olarak cevaplamamasına rağmen, Docker'ı asla bunun için kullanmamalısınız ve bunun yerine bulut sunucularını kullanmalısınız. Docker kullanıyorsanız, sunucuyu FTP veya SSH kullanarak güncellemek yerine, kabın kendisini güncellemelisiniz. Ancak, HTTP ve HTTPS için bu yöntem mükemmel çalışıyor.


1

Konteynırın kendisine yapamazsınız, ancak belirli bir konteynere adanmış bir EC2 örneği yapabilirsiniz. Ardından, bu hizmete erişmeniz gereken yerde, kabı çalıştıran EC2 sunucusuna başvurabilirsiniz.

  • Bu gereksinim ile hizmetleriniz için özel bir küme oluşturun
  • Tercih ettiğiniz örnek türünü kullanarak bir AMI Optimize EC2 Örneği oluşturun
    • Bu örneği, bu kılavuzda açıklanan şekilde UserData seçeneğini kullanarak yukarıdaki kümeye atadığınızdan emin olun.
  • NetworkMode ile "Köprü" (masaüstünüzle aynı) ayarlanmış bir Görev Tanımı oluşturun
  • Şununla bir Servis Tanımı oluşturun:
    • LaunchType EC2 olarak ayarlandı
    • Küme yukarıda oluşturduğunuz kümeye ayarlanmış
    • Görev tanımı yukarıda oluşturduğunuz görev tanımına ayarlandı
  • Herhangi bir güvenlik grubunu EC2 örneğine, aksi şekilde olduğu gibi atayın.

Hala doğrudan bir EC2 örneğiyle konuşsanız da, kabın IP'sini (dolaylı olarak) EC2 örneğinde olduğu gibi kontrol edebilirsiniz. Bu, hizmetleri "çıplak metal" üzerinde çalıştırmanın baş ağrısından tasarruf etmenizi sağlar; hizmeti ve yapılandırmayı daha kolay yönetmenizi ve yapılandırmanızı sağlar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.