簡體   English   中英

使用 AWS ECS 服務和 Elastic LoadBalancer 向多個公共端口公開

[英]Exposing to public more than 1 port with AWS ECS service and Elastic LoadBalancer

我有暴露多個端口的服務,它與 kubernetes 配合良好,但現在我們將其移至 AWS ECS。 似乎我只能通過負載均衡器公開端口,即使 docker 定義了多個端口,我也僅限於每個服務/任務 1 個端口,我必須選擇一個端口

在此處輸入圖像描述

Add to load balancer按鈕允許添加一個端口。 一旦添加,就沒有添加第二個端口的按鈕。

有沒有比制作第二個代理服務來公開第二個端口更好的解決方法?

更新:我使用基於 Fargate 的服務。

您不需要任何解決方法,AWS ECS 現在支持同一 ECS 服務中的多個目標組。 這對於您想要公開容器的多個端口的用例很有幫助。

目前,如果您要創建指定多個目標組的服務,您必須使用 Amazon ECS API、開發工具包、AWS CLI 或 AWS CloudFormation 模板創建服務。 創建服務后,您可以使用 AWS 管理控制台查看服務和注冊到該服務的目標組。

例如,Jenkins 容器可能會為 Jenkins Web 界面公開端口 8080,為 API 公開端口 50000。

參考:

https://docs.aws.amazon.com/AmazonECS/latest/developerguide/register-multiple-targetgroups.html

https://aws.amazon.com/about-aws/whats-new/2019/07/amazon-ecs-services-now-support-multiple-load-balancer-target-groups/

更新:我能夠使用 Terraform 配置目標組,但到目前為止還沒有在 AWS 控制台上找到這個選項。

resource "aws_ecs_service" "multiple_target_example" {
  name            = "multiple_target_example1"
  cluster         = "${aws_ecs_cluster.main.id}"
  task_definition = "${aws_ecs_task_definition.with_lb_changes.arn}"
  desired_count   = 1
  iam_role        = "${aws_iam_role.ecs_service.name}"

  load_balancer {
    target_group_arn = "${aws_lb_target_group.target2.id}"
    container_name   = "ghost"
    container_port   = "3000"
  }

  load_balancer {
    target_group_arn = "${aws_lb_target_group.target2.id}"
    container_name   = "ghost"
    container_port   = "3001"
  }

  depends_on = [
    "aws_iam_role_policy.ecs_service",
  ]
}

版本說明:Terraform AWS Provider 版本 2.22.0 中添加了多個 load_balancer 配置塊支持。

ecs_service_terraform

我不能說這將是一個很好的解決方法,但我正在從事一個項目,我需要使用 AWS ECS 運行 Ejabberd,但是在將服務端口綁定到負載均衡器時發生了同樣的問題。

我正在使用 terraform,由於 AWS ECS 的這一限制,我們同意每個實例運行一個容器來解決端口問題,因為我們應該公開兩個端口。

如果您不想為容器分配動態端口,並且希望每個實例運行一個容器,那么該解決方案肯定會奏效。

  1. 創建目標組並指定容器的第二個端口。

  2. 轉到 ECS 集群的 AutoScalingGroups

  3. 在 ECS 集群的 Autoscaling 組中編輯並添加新創建的目標組

因此,如果您擴展到兩個容器,則意味着將有兩個實例,因此新啟動的實例將注冊到第二個目標組,而 Autoscaling 組會處理它。 這種方法在我的情況下工作正常,但需要考慮的事情很少。

不要在target中綁定主端口,最好在ALB服務中綁定主端口。 這種方法的主要優點是,如果您的容器未能響應 AWS 健康檢查,容器將自動重新啟動。 由於目標組健康檢查不會重新創建您的容器。

當 Docker 容器中存在動態端口公開時,這種方法將不起作用。

AWS 應更新其 ECS 代理以處理此類情況。

我在為每個實例創建多個容器時遇到了這個問題,第二個容器沒有出現,因為它使用了任務定義中定義的相同端口。

我們所做的是,在這些容器之上創建了一個應用程序負載均衡器並刪除了硬編碼端口。 當應用程序負載均衡器沒有在它下面獲得預定義的端口時,它會做什么,使用動態端口映射的功能。 容器將出現在隨機端口上並駐留在一個目標組中,負載均衡器將自動將請求發送到這些端口。

可以在此處找到更多詳細信息

感謝 mohit 的回答,我使用 AWS CLI 將多個目標組(多個端口)注冊到一個 ECS 服務中:

ecs-sample-service.json

{
    "serviceName": "sample-service",
    "taskDefinition": "sample-task",
    "loadBalancers":[
      {  
         "targetGroupArn":"arn:aws:elasticloadbalancing:us-west-2:0000000000:targetgroup/sample-target-group/00000000000000",
         "containerName":"faktory",
         "containerPort":7419
      },
      {  
         "targetGroupArn":"arn:aws:elasticloadbalancing:us-west-2:0000000000:targetgroup/sample-target-group-web/11111111111111",
         "containerName":"faktory",
         "containerPort":7420
      }
   ],
    "desiredCount": 1
}
aws ecs create-service --cluster sample-cluster --service-name sample-service --cli-input-json file://ecs-sample-service.json --network-configuration "awsvpcConfiguration={subnets=[subnet-0000000000000],securityGroups=[sg-00000000000000],assignPublicIp=ENABLED}" --launch-type FARGATE
  1. 如果任務需要 Internet 訪問來提取圖像,請確保subnet-0000000000000具有 Internet 訪問權限。
  2. 安全組sg-00000000000000需要給予相關端口入站訪問權限。 (在本例中為 7419 和 7420)。
  3. 如果流量僅來自 ALB,則任務不需要 public IP。 然后assignPublicIp可以是false

通常,我通過創建任務定義、目標組並將它們附加到應用程序負載均衡器來使用 AWS CLI 方法本身。 但問題是,當有多個服務要完成時,這是一項耗時的任務,所以我會使用 terraform 來創建這樣的服務

terraform 模塊鏈接這是采用 Fargate 部署的多端口 ECS 服務。 目前,這僅支持 2 個端口。 當使用 sockets 的多端口時,此套接字不會發送任何響應,因此運行狀況檢查可能會失敗。 所以要解決這個問題,我會將目標組中的端口覆蓋到其他端口並修復它。

希望這可以幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM