Amazon ECS (Docker): liên kết container với địa chỉ IP cụ thể


24

Tôi đang chơi với Amazon ECS (đóng gói lại Docker) và tôi đang tìm thấy một khả năng Docker mà ECS dường như không cung cấp. Cụ thể, tôi muốn có nhiều container chạy trong một ví dụ và có các yêu cầu đến địa chỉ IP 1 ánh xạ tới container 1 và các yêu cầu đến địa chỉ IP 2 ánh xạ tới container 2, v.v.

Trong Docker, việc liên kết một container với một địa chỉ IP cụ thể được thực hiện thông qua:

docker run -p myHostIPAddr:80:8080 imageName command

Tuy nhiên, trong Amazon ECS, dường như không có cách nào để làm điều này.

Tôi đã thiết lập một phiên bản EC2 với nhiều địa chỉ IP đàn hồi. Khi cấu hình một container như một phần của định nghĩa tác vụ, có thể ánh xạ các cổng máy chủ thành các cổng container. Tuy nhiên, không giống như Docker, ECS không cung cấp cách chỉ định địa chỉ IP máy chủ như một phần của ánh xạ.

Một thay đổi nữa là tôi muốn các yêu cầu gửi đi từ container N có địa chỉ IP bên ngoài của container N.

Có cách nào để làm tất cả những điều trên không?

Tôi đã xem qua tài liệu AWS CLI, cũng như SDK AWS cho Java. Tôi có thể thấy rằng CLI có thể trả về một mảng NetworkBindings chứa các phần tử như thế này:

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

và SDK Java có một lớp có tên NetworkBinding đại diện cho cùng một thông tin. Tuy nhiên, thông tin này dường như chỉ ở đầu ra, đáp ứng yêu cầu. Tôi không thể tìm cách cung cấp thông tin ràng buộc này cho ECS.

Lý do mà tôi muốn làm điều này là vì tôi muốn thiết lập các VM hoàn toàn khác nhau cho các khu vực bầu cử khác nhau, sử dụng các thùng chứa khác nhau có khả năng trên cùng một thể hiện EC2. Mỗi VM sẽ có máy chủ web riêng (bao gồm các chứng chỉ SSL riêng biệt), cũng như dịch vụ FTP và SSH của riêng nó.

Cảm ơn.


Tôi có cùng một vấn đề với quy trình làm việc của chúng tôi. aws ecs describe-container-instancesdường như không giúp được gì Họ dường như thực sự muốn thúc đẩy bạn sử dụng ELB, đối với trường hợp của chúng tôi là loại ngớ ngẩn.
bốn43

Dường như có một cách để làm điều đó ngay bây giờ (Q4 2017): stackoverflow.com/a/46577872/6309
VonC

Câu trả lời:


4

Một tùy chọn: Tạo ELB cho mỗi khách hàng, sau đó chỉ định các thùng chứa nhất định cho từng ELB.

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


13
Ca-ching! 18 đô la một tháng cho một ELB. Bây giờ, ai muốn microservice với ECS? aws.amazon.com/elasticloadbalANCE/pricing
Knots

1
@Knots chúng tôi đã có cùng một vấn đề. Sau đó, chúng tôi chuyển sang Lambda + API Gateway và chi phí của chúng tôi giảm xuống còn 10 xu.
grepe

Bây giờ bạn có thể sử dụng một ALB duy nhất (thay vì ELB cổ điển) cho tất cả các dịch vụ của bạn thay vì 1 cho mỗi dịch vụ. Họ cần phải ở trên các tên máy chủ khác nhau hoặc các đường dẫn khác nhau trên tên máy chủ.
AJ Brown

4

Đây là một cách thực tế, hợp lý để làm điều đó. Nghe có vẻ quá phức tạp nhưng bạn thực sự có thể thực hiện nó trong vài phút và nó hoạt động. Tôi thực sự đang thực hiện nó khi chúng ta nói.

