Amazon ECS (นักเทียบท่า): เชื่อมโยงคอนเทนเนอร์ไปยังที่อยู่ IP เฉพาะ


24

ฉันกำลังเล่นกับ Amazon ECS (repackaging ของ Docker) และฉันพบว่ามีความสามารถ Docker หนึ่งที่ ECS ไม่ได้ให้ กล่าวคือฉันต้องการให้มีหลายคอนเทนเนอร์ที่ทำงานในอินสแตนซ์และมีคำขอเข้ามาในที่อยู่ IP 1 แผนที่ไปยังคอนเทนเนอร์ 1 และคำขอที่มาถึงที่อยู่ IP 2 แผนที่ไปยังคอนเทนเนอร์ 2 ฯลฯ

ใน Docker การผูกคอนเทนเนอร์กับที่อยู่ IP เฉพาะจะกระทำผ่าน:

docker run -p myHostIPAddr:80:8080 imageName command

อย่างไรก็ตามใน Amazon ECS ดูเหมือนจะไม่มีทางทำสิ่งนี้

ฉันได้ตั้งค่าอินสแตนซ์ EC2 ที่มีที่อยู่ IP หลายยืดหยุ่น เมื่อกำหนดค่าคอนเทนเนอร์เป็นส่วนหนึ่งของการกำหนดภารกิจคุณสามารถแมปพอร์ตโฮสต์กับพอร์ตคอนเทนเนอร์ได้ อย่างไรก็ตามแตกต่างจาก Docker, ECS ไม่ได้ให้วิธีการระบุที่อยู่ IP ของโฮสต์เป็นส่วนหนึ่งของการทำแผนที่

การบิดเพิ่มเติมคือฉันต้องการคำขอขาออกจากคอนเทนเนอร์ N ให้มีที่อยู่ IP ภายนอกของคอนเทนเนอร์ N

มีวิธีทำทั้งหมดข้างต้นหรือไม่

ฉันดูเอกสาร AWS CLI รวมถึง AWS SDK สำหรับ Java ฉันเห็นว่า CLI สามารถส่งคืนอาร์เรย์ networkBindings ที่มีองค์ประกอบดังนี้:

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

และ Java SDK มีคลาสชื่อ NetworkBinding ที่แสดงถึงข้อมูลเดียวกัน อย่างไรก็ตามข้อมูลนี้ดูเหมือนจะเป็นเอาต์พุตเท่านั้นเพื่อตอบสนองต่อคำขอ ฉันไม่สามารถหาวิธีให้ข้อมูลที่มีผลผูกพันนี้กับ ECS ได้

เหตุผลที่ฉันต้องการทำเช่นนี้คือฉันต้องการตั้งค่า VM ที่แตกต่างกันอย่างสิ้นเชิงสำหรับเขตเลือกตั้งที่แตกต่างกันโดยใช้คอนเทนเนอร์ต่าง ๆ ที่อาจเกิดขึ้นบนอินสแตนซ์ EC2 เดียวกัน แต่ละ VM จะมีเว็บเซิร์ฟเวอร์ของตัวเอง (รวมถึงใบรับรอง SSL ที่แตกต่างกัน) รวมถึงบริการ FTP และ SSH ของตนเอง

ขอบคุณ


ฉันมีปัญหาเดียวกันกับเวิร์กโฟลว์ของเรา aws ecs describe-container-instancesดูเหมือนจะไม่ช่วย ดูเหมือนว่าพวกเขาต้องการผลักดันให้คุณใช้ ELB ซึ่งในกรณีของเรานั้นโง่มาก
four43

ดูเหมือนจะมีวิธีหนึ่งที่จะทำตอนนี้ (ไตรมาสที่ 4 ปี 2560): stackoverflow.com/a/46577872/6309
VonC

คำตอบ:


4

ทางเลือกหนึ่ง: สร้าง ELB สำหรับแต่ละไคลเอนต์แล้วกำหนดคอนเทนเนอร์ที่แน่นอนให้กับแต่ละ ELB

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


13
ca-ชิง! 18 ดอลลาร์ต่อเดือนสำหรับหนึ่ง ELB ทีนี้ใครต้องการ Microservices ด้วย ECS? aws.amazon.com/elasticloadbalancing/pricing
Knots

1
@ น็อตเรามีปัญหาเดียวกัน จากนั้นเราเปลี่ยนไปที่ Lambda + API Gateway และค่าใช้จ่ายของเราลดลงเหลือ 10 เซนต์
grepe

ตอนนี้คุณสามารถใช้ ALB เดียว (แทนที่จะเป็น ELB แบบคลาสสิก) สำหรับบริการทั้งหมดของคุณมากกว่า 1 ต่อบริการ พวกเขาจะต้องอยู่ในชื่อโฮสต์ที่แตกต่างกันหรือเส้นทางที่แตกต่างกันในชื่อโฮสต์
AJ Brown

4

นี่คือวิธีการตรรกะที่เกิดขึ้นจริง มันฟังดูซับซ้อนเกินไป แต่คุณสามารถนำไปใช้งานได้จริงในเวลาไม่กี่นาทีและใช้งานได้ ฉันกำลังนำไปใช้จริงตามที่เราพูด

