【问题标题】:How to communicate between two services in Fargate using docker compose如何使用 docker compose 在 Fargate 中的两个服务之间进行通信
【发布时间】:2022-01-13 22:38:42
【问题描述】:

我正在尝试在 AWS ECS (Fargate) 中托管 Elasticsearch 和 kibana。我创建了一个docker-compose.ym 文件

version: '2.2'
services:
  es-node:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.9.0
    deploy:
          resources:
            limits:
              memory: 8Gb
    command: > 
        bash -c 
          'bin/elasticsearch-plugin install analysis-smartcn https://github.com/medcl/elasticsearch-analysis-stconvert/releases/download/v7.9.0/elasticsearch-analysis-stconvert-7.9.0.zip;
          /usr/local/bin/docker-entrypoint.sh'
    container_name: es-$ENV
    environment:
      - node.name=es-$ENV
      - cluster.name=es-docker-cluster
      - discovery.type=single-node
      # - discovery.seed_hosts=es02,es03
      # - cluster.initial_master_nodes=es01,es02,es03
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - ELASTIC_PASSWORD=$ES_DB_PASSWORD
      - xpack.security.enabled=true
    logging:
      driver: awslogs
      options:
         awslogs-group: we-two-works-db-ecs-context
         awslogs-region: us-east-1
         awslogs-stream-prefix: es-node
    volumes:
      - elastic_data:/usr/share/elasticsearch/data
    ports:
      - 9200:9200
    networks:
      - elastic

  kibana-node:
    image: docker.elastic.co/kibana/kibana:7.9.0
    container_name: kibana-$ENV
    ports:
      - 5601:5601
    environment:
      ELASTICSEARCH_URL: $ES_DB_URL
      ELASTICSEARCH_HOSTS: '["http://es-$ENV:9200"]'
      ELASTICSEARCH_USERNAME: elastic
      ELASTICSEARCH_PASSWORD: $ES_DB_PASSWORD
    networks:
      - elastic
    logging:
      options:
        awslogs-group: we-two-works-db-ecs-context
        awslogs-region: us-east-1
        awslogs-stream-prefix: "kibana-node"

volumes: 
  elastic_data:
    driver_opts:
      performance-mode: maxIO
      throughput-mode: bursting
      uid: 0
      gid: 0

networks:
  elastic:
    driver: bridge

并使用.env.developmentfile 传入环境变量

ENV="development"

ES_DB_URL="localhost"
ES_DB_PORT=9200
ES_DB_USER="elastic"
ES_DB_PASSWORD="****"

在创建指向 ECS docker compose --env-file ./.env.development up 的 docker 上下文后,使用此命令在 ECS 中向上堆栈 但是,创建堆栈后,kibana 节点无法与 elasticsearch 节点建立通信。检查来自 kibana 节点容器的日志

{
    "type": "log",
    "@timestamp": "2021-12-09T02:07:04Z",
    "tags": [
        "warning",
        "plugins-discovery"
    ],
    "pid": 7,
    "message": "Expect plugin \"id\" in camelCase, but found: beats_management"
}
{
    "type": "log",
    "@timestamp": "2021-12-09T02:07:04Z",
    "tags": [
        "warning",
        "plugins-discovery"
    ],
    "pid": 7,
    "message": "Expect plugin \"id\" in camelCase, but found: triggers_actions_ui"
}
[BABEL] Note: The code generator has deoptimised the styling of /usr/share/kibana/x-pack/plugins/canvas/server/templates/pitch_presentation.js as it exceeds the max of 500KB.

经过研究,我发现 ecs cli 不支持service.networks docker compose file 字段,它给出了这些说明Communication between services is implemented by SecurityGroups within the application VPC.。我想知道如何在 docker-compose.yml 文件中设置这些指令,因为 IP 地址是在创建堆栈后分配的。

