HAProxy Docker Container не может сбалансировать нагрузку между моими док-контейнерами Cockroach DB, используя localhost

У меня есть файл компоновки докеров, который содержит мой контейнер HAProxy и 3 контейнера Cockroach DB (CKDB). Все работают с хостом в сетевом режиме.

Я могу присоединиться к узлам CKDB, используя localhost и связанные с ними порты, но мой контейнер HAProxy не может получить доступ к узлам CKDB, используя «localhost». Если я использую IP-адрес хост-компьютера, он работает.

Является ли это ограничением для HAProxy или что-то не так с моими конфигурациями?

Вот файл конфигурации HAProxy:

global
  maxconn 4096

defaults
    mode                tcp
    timeout connect     10s
    timeout client      1m
    timeout server      1m
    option              clitcpka

frontend ckdb_nodes
    bind *:26257
    option tcplog
    option httpchk GET /health?ready=1
    mode tcp
    use_backend ckdb_nodes

backend ckdb_nodes
    mode tcp
    balance roundrobin
    option ssl-hello-chk
    server cockroach1 localhost:26254 check port 8081
    server cockroach2 localhost:26255 check port 8082
    server cockroach3 localhost:26256 check port 8083

frontend ckdb_admin_ui
    bind *:8080
    option tcplog
    mode tcp
    use_backend ckdb_admin_ui

backend ckdb_admin_ui
    mode tcp
    balance roundrobin
    option ssl-hello-chk
    server cockroach1 localhost:8081 check
    server cockroach2 localhost:8082 check
    server cockroach3 localhost:8083 check

Вот файл компоновки докера:

services:
  ckdb-e1-haproxy:
    image: ${IMAGE_STAGING_E1_HAPROXY}:${BUILD_VERSION_STATIC}
    ports:
      - ${COCKROACH_E1_HAPROXY_PORT}:${COCKROACH_E1_HAPROXY_PORT}
      - ${COCKROACH_ADMIN_UI_E1_HAPROXY_PORT}:${COCKROACH_ADMIN_UI_E1_HAPROXY_PORT}
    network_mode: "host"
    container_name: ${PROJECT}_ckdb-e1-haproxy
    depends_on:
      - ckdb-e1-node1
      - ckdb-e1-node2
      - ckdb-e1-node3

  ckdb-e1-node1:
    image: cockroachdb/cockroach:${CKDB_VERSION}
    command: start --certs-dir=${CKDB_CONTAINER_HOST_DIR} --port=${STAGING_E1_NODE1_CKDB_APP_PORT} --http-port=${STAGING_E1_NODE1_CKDB_ADMIN_UI_PORT}
    ports:
      - ${STAGING_E1_NODE1_CKDB_APP_PORT}:${STAGING_E1_NODE1_CKDB_APP_PORT}
      - ${STAGING_E1_NODE1_CKDB_ADMIN_UI_PORT}:${STAGING_E1_NODE1_CKDB_ADMIN_UI_PORT}
    volumes:
      - type: bind
        source: ${CKDB_STAGING_E1_CERTS_DIR}
        target: ${CONTAINER_CKDB_CERTS_PATH}
      - type: volume
        source: staging-app-db-data-e1-node1
        target: ${CONTAINER_CKDB_DATA_PATH}
    container_name: ${PROJECT}_ckdb-e1-node1
    network_mode: "host"

  ckdb-e1-node2:
    image: cockroachdb/cockroach:${CKDB_VERSION}
    command: start --certs-dir=${CKDB_CONTAINER_HOST_DIR} --port=${STAGING_E1_NODE2_CKDB_APP_PORT} --http-port=${STAGING_E1_NODE2_CKDB_ADMIN_UI_PORT} --join=localhost:${STAGING_E1_NODE1_CKDB_APP_PORT}
    ports:
      - ${STAGING_E1_NODE2_CKDB_APP_PORT}:${STAGING_E1_NODE2_CKDB_APP_PORT}
      - ${STAGING_E1_NODE2_CKDB_ADMIN_UI_PORT}:${STAGING_E1_NODE2_CKDB_ADMIN_UI_PORT}
    volumes:
      - type: bind
        source: ${CKDB_STAGING_E1_CERTS_DIR}
        target: ${CONTAINER_CKDB_CERTS_PATH}
      - type: volume
        source: staging-app-db-data-e1-node2
        target: ${CONTAINER_CKDB_DATA_PATH}
    container_name: ${PROJECT}_ckdb-e1-node2
    depends_on:
      - ckdb-e1-node1
    network_mode: "host"

  ckdb-e1-node3:
    image: cockroachdb/cockroach:${CKDB_VERSION}
    command: start --certs-dir=${CKDB_CONTAINER_HOST_DIR} --port=${STAGING_E1_NODE3_CKDB_APP_PORT} --http-port=${STAGING_E1_NODE3_CKDB_ADMIN_UI_PORT} --join=localhost:${STAGING_E1_NODE1_CKDB_APP_PORT}
    ports:
      - ${STAGING_E1_NODE3_CKDB_APP_PORT}:${STAGING_E1_NODE3_CKDB_APP_PORT}
      - ${STAGING_E1_NODE3_CKDB_ADMIN_UI_PORT}:${STAGING_E1_NODE3_CKDB_ADMIN_UI_PORT}
    volumes:
      - type: bind
        source: ${CKDB_STAGING_E1_CERTS_DIR}
        target: ${CONTAINER_CKDB_CERTS_PATH}
      - type: volume
        source: staging-app-db-data-e1-node3
        target: ${CONTAINER_CKDB_DATA_PATH}
    container_name: ${PROJECT}_ckdb-e1-node3
    depends_on:
      - ckdb-e1-node1
      - ckdb-e1-node2
    network_mode: "host"