Bạn tạo một tác vụ cho mỗi vùng chứa và bạn tạo một dịch vụ cho từng tác vụ, cùng với một nhóm mục tiêu cho mỗi dịch vụ. Và sau đó bạn tạo chỉ 1 Cân bằng tải đàn hồi.

Bộ cân bằng tải đàn hồi dựa trên ứng dụng có thể định tuyến các yêu cầu dựa trên đường dẫn được yêu cầu. Sử dụng các nhóm mục tiêu, bạn có thể định tuyến các yêu cầu đến vùng elb-domain.com/1chứa 1, elb-domain.com/2đến vùng chứa 2, v.v.

Bây giờ bạn chỉ còn một bước nữa. Tạo một máy chủ proxy ngược.

Trong trường hợp của tôi, chúng tôi đang sử dụng nginx, vì vậy bạn có thể tạo một máy chủ nginx có nhiều IP như bạn muốn và sử dụng khả năng ủy quyền ngược của nginx, bạn có thể định tuyến IP của mình đến các đường dẫn ELB của mình, theo đó định tuyến chúng đến đúng container (S). Đây là một ví dụ nếu bạn đang sử dụng tên miền.

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

Tất nhiên, nếu bạn thực sự nghe IP, bạn có thể bỏ qua server_namedòng và chỉ nghe các giao diện tương ứng.

Điều này thực sự tốt hơn so với việc gán IP tĩnh cho mỗi container vì nó cho phép bạn có các cụm máy docker nơi các yêu cầu được cân bằng trên cụm đó cho mỗi "IP" của bạn. Việc tạo lại một máy không ảnh hưởng đến IP tĩnh và bạn không phải làm lại nhiều cấu hình.

Mặc dù điều này không trả lời đầy đủ câu hỏi của bạn vì nó sẽ không cho phép bạn sử dụng FTP và SSH, nhưng tôi cho rằng bạn không bao giờ nên sử dụng Docker để làm điều đó và thay vào đó bạn nên sử dụng máy chủ đám mây. Nếu bạn đang sử dụng Docker, thì thay vì cập nhật máy chủ bằng FTP hoặc SSH, bạn nên tự cập nhật vùng chứa. Tuy nhiên, đối với HTTP và HTTPS, phương pháp này hoạt động hoàn hảo.


1

Bạn không thể tự chứa container, nhưng bạn có thể tạo một thể hiện EC2 dành riêng cho một container cụ thể. Sau đó, nơi bạn cần truy cập dịch vụ đó, bạn có thể tham khảo máy chủ EC2 đang chạy container.

  • Tạo một cụm dành riêng cho các dịch vụ của bạn với yêu cầu này
  • Tạo sơ đồ EC2 được tối ưu hóa AMI bằng cách sử dụng loại thể hiện ưa thích của bạn
    • Đảm bảo gán thể hiện đó cho cụm trên bằng tùy chọn UserData như được mô tả trong hướng dẫn đó.
  • Tạo một Nhiệm vụ xác định với NetworkMode được đặt thành "cầu nối" (giống như máy tính để bàn của bạn)
  • Tạo định nghĩa dịch vụ với:
    • LaunchType được đặt thành EC2
    • Cụm được đặt thành cụm bạn đã tạo ở trên
    • Định nghĩa tác vụ được đặt thành định nghĩa tác vụ bạn đã tạo ở trên
  • Chỉ định bất kỳ nhóm bảo mật nào cho thể hiện EC2 như bạn muốn.

Mặc dù bạn vẫn đang nói chuyện trực tiếp với một thể hiện EC2, bạn có thể điều khiển IP của vùng chứa (một cách gián tiếp) như đối tượng EC2. Điều này giúp bạn không phải đau đầu khi chạy các dịch vụ trên "kim loại trần" cho phép bạn dễ dàng quản lý và định cấu hình dịch vụ cũng như cấu hình trong đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.