【问题讨论】:

    标签: elasticsearch docker-compose kibana amazon-ecs aws-fargate


    【解决方案1】:

    这些容器应该能够通过它们的组合服务名称相互通信。因此,例如 kibana 容器应该能够使用es-node 访问 ES 节点。我想这需要你设置ELASTICSEARCH_HOSTS: '["http://es-node:9200"]'?

    我也不确定ELASTICSEARCH_URL: $ES_DB_URL。我看到你设置了 ES_DB_URL="localhost" 但这意味着 kibana 容器将调用 localhost 以尝试访问 ES 服务(这可能适用于所有容器都在平面网络上运行的笔记本电脑,但这不是它的工作方式ECS - 每个组合服务都是一个单独的 ECS 服务)。

    [更新] 我对提供的撰写文件进行了抨击。请注意,我已经稍微简化了它以删除一些变量,例如 env 文件、日志记录条目(为什么需要它们?Compose/ECS 将为您创建日志记录基础设施)。

    这个文件对我有用(带有陷阱 - 见下文):

    services:
      es-node:
        image: docker.elastic.co/elasticsearch/elasticsearch:7.9.0
        deploy:
          resources:
            reservations:
              memory: 8Gb
        command: > 
            bash -c 
              'bin/elasticsearch-plugin install analysis-smartcn https://github.com/medcl/elasticsearch-analysis-stconvert/releases/download/v7.9.0/elasticsearch-analysis-stconvert-7.9.0.zip;
              /usr/local/bin/docker-entrypoint.sh'
        container_name: es-node
        environment:
          - node.name=es-node
          - cluster.name=es-docker-cluster
          - discovery.type=single-node
          - bootstrap.memory_lock=true
          - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
          - ELASTIC_PASSWORD=thisisawesome
          - xpack.security.enabled=true
        volumes:
          - elastic_data:/usr/share/elasticsearch/data
        ports:
          - 9200:9200
    
      kibana-node:
        image: docker.elastic.co/kibana/kibana:7.9.0
        deploy:
          resources:
            reservations:
              memory: 8Gb
        container_name: kibana-node
        ports:
          - 5601:5601
        environment:
          ELASTICSEARCH_URL: es-node
          ELASTICSEARCH_HOSTS: http://es-node:9200
          ELASTICSEARCH_USERNAME: elastic
          ELASTICSEARCH_PASSWORD: thisisawesome
    
    volumes: 
      elastic_data:
        driver_opts:
          performance-mode: maxIO
          throughput-mode: bursting
          uid: 0
          gid: 0
    

    我必须解决两个主要问题:

    1- kibana 任务需要更多马力(0.5 vCPU 和 512MB 内存 - 默认 - 是不够的)。我将内存设置为 8GB(将 CPU 设置为 1),然后 Kibana 容器出现了。

    2- 我必须为 ES 容器增加 ulimits。日志中的一些错误消息 pointed to max file opens 和 vm.max_map_count 都指向 ulimits 需要调整。对于 Fargate,您需要任务定义中的特殊部分。我知道有一种方法可以通过 overlays 将 CFN 代码嵌入到撰写文件中,但我发现将 docker compose convert 撰写到 CFN 文件中更容易/更快,并通过在图像下方添加此部分来调整它:

            "ulimits": [
              {
                "name": "nofile",
                "softLimit": 65535,
                "hardLimit": 65535
              }
            ]
    

    所以回顾一下,你需要把我上面的 convert 写到一个 CFN 文件中,添加 ulimits 剪切并直接在 CFN 中运行。

    您可以从这里向后工作以重新添加变量等。

    HTH

    【讨论】:

    • 我在更改ELASTICSEARCH_HOSTS: '["http://es-node:9200"] 后运行它,并按照此处的建议设置ELASTICSEARCH_URL:<service>.<compose_project_name>.local - link 在服务发现部分下。但问题似乎仍然存在。
    • 抱歉这个愚蠢的问题,但您实际上是在使用<service>.<compose_project_name>.local,还是用实际名称替换<service><compose_project_name>? (您的服务应该是es-node,默认情况下<compose_project_name> 是您从中启动组合命令的文件夹。
    • 鉴于它们在同一个组合中,我认为您可以省略<compose_project_name>.local,因为它是假设的。你可以试试ELASTICSEARCH_URL: 'es-node' 吗?
    • 不用担心,我已将它们替换为实际值。我会试试这个ELASTICSEARCH_URL: 'es-node' 看看效果如何。谢谢
    • 用“解决方法”编辑了我的答案
    猜你喜欢
    • 2020-09-04
    • 1970-01-01
    • 1970-01-01
    • 2019-11-20
    • 1970-01-01
    • 2018-09-07
    • 1970-01-01
    • 2020-05-17
    相关资源
    最近更新 更多