Как запустить контейнер докера Кассандры от кочевника? - PullRequest
0 голосов
/ 06 декабря 2018

Я хочу запустить контейнер кассандры из кочевого задания.Кажется, что он запускается, но через несколько секунд он умирает (кажется, что его убил сам кочевник).

Если я запускаю контейнер из командной строки, с помощью:

docker run --name some-cassandra -p 9042:9042 -d cassandra:3.0

контейнер начинается без нареканий.Но если я создам кочевую работу, подобную этой:

job "cassandra" {

  datacenters = ["dc1"]

  type = "service"

  update {
    max_parallel = 1
    min_healthy_time = "10s"
    healthy_deadline = "5m"
    progress_deadline = "10m"
    auto_revert = false
    canary = 0
  }

  migrate {
    max_parallel = 1
    health_check = "checks"
    min_healthy_time = "10s"
    healthy_deadline = "5m"
  }

  group "cassandra" {
    restart {
      attempts = 2
      interval = "240s"
      delay = "120s"
      mode = "delay"
    }

    task "cassandra" {
      driver = "docker"

      config {
        image = "cassandra:3.0"
        network_mode = "bridge"
        port_map {
          cql = 9042
        }
      }

      resources {
        memory = 2048
        cpu = 800
        network {
          port "cql" {}
        }
      }

      env {
        CASSANDRA_LISTEN_ADDRESS = "${NOMAD_IP_cql}"
      }

      service {
        name = "cassandra"
        tags = ["global", "cassandra"]
        port = "cql"
      }
    }
  }
}

Тогда она никогда не запустится.Веб-интерфейс кочевника ничего не показывает в журналах stdout созданного размещения, а поток stdin показывает только Killed .

Я знаю, чтоПо мере того, как это происходит, контейнеры Docker создаются и удаляются через несколько секунд.Я не могу прочитать журналы этих контейнеров, потому что когда я пытаюсь (с docker logs <container_id>), все, что я получаю, это:

Error response from daemon: configured logging driver does not support reading

И обзор распределения показывает это сообщение:

12/06/18 14:16:04   Terminated  Exit Code: 137, Exit Message: "Docker container exited with non-zero exit code: 137"

Согласно docker :

Если при запуске контейнера база данных не инициализирована, будет создана база данных по умолчанию.Хотя это ожидаемое поведение, это означает, что он не будет принимать входящие соединения, пока такая инициализация не завершится.Это может вызвать проблемы при использовании средств автоматизации, таких как docker-compose, которые запускают несколько контейнеров одновременно.

Но я сомневаюсь, что это источник моей проблемы, потому что я увеличил restartзначения stanza без эффекта, и потому что задача не выполняется через несколько секунд.

Не так давно у меня возникла несколько похожая проблема с контейнером kafka, который, оказывается, не был счастлив, потому чтоон хотел больше памяти.Но в этом случае я предоставил щедрые значения для памяти и для процессора в разделе resources, и это, похоже, не имеет никакого значения.

Моя хост-операционная система - Arch Linux с ядром 4.19.4-arch1-1-ARCH.Я использую консул в качестве службы systemd и агент кочевника с этой командной строкой:

sudo nomad agent -dev

Что я могу упустить?Мы будем благодарны за любую помощь и / или указатели.

Обновление (2018-12-06 16:26 GMT) : при детальном чтении вывода агента кочевника я получаю, что некоторыеценную информацию можно прочитать в директории хоста /tmp.Фрагмент этого вывода:

    2018/12/06 16:03:03 [DEBUG] memberlist: TCP connection from=127.0.0.1:45792
    2018/12/06 16:03:03.180586 [DEBUG] driver.docker: docker pull cassandra:latest succeeded
