【问题标题】:resolve service hostname in ECS fargate task在 ECS fargate 任务中解析服务主机名
【发布时间】:2021-08-22 09:25:45
【问题描述】:

我正在尝试使用 terraform 自动化我的 ECS fargate 集群制作。

我有一个带有微服务容器化的 SpringBoot 项目,我将这些图像放在单个任务定义中,用于后端的 ECS 服务。

ECS 集群最初正在运行,但 Kafka 因错误而停止:

ERROR Unable to resolve address: zookeeper:2181
(org.apache.zookeeper.client.StaticHostProvider)

我已经为 zookeeper(bitnami) 提供了图像,并且也使用了 KAFKA_CFG_ZOOKEEPER_CONNECT 环境变量。

编辑:我的任务定义:

resource "aws_ecs_task_definition" "this" {
  family                   = local.application_name
  requires_compatibilities = [local.launch_type]
  execution_role_arn       = data.aws_iam_role.ecs_task_execution_role.arn
  network_mode             = "awsvpc"
  cpu                      = "4096"
  memory                   = "30720"
  container_definitions = jsonencode([
    {
      name      = "zookeeper"
      image     = "docker.io/bitnami/zookeeper:latest"
      essential = true
      cpu       = 512
      memory    = 1024
      portMappings = [
        {
          containerPort = 2181
          hostPort      = 2181
        }
      ]
      "environment" : [
        { "name" : "ALLOW_ANONYMOUS_LOGIN", "value" : "yes" },
        { "name" : "ZOO_LISTEN_ALLIPS_ENABLED", "value" : "yes" }
      ]
    },
    {
      name      = "kafka-server"
      image     = "docker.io/bitnami/kafka:latest"
      essential = true
      cpu       = 512
      memory    = 1024
      portMappings = [
        {
          containerPort = 9092
          hostPort      = 9092
        }
      ]
      depends_on =  [
        "zookeeper"
      ]
      "environment" : [
        { "name" : "KAFKA_CFG_ZOOKEEPER_CONNECT", "value" : "zookeeper:2181" },
        { "name" : "ALLOW_ANONYMOUS_LOGIN", "value" : "yes" },
        { "name" : "ALLOW_PLAINTEXT_LISTENER", "value" : "yes" }
      ],
    },
    {
      name      = "email-service"
      image     = "my-email-image"
      essential = true
      cpu       = 512
      memory    = 1024
      portMappings = [
        {
          containerPort = 8090
          hostPort      = 8090
        }
      ]
      "environment" : [
        { "name" : "EMAIL_URL", "value" : "email-service" },
        { "name" : "EMAIL_PORT", "value" : "8090" },
        { "name" : "KAFKA_URL", "value" : "kafka-server" },
        { "name" : "KAFKA_PORT", "value" : "9092" },
      ]
    }
  ])
}

【问题讨论】:

  • 如果您给出这样的名称,它使用的是 DNS。我认为您应该将 zookeeper 更改为 zookeeper 部署的 FQDN。我怀疑它只是动物园管理员。你能分享你的任务定义吗?
  • @TheFool 我在问题编辑中包含了任务定义,我想我可能错误地使用了depends_on,但在terraform plan 中没有收到任何错误。
  • 您的问题可能是您将网络模式设置为awsvpc。如果您这样做,我不确定您是否可以再简单地使用这样的服务名称。您可以尝试将其设置为bridge 一次,看看它是否有效?然后你至少知道在哪里寻找进一步的配置,如果是这样的话。 docs.aws.amazon.com/AmazonECS/latest/developerguide/…
  • 我认为这句话是关键:“另外,属于同一个任务的容器可以通过localhost接口进行通信。”你可以尝试将KAFKA_CFG_ZOOKEEPER_CONNECT设置为localhost:2181 ? docs.aws.amazon.com/AmazonECS/latest/userguide/…
  • 具体要求是什么?就像我说的,数据不是持久的,所以你不妨只使用 Spring 的内部 EventListener 类或其他一些嵌入式事件总线库

标签: amazon-web-services docker terraform amazon-ecs aws-fargate


【解决方案1】:

如写在documentation:

此外,属于同一任务的容器可以通过 localhost 接口进行通信。

所以我的建议是使用 localhost 而不是服务名称。例如,您希望为 Kafka 以及每个其他服务(例如电子邮件服务)这样做。

{ "name" : "KAFKA_CFG_ZOOKEEPER_CONNECT", "value" : "localhost:2181" },

【讨论】:

    猜你喜欢
    • 2018-07-26
    • 2022-07-18
    • 1970-01-01
    • 2019-09-10
    • 2019-08-22
    • 2019-09-25
    • 1970-01-01
    • 2021-12-10
    • 2019-11-26
    相关资源
    最近更新 更多