Postgres не запускается при перезагрузке сервера Swarm - PullRequest
5 голосов
/ 29 мая 2019

Я пытаюсь запустить приложение, используя Docker Swarm. Приложение предназначено для полностью локального запуска на одном компьютере с использованием Docker Swarm.

Если я SSH подключаюсь к серверу и запускаю развертывание стека докеров, все работает, как показано здесь: docker service ls:

result of docker service ls. all services up

Когда это развертывание работает, службы обычно запускаются в следующем порядке:

  1. Registry (частный реестр)
  2. Main (служба Nginx) и Postgres
  3. Все остальные службы в случайном порядке (все приложения Node)

У меня проблема с перезагрузкой. Когда я перезагружаю сервер, у меня довольно часто возникает проблема с сервисами, приводящими к сбою с таким результатом:

after server reboot

Я получаю некоторые ошибки, которые могут быть полезны.

В Postgres: docker service logs APP_NAME_postgres -f:

docker service logs APP_NAME_postgres -f after reboot

В журналах Docker: sudo journalctl -fu docker.service

sudo journalctl -fu docker.service after reboot

Обновление: 5 июня 2019 Кроме того, по запросу из GitHub выдача docker version вывод:

Client:
 Version:           18.09.5
 API version:       1.39
 Go version:        go1.10.8
 Git commit:        e8ff056
 Built:             Thu Apr 11 04:43:57 2019
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          18.09.5
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.10.8
  Git commit:       e8ff056
  Built:            Thu Apr 11 04:10:53 2019
  OS/Arch:          linux/amd64
  Experimental:     false

А docker info Выход:

Containers: 28
 Running: 9
 Paused: 0
 Stopped: 19
Images: 14
Server Version: 18.09.5
Storage Driver: overlay2
 Backing Filesystem: extfs
 Supports d_type: true
 Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: bridge host macvlan null overlay
 Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: active
 NodeID: pbouae9n1qnezcq2y09m7yn43
 Is Manager: true
 ClusterID: nq9095ldyeq5ydbsqvwpgdw1z
 Managers: 1
 Nodes: 1
 Default Address Pool: 10.0.0.0/8  
 SubnetSize: 24
 Orchestration:
  Task History Retention Limit: 5
 Raft:
  Snapshot Interval: 10000
  Number of Old Snapshots to Retain: 0
  Heartbeat Tick: 1
  Election Tick: 10
 Dispatcher:
  Heartbeat Period: 5 seconds
 CA Configuration:
  Expiry Duration: 3 months
  Force Rotate: 1
 Autolock Managers: false
 Root Rotation In Progress: false
 Node Address: 192.168.0.47
 Manager Addresses:
  192.168.0.47:2377
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: bb71b10fd8f58240ca47fbb579b9d1028eea7c84
runc version: 2b18fe1d885ee5083ef9f0838fee39b62d653e30
init version: fec3683
Security Options:
 apparmor
 seccomp
  Profile: default
Kernel Version: 4.15.0-50-generic
Operating System: Ubuntu 18.04.2 LTS
OSType: linux
Architecture: x86_64
CPUs: 4
Total Memory: 3.68GiB
Name: oeemaster
ID: 76LH:BH65:CFLT:FJOZ:NCZT:VJBM:2T57:UMAL:3PVC:OOXO:EBSZ:OIVH
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
 127.0.0.0/8
Live Restore Enabled: false
Product License: Community Engine

WARNING: No swap limit support

И, наконец, Мой стек стека / составления докера:

secrets:
  jwt-secret:
    external: true
  pg-db:
    external: true
  pg-host:
    external: true
  pg-pass:
    external: true
  pg-user:
    external: true
  ssl_dhparam:
    external: true