2018-12-06T16:03:03.184Z [DEBUG] plugin: starting plugin: path=/usr/bin/nomad args="[/usr/bin/nomad executor {"LogFile":"/tmp/NomadClient073551030/1c315bf2-688c-2c7b-8d6f-f71fec1254f3/cassandra/executor.out","LogLevel":"DEBUG"}]"
2018-12-06T16:03:03.185Z [DEBUG] plugin: waiting for RPC address: path=/usr/bin/nomad
2018-12-06T16:03:03.235Z [DEBUG] plugin.nomad: plugin address: timestamp=2018-12-06T16:03:03.235Z address=/tmp/plugin681788273 network=unix
    2018/12/06 16:03:03.253166 [DEBUG] driver.docker: Setting default logging options to syslog and unix:///tmp/plugin559865372
    2018/12/06 16:03:03.253196 [DEBUG] driver.docker: Using config for logging: {Type:syslog ConfigRaw:[] Config:map[syslog-address:unix:///tmp/plugin559865372]}
    2018/12/06 16:03:03.253206 [DEBUG] driver.docker: using 2147483648 bytes memory for cassandra
    2018/12/06 16:03:03.253217 [DEBUG] driver.docker: using 800 cpu shares for cassandra
    2018/12/06 16:03:03.253237 [DEBUG] driver.docker: binding directories []string{"/tmp/NomadClient073551030/1c315bf2-688c-2c7b-8d6f-f71fec1254f3/alloc:/alloc", "/tmp/NomadClient073551030/1c315bf2-688c-2c7b-8d6f-f71fec1254f3/cassandra/local:/local", "/tmp/NomadClient073551030/1c315bf2-688c-2c7b-8d6f-f71fec1254f3/cassandra/secrets:/secrets"} for cassandra
    2018/12/06 16:03:03.253282 [DEBUG] driver.docker: allocated port 127.0.0.1:29073 -> 9042 (mapped)
    2018/12/06 16:03:03.253296 [DEBUG] driver.docker: exposed port 9042
    2018/12/06 16:03:03.253320 [DEBUG] driver.docker: setting container name to: cassandra-1c315bf2-688c-2c7b-8d6f-f71fec1254f3
    2018/12/06 16:03:03.361162 [INFO] driver.docker: created container 29b0764bd2de69bda6450ebb1a55ffd2cbb4dc3002f961cb5db71b323d611199
    2018/12/06 16:03:03.754476 [INFO] driver.docker: started container 29b0764bd2de69bda6450ebb1a55ffd2cbb4dc3002f961cb5db71b323d611199
    2018/12/06 16:03:03.757642 [DEBUG] consul.sync: registered 1 services, 0 checks; deregistered 0 services, 0 checks
    2018/12/06 16:03:03.765001 [DEBUG] client: error fetching stats of task cassandra: stats collection hasn't started yet
    2018/12/06 16:03:03.894514 [DEBUG] client: updated allocations at index 371 (total 2) (pulled 0) (filtered 2)
    2018/12/06 16:03:03.894584 [DEBUG] client: allocs: (added 0) (removed 0) (updated 0) (ignore 2)
    2018/12/06 16:03:05.190647 [DEBUG] driver.docker: error collecting stats from container 29b0764bd2de69bda6450ebb1a55ffd2cbb4dc3002f961cb5db71b323d611199: io: read/write on closed pipe
2018-12-06T16:03:09.191Z [DEBUG] plugin.nomad: 2018/12/06 16:03:09 [ERR] plugin: plugin server: accept unix /tmp/plugin681788273: use of closed network connection
2018-12-06T16:03:09.194Z [DEBUG] plugin: plugin process exited: path=/usr/bin/nomad
    2018/12/06 16:03:09.223734 [INFO] client: task "cassandra" for alloc "1c315bf2-688c-2c7b-8d6f-f71fec1254f3" failed: Wait returned exit code 137, signal 0, and error Docker container exited with non-zero exit code: 137
    2018/12/06 16:03:09.223802 [INFO] client: Restarting task "cassandra" for alloc "1c315bf2-688c-2c7b-8d6f-f71fec1254f3" in 2m7.683274502s
    2018/12/06 16:03:09.230053 [DEBUG] consul.sync: registered 0 services, 0 checks; deregistered 1 services, 0 checks
    2018/12/06 16:03:09.233507 [DEBUG] consul.sync: registered 0 services, 0 checks; deregistered 0 services, 0 checks
    2018/12/06 16:03:09.296185 [DEBUG] client: updated allocations at index 372 (total 2) (pulled 0) (filtered 2)
    2018/12/06 16:03:09.296313 [DEBUG] client: allocs: (added 0) (removed 0) (updated 0) (ignore 2)
    2018/12/06 16:03:11.541901 [DEBUG] http: Request GET /v1/agent/health?type=client (452.678µs)

Но содержимое /tmp/NomadClient.../<alloc_id>/... обманчиво просто:

[root@singularity 1c315bf2-688c-2c7b-8d6f-f71fec1254f3]# ls -lR
.:
total 0
drwxrwxrwx 5 nobody nobody 100 Dec  6 15:52 alloc
drwxrwxrwx 5 nobody nobody 120 Dec  6 15:53 cassandra

./alloc:
total 0
drwxrwxrwx 2 nobody nobody 40 Dec  6 15:52 data
drwxrwxrwx 2 nobody nobody 80 Dec  6 15:53 logs
drwxrwxrwx 2 nobody nobody 40 Dec  6 15:52 tmp

./alloc/data:
total 0

./alloc/logs:
total 0
-rw-r--r-- 1 root root 0 Dec  6 15:53 cassandra.stderr.0
-rw-r--r-- 1 root root 0 Dec  6 15:53 cassandra.stdout.0

./alloc/tmp:
total 0

./cassandra:
total 4
-rw-r--r-- 1 root   root   1248 Dec  6 16:19 executor.out
drwxrwxrwx 2 nobody nobody   40 Dec  6 15:52 local
drwxrwxrwx 2 nobody nobody   60 Dec  6 15:52 secrets
drwxrwxrwt 2 nobody nobody   40 Dec  6 15:52 tmp

./cassandra/local:
total 0

./cassandra/secrets:
total 0

./cassandra/tmp:
total 0

И cassandra.stdout.0, и cassandra.stderr.0 пусты, и полное содержимоефайла executor.out:

2018/12/06 15:53:22.822072 [DEBUG] syslog-server: launching syslog server on addr: /tmp/plugin278120866
2018/12/06 15:55:53.009611 [DEBUG] syslog-server: launching syslog server on addr: /tmp/plugin242312234
2018/12/06 15:58:29.135309 [DEBUG] syslog-server: launching syslog server on addr: /tmp/plugin226242288
2018/12/06 16:00:53.942271 [DEBUG] syslog-server: launching syslog server on addr: /tmp/plugin373025133
2018/12/06 16:03:03.252389 [DEBUG] syslog-server: launching syslog server on addr: /tmp/plugin559865372
2018/12/06 16:05:19.656317 [DEBUG] syslog-server: launching syslog server on addr: /tmp/plugin090082811
2018/12/06 16:07:28.468809 [DEBUG] syslog-server: launching syslog server on addr: /tmp/plugin383954837
2018/12/06 16:09:54.068604 [DEBUG] syslog-server: launching syslog server on addr: /tmp/plugin412544225
2018/12/06 16:12:10.085157 [DEBUG] syslog-server: launching syslog server on addr: /tmp/plugin279043152
2018/12/06 16:14:48.255653 [DEBUG] syslog-server: launching syslog server on addr: /tmp/plugin209533710
2018/12/06 16:17:23.735550 [DEBUG] syslog-server: launching syslog server on addr: /tmp/plugin168184243
2018/12/06 16:19:40.232181 [DEBUG] syslog-server: launching syslog server on addr: /tmp/plugin839254781
2018/12/06 16:22:13.485457 [DEBUG] syslog-server: launching syslog server on addr: /tmp/plugin406142133
2018/12/06 16:24:24.869274 [DEBUG] syslog-server: launching syslog server on addr: /tmp/plugin964077792

Обновление (2018-12-06 16:40 GMT) : поскольку очевидно, что запись в системный журнал желательна для агента, янастроил и запустил локальный сервер syslog, но безрезультатно.И сервер системного журнала не получает никаких сообщений.

1 Ответ

0 голосов
/ 07 декабря 2018

Проблема решена.Его природа двояка:

  • Драйвер докера Nomad (очень эффективно) инкапсулирует поведение контейнеров, делая их время от времени очень тихими.

  • Кассандра очень требовательна к ресурсам.Гораздо больше, чем я думал.Я был убежден, что 4 ГБ ОЗУ будет достаточно для комфортной работы, но, как оказалось, ему нужно (по крайней мере, в моей среде) 6 ГБ.

Отказ от ответственности: я на самом делеиспользуя bitnami/cassandra вместо cassandra, потому что я считаю, что их изображения очень высокого качества, безопасны и настраиваются с помощью переменных среды.Это открытие я сделал с помощью образа bitnami, и я не проверял, как оригинальный реагирует на такой объем памяти.

Относительно того, почему он не дает сбой при запуске контейнера непосредственно из CLI докера, ядумаю, это потому, что нет никакой спецификации пределов при его запуске.Docker просто берет столько памяти, сколько ему нужно для своих контейнеров, поэтому, если в конечном счете памяти хоста будет недостаточно для всех контейнеров, реализация придет намного позже (и, возможно, болезненно).Так что этот ранний сбой должен быть долгожданным преимуществом оркестровой платформы в качестве кочевника.Если есть какие-либо претензии с моей стороны, так это то, что выяснение причины проблемы заняло так много времени из-за отсутствия видимости контейнера!

...