person tamanjoku    schedule 04.01.2019    source источник
comment
Я могу сказать вам, что это проблема конфигурации, потому что я могу с радостью запустить 3 узла тараканов и проксировать все на локальном хосте, и все будет работать. Однако этой информации недостаточно, чтобы действительно сказать, что не так. Если вы можете предоставить полную конфигурацию того, что работает и что не работает, я могу попытаться рассказать вам, в чем проблема.   -  person Alex Robinson    schedule 04.01.2019
comment
@AlexRobinson спасибо за ответ. Я добавил конфигурационный файл haproxy и докер, составленный с узлами ckdb и прокси-контейнером ha.   -  person tamanjoku    schedule 10.01.2019


Ответы (1)


Вот моя полная конфигурация для справки:

docker-compose.yml

version: '3.7'

networks:
  roachnet:
    driver: bridge

services:
  # CockroachDB Load Balancer
  crdb-lb:
    hostname: crdb-lb
    image: haproxy:2.0.7
    volumes: ['./crdb-lb.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro']
    networks: ["roachnet"]
    ports:
      - "26257:26257"
      - "8080:8080"
      - "8081:8081"
    links:
      - roach1
      - roach2
      - roach3

  # CockroachDB default topology - 3 nodes
  roach1:
    # see https://hub.docker.com/r/cockroachdb/cockroach/tags
    image: cockroachdb/cockroach:v19.1.5
    hostname: roach1
    networks:
      - roachnet
    volumes: ["./cockroach-data/roach1:/cockroach/cockroach-data"]
    command: "start --insecure --cache=.25 --max-sql-memory=.25"
    ulimits:
      nproc: 65535
      nofile:
        soft: 65535
        hard: 65535
  roach2:
    # see https://hub.docker.com/r/cockroachdb/cockroach/tags
    image: cockroachdb/cockroach:v19.1.5
    hostname: roach2
    networks: ["roachnet"]
    volumes: ["./cockroach-data/roach2:/cockroach/cockroach-data"]
    command: "start --insecure --join=roach1 --cache=.25 --max-sql-memory=.25"
    depends_on: ["roach1"]
    ulimits:
      nproc: 65535
      nofile:
        soft: 65535
        hard: 65535
  roach3:
    # see https://hub.docker.com/r/cockroachdb/cockroach/tags
    image: cockroachdb/cockroach:v19.1.5
    hostname: roach3
    networks: ["roachnet"]
    volumes: ["./cockroach-data/roach3:/cockroach/cockroach-data"]
    command: "start --insecure --join=roach1 --cache=.25 --max-sql-memory=.25"
    depends_on: ["roach1"]
    ulimits:
      nproc: 65535
      nofile:
        soft: 65535
        hard: 65535

И мой crdb-lb.cfg, который я сопоставляю через Docker comp, с haproxy.cfg:

global
    maxconn 4096
    nbproc 1
    nbthread 4

defaults
    mode                tcp
    # Timeout values should be configured for your specific use.
    # See: https://cbonte.github.io/haproxy-dconv/1.8/configuration.html#4-timeout%20connect
    timeout connect     10s
    timeout client      30m
    timeout server      30m
    # TCP keep-alive on client side. Server already enables them.
    option              clitcpka

listen cockroach-db
    bind :26257
    mode tcp
    balance roundrobin
    option httpchk GET /health?ready=1
    server roach1 roach1:26257 check port 8080
    server roach2 roach2:26257 check port 8080
    server roach3 roach3:26257 check port 8080

listen cockroach-ui
    bind :8080
    mode tcp
    balance roundrobin
    option httpchk GET /health
    server roach1 roach1:8080 check port 8080
    server roach2 roach2:8080 check port 8080
    server roach3 roach3:8080 check port 8080

listen stats
    bind :8081
    mode http
    stats enable
    stats hide-version
    stats realm Haproxy\ Statistics
    stats uri /

Перед подключением, конечно, убедитесь, что вы создали пользователя, с которым хотите подключиться. Вы можете легко получить оболочку, выполнив docker-compose exec roach1 ./cockroach sql --insecure, а затем создать оттуда свою базу данных и пользователя.

DROP DATABASE IF EXISTS mydb;
CREATE DATABASE mydb;
CREATE USER IF NOT EXISTS myuser;
GRANT ALL ON DATABASE mydb TO myuser;

Затем в моем приложении Golang я просто подключаюсь, нажимая localhost на порту 26257 следующим образом:

db, err := sql.Open("postgres", "postgresql://myuser@localhost:26257/mydb?sslmode=disable")
if err != nil {
    log.Fatal("error connecting to the database: ", err)
}
person Francesco Casula    schedule 30.10.2019