คุณสร้างงานสำหรับแต่ละคอนเทนเนอร์และคุณสร้างบริการสำหรับแต่ละงานควบคู่กับกลุ่มเป้าหมายสำหรับแต่ละบริการ จากนั้นคุณสร้างตัวโหลดบาลานซ์เพียง 1 ตัว

แอพลิเคชันโหลดบาลานเซอร์ยืดหยุ่นสามารถกำหนดเส้นทางการร้องขอตามเส้นทางที่ร้องขอ เมื่อใช้กลุ่มเป้าหมายคุณสามารถกำหนดเส้นทางคำขอที่จะมาelb-domain.com/1ถึงคอนเทนเนอร์ 1 elb-domain.com/2ไปยังคอนเทนเนอร์ 2 ฯลฯ

ตอนนี้คุณอยู่ห่างออกไปเพียงขั้นตอนเดียว สร้างพร็อกซีเซิร์ฟเวอร์ย้อนกลับ

ในกรณีของฉันเราใช้ nginx ดังนั้นคุณสามารถสร้างเซิร์ฟเวอร์ nginx ที่มี IP ได้มากเท่าที่คุณต้องการและใช้ความสามารถในการย้อนกลับของ nginx คุณสามารถกำหนดเส้นทาง IP ของคุณไปยังเส้นทางของ ELB ของคุณซึ่งตามเส้นทางไปยังคอนเทนเนอร์ที่ถูกต้อง (s) นี่คือตัวอย่างถ้าคุณใช้โดเมน

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

แน่นอนถ้าคุณกำลังฟัง IP จริง ๆ คุณสามารถละเว้นserver_nameบรรทัดและเพียงฟังอินเตอร์เฟสที่เกี่ยวข้อง

นี่ดีกว่าการกำหนด IP แบบสแตติกต่อคอนเทนเนอร์เนื่องจากช่วยให้คุณมีกลุ่มของเครื่องเทียบท่าที่คำขอมีความสมดุลกับคลัสเตอร์นั้นสำหรับ "IP" แต่ละตัวของคุณ การสร้างเครื่องใหม่ไม่ส่งผลกระทบต่อ IP คงที่และคุณไม่ต้องทำการกำหนดค่าซ้ำอีกมาก

แม้ว่าสิ่งนี้จะไม่ตอบคำถามของคุณอย่างเต็มที่เพราะมันไม่อนุญาตให้คุณใช้ FTP และ SSH แต่ฉันขอยืนยันว่าคุณไม่ควรใช้ Docker ทำเช่นนั้นและคุณควรใช้เซิร์ฟเวอร์คลาวด์แทน หากคุณใช้นักเทียบท่าดังนั้นแทนที่จะอัปเดตเซิร์ฟเวอร์โดยใช้ FTP หรือ SSH คุณควรอัปเดตคอนเทนเนอร์เอง อย่างไรก็ตามสำหรับ HTTP และ HTTPS วิธีนี้ทำงานได้อย่างสมบูรณ์


1

คุณไม่สามารถไปที่คอนเทนเนอร์ได้ แต่คุณสามารถสร้างอินสแตนซ์ EC2 สำหรับภาชนะที่เฉพาะเจาะจงได้ จากนั้นในกรณีที่คุณต้องการเข้าถึงบริการนั้นคุณสามารถอ้างอิงโฮสต์ EC2 ที่รันคอนเทนเนอร์ได้

  • สร้างคลัสเตอร์เฉพาะสำหรับบริการของคุณด้วยข้อกำหนดนี้
  • สร้างอินสแตนซ์ EC2 ที่ปรับให้เหมาะสมของ AMIโดยใช้ประเภทอินสแตนซ์ที่คุณต้องการ
    • ให้แน่ใจว่าได้กำหนดอินสแตนซ์นั้นให้กับคลัสเตอร์ด้านบนโดยใช้ตัวเลือก UserData ตามที่อธิบายไว้ในคู่มือนั้น
  • สร้าง TaskDefinition ด้วยNetworkModeตั้งค่าเป็น "bridge" (เหมือนกับเดสก์ท็อปของคุณ)
  • สร้างคำจำกัดความบริการด้วย:
    • LaunchType ถูกตั้งค่าเป็น EC2
    • ตั้งค่าคลัสเตอร์เป็นคลัสเตอร์ที่คุณสร้างไว้ด้านบน
    • นิยามภารกิจถูกตั้งค่าเป็นนิยามภารกิจที่คุณสร้างไว้ด้านบน
  • กำหนดกลุ่มความปลอดภัยให้กับอินสแตนซ์ EC2 ตามที่คุณต้องการ

แม้ว่าคุณจะยังคงพูดคุยกับอินสแตนซ์ EC2 โดยตรง แต่คุณสามารถควบคุม IP ของคอนเทนเนอร์ (ทางอ้อม) ได้เช่นเดียวกับอินสแตนซ์ EC2 สิ่งนี้จะช่วยให้คุณไม่ต้องปวดหัวกับการเรียกใช้บริการบน "โลหะเปลือย" ที่ช่วยให้คุณจัดการและกำหนดค่าบริการและการกำหนดค่าในนั้นได้ง่ายขึ้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.