services:
  accounts:
    depends_on:
    - postgres
    - registry
    deploy:
      restart_policy:
        condition: on-failure
    environment:
      JWT_SECRET_FILE: /run/secrets/jwt-secret
      PG_DB_FILE: /run/secrets/pg-db
      PG_HOST_FILE: /run/secrets/pg-host
      PG_PASS_FILE: /run/secrets/pg-pass
      PG_USER_FILE: /run/secrets/pg-user
    image: 127.0.0.1:5000/local-oee-master-accounts:v0.8.0
    secrets:
    - source: jwt-secret
    - source: pg-db
    - source: pg-host
    - source: pg-pass
    - source: pg-user
  graphs:
    depends_on:
    - postgres
    - registry
    deploy:
      restart_policy:
        condition: on-failure
    environment:
      PG_DB_FILE: /run/secrets/pg-db
      PG_HOST_FILE: /run/secrets/pg-host
      PG_PASS_FILE: /run/secrets/pg-pass
      PG_USER_FILE: /run/secrets/pg-user
    image: 127.0.0.1:5000/local-oee-master-graphs:v0.8.0
    secrets:
    - source: pg-db
    - source: pg-host
    - source: pg-pass
    - source: pg-user
  health:
    depends_on:
    - postgres
    - registry
    deploy:
      restart_policy:
        condition: on-failure
    environment:
      PG_DB_FILE: /run/secrets/pg-db
      PG_HOST_FILE: /run/secrets/pg-host
      PG_PASS_FILE: /run/secrets/pg-pass
      PG_USER_FILE: /run/secrets/pg-user
    image: 127.0.0.1:5000/local-oee-master-health:v0.8.0
    secrets:
    - source: pg-db
    - source: pg-host
    - source: pg-pass
    - source: pg-user
  live-data:
    depends_on:
    - postgres
    - registry
    deploy:
      restart_policy:
        condition: on-failure
    image: 127.0.0.1:5000/local-oee-master-live-data:v0.8.0
    ports:
    - published: 32000
      target: 80
  main:
    depends_on:
    - accounts
    - graphs
    - health
    - live-data
    - point-logs
    - registry
    deploy:
      restart_policy:
        condition: on-failure
    environment:
      MAIN_CONFIG_FILE: nginx.local.conf
    image: 127.0.0.1:5000/local-oee-master-nginx:v0.8.0
    ports:
    - published: 80
      target: 80
    - published: 443
      target: 443
  modbus-logger:
    depends_on:
    - point-logs
    - registry
    deploy:
      restart_policy:
        condition: on-failure
    environment:
      CONTROLLER_ADDRESS: 192.168.2.100
      SERVER_ADDRESS: http://point-logs
    image: 127.0.0.1:5000/local-oee-master-modbus-logger:v0.8.0
  point-logs:
    depends_on:
    - postgres
    - registry
    deploy:
      restart_policy:
        condition: on-failure
    environment:
      ENV_TYPE: local
      PG_DB_FILE: /run/secrets/pg-db
      PG_HOST_FILE: /run/secrets/pg-host
      PG_PASS_FILE: /run/secrets/pg-pass
      PG_USER_FILE: /run/secrets/pg-user
    image: 127.0.0.1:5000/local-oee-master-point-logs:v0.8.0
    secrets:
    - source: pg-db
    - source: pg-host
    - source: pg-pass
    - source: pg-user
  postgres:
    depends_on:
    - registry
    deploy:
      restart_policy:
        condition: on-failure
        window: 120s
    environment:
      POSTGRES_PASSWORD: password
    image: 127.0.0.1:5000/local-oee-master-postgres:v0.8.0
    ports:
    - published: 5432
      target: 5432
    volumes:
    - /media/db_main/postgres_oee_master:/var/lib/postgresql/data:rw
  registry:
    deploy:
      restart_policy:
        condition: on-failure
    image: registry:2
    ports:
    - mode: host
      published: 5000
      target: 5000
    volumes:
    - /mnt/registry:/var/lib/registry:rw
version: '3.2'

Вещи, которые я пробовал

  • Действие: Добавлено restart_policy> window: 120 с.
    • Результат: без эффекта
  • Действие: Postgres restart_policy> условие: нет & crontab @reboot redeploy
    • Результат: без эффекта
  • Действие: Установить все контейнеры stop_grace_period: 2 м
    • Результат: без эффекта

Текущее решение

В настоящее время я собрал решение, которое работает, чтобы я мог перейти к следующему. Я только что написал сценарий оболочки под названием recreate.sh, который уничтожит неудачную первую загрузочную версию сервера, подождет, пока он выйдет из строя, и снова запустит стек докера, запускаемый вручную. Затем я устанавливаю скрипт для запуска при загрузке с помощью crontab @reboot. Это работает для выключений и перезагрузок, но я не принимаю это как правильный ответ, поэтому я не буду добавлять его как один.

1 Ответ

1 голос
/ 11 июня 2019

Мне кажется, вам нужно проверить, кто / что убивает сервис postgres.Из опубликованных вами журналов кажется, что postrgres получает сигнал умного выключения.Затем постресс мягко останавливается.В вашем файле стека установлена ​​политика перезапуска "on-fail", и, поскольку процесс postres аккуратно останавливается (код выхода 0), докер не считает это ошибкой и, как указано в инструкции, не перезапускается.

В заключениеЯ бы порекомендовал изменить политику перезапуска на «любой» с «по ошибке».

Кроме того, имейте в виду, что используемые вами «зависящие от» настройки игнорируются в Swarm, и вам нужны ваши службы /изображения - это собственный способ обеспечения правильного порядка запуска или работы, когда зависимые сервисы еще не запущены.

Есть также кое-что, что вы можете попробовать - проверка работоспособности.Возможно, для вашего базового образа postgres определена проверка работоспособности, и он завершает контейнер, отправляя ему сигнал уничтожения.И, как уже было написано ранее, postgres аккуратно завершает работу, код ошибки не выводится, и политика перезапуска не срабатывает.Попробуйте отключить проверку здоровья в yaml или перейдите в dockerfiles, чтобы найти директиву healthcheck и выяснить, почему она срабатывает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...