Как устранять типичные проблемы с вашими серверами CoreOS

Вступление

CoreOS представляет ряд интересных технологий, которые облегчают создание распределенных систем. Тем не менее, эти инструменты могут быть незнакомы для новых пользователей и имеют свои странности. Одна из основных проблем заключается в том, что на работе существует много уровней абстракции, и может быть трудно определить, где возникает проблема.

В этом руководстве мы рассмотрим некоторые основные процедуры устранения неполадок для работы с хостами CoreOS, контейнерами Docker, которые они запускают, и инструментами управления сервисами, которые объединяют некоторые разрозненные компоненты.

Отладка вашего файла Cloud-Config

Одной из наиболее распространенных проблем, с которыми сталкиваются новые и опытные пользователи CoreOS при сбое кластера, является неверный файл конфигурации облака.

CoreOS требует, чтобы файл облачной конфигурации передавался на ваш сервер при создании. Он использует информацию, содержащуюся в этом файле, для начальной загрузки и запуска или присоединения к существующему кластеру. Он также запускает основные службы и может настраивать базовые системы, такие как пользователи и группы.

Некоторые вещи, которые нужно проверить с помощью файла cloud-config:

  • * Начинается ли он с «# cloud-config»? *: Каждый передаваемый файл cloud-config должен начинаться с «# cloud-config», стоящего отдельно в первой строке. Хотя это обычно игнорируемый комментарий в YAML, в этом случае эта строка используется для сигнализации системе инициализации облака, что она содержит данные конфигурации.

  • * Содержит ли ваш файл действительный YAML? *: Файлы облачной конфигурации пишутся в YAML, формате сериализации данных с акцентом на удобочитаемость. Если у вас возникли проблемы, вставьте свою облачную конфигурацию в онлайновый YAML validator. Ваш файл не должен содержать ошибок. CoreOS предоставляет полезный инструмент, который может проверить синтаксис вашего файла конфигурации облака, Cloud-Config Validator.

  • * Используете ли вы свежий токен обнаружения? *: Адрес обнаружения отслеживает данные ваших компьютеров, даже если весь кластер не работает. Регистрация обнаружения не будет выполнена, когда вы загрузитесь со старым токеном, особенно если вы уже зарегистрировали тот же IP-адрес ранее. Используйте новый маркер обнаружения каждый раз, когда запускаете кластер, чтобы избежать этой проблемы.

  • * Запускаете ли вы сервисы fleet и etcd? *: Для правильной работы кластера необходимо запустить два сервиса: + fleet + и + etcd +. Вы должны взглянуть на наше руководство по адресу https://www.digitalocean.com/community/tutorials/how-to-set-up-a-coreos-cluster-on-digitalocean для получения кластера CoreOS, работающего на DigitalOcean], чтобы получить базовые сведения. cloud-config файл, который удовлетворяет этим минимальным требованиям.

Вы можете передать файл cloud-config только при создании машины, поэтому, если вы допустили ошибку, уничтожьте экземпляр сервера и запустите снова (в большинстве случаев с новым токеном).

Если вы уверены, что файл cloud-config сам по себе правильный, следующий шаг - войти на хост, чтобы убедиться, что файл был обработан правильно.

В большинстве случаев это должно быть легко, так как в DigitalOcean вы должны добавлять ключи ssh на сервер во время создания. Это означает, что вы можете без проблем подключиться к серверу по ssh.

Вход через панель управления DigitalOcean

Однако, есть определенные моменты, когда ваша облачная конфигурация могла фактически повлиять на доступность сети вашего сервера после запуска. В этом случае вам нужно будет войти через панель управления DigitalOcean. Это создает проблему, поскольку по умолчанию для образа CoreOS по умолчанию не заданы пароли.

Чтобы обойти это, вы должны заново создать сервер с новым облачным конфигурационным файлом, который содержит запись пароля для пользователя + core +. Из-за требований к отдыху это может быть полезно, только если вы постоянно видите эту проблему и хотите получить больше информации. Вы можете добавить информацию о пароле ко всем файлам облачной конфигурации в качестве общей практики, чтобы вы могли устранить неполадки. Вы можете вручную сбросить пароль после проверки вашего соединения.

Пароль должен быть в форме хэша. Вы можете создать их несколькими различными способами в зависимости от имеющегося программного обеспечения. Подойдет любое из следующего, поэтому используйте тот вариант, который вам подходит:

mkpasswd --method=SHA-512 --rounds=4096
openssl passwd -1
python -c "import crypt, getpass, pwd; print crypt.crypt('password', '\$6\$SALT\$')"
perl -e 'print crypt("password","\$6\$SALT\$") . "\n"'

Получив хеш, вы можете добавить новый раздел в ваш cloud-config (за пределами раздела «coreos»), который называется + users +, чтобы разместить эту информацию:

#cloud-config
users:
 - name: core
   passwd:
coreos:
 . . .

Validate ваш синтаксис YAML, а затем используйте эту новую облачную конфигурацию при повторном создании сервера. После этого вы сможете использовать выбранный пароль для входа через панель управления DigitalOcean.

Проверка индивидуального хоста

Как только вы вошли в систему, есть несколько вещей, которые вы должны проверить, чтобы убедиться, что ваш cloud-config был обработан правильно.

Проверка на ошибки в основных службах

Самый простой способ начать - спросить + fleetctl + о каких машинах он знает. Если это возвращается без ошибки, это означает, что + fleet + и + etcd + были запущены правильно и что они взаимодействуют с другими хостами.

fleetctl list-machines

Если вы получите здесь ошибку, вам следует обратить внимание на ряд вещей. Распространенная ошибка выглядит так:

2014/09/18 17:10:50 INFO client.go:278: Failed getting response from http://127.0.0.1:4001/: dial tcp 127.0.0.1:4001: connection refused
2014/09/18 17:10:50 ERROR client.go:200: Unable to get result for {Get /_coreos.com/fleet/machines}, retrying in 100ms
2014/09/18 17:10:50 INFO client.go:278: Failed getting response from http://127.0.0.1:4001/: dial tcp 127.0.0.1:4001: connection refused
2014/09/18 17:10:50 ERROR client.go:200: Unable to get result for {Get /_coreos.com/fleet/machines}, retrying in 200ms

Поскольку это представляет собой набор различных компонентов друг над другом, давайте начнем с верхнего уровня и будем работать вниз. Проверьте сервис + fleet + и посмотрите, какие ошибки он нам дает:

systemctl status -l fleet
● fleet.service - fleet daemon
  Loaded: loaded (/usr/lib64/systemd/system/fleet.service; static)
 Drop-In: /run/systemd/system/fleet.service.d
          └─20-cloudinit.conf
  Active: active (running) since Thu 2014-09-18 17:10:50 UTC; 2min 26s ago
Main PID: 634 (fleetd)
  CGroup: /system.slice/fleet.service
          └─634 /usr/bin/fleetd

Sep 18 17:13:07 dumb1 fleetd[634]: INFO client.go:278: Failed getting response from http://localhost:4001/: dial tcp 127.0.0.1:4001: connection refused
Sep 18 17:13:07 dumb1 fleetd[634]: ERROR client.go:200: Unable to get result for {Update /_coreos.com/fleet/machines/795de101bcd24a3a96aa698f770f0074/object}, retrying in 800ms
Sep 18 17:13:08 dumb1 fleetd[634]: INFO client.go:278: Failed getting response from http://localhost:4001/: dial tcp 127.0.0.1:4001: connection refused

Как видите, служба работает, но она не может подключиться к порту + 4001 +, который является портом + etcd +. Это указывает на то, что проблема может быть в + etcd +.

Для каждого из наших основных услуг, мы должны проверить статус и журналы. Общий способ сделать это:

systemctl status -l
journalctl -b -u

Команда «status» дает нам состояние службы и последние несколько строк журнала. Команда журнала дает нам доступ к полным журналам.

Если мы попробуем это с + etcd + next, мы увидим, что служба + etcd + в нашем случае не работает:

systemctl status -l etcd
● etcd.service - etcd
  Loaded: loaded (/usr/lib64/systemd/system/etcd.service; static)
 Drop-In: /run/systemd/system/etcd.service.d
          └─20-cloudinit.conf
  Active: activating (auto-restart) (Result: exit-code) since Thu 2014-09-18 17:17:03 UTC; 9s ago
 Process: 938 ExecStart=/usr/bin/etcd (code=exited, status=1/FAILURE)
Main PID: 938 (code=exited, status=1/FAILURE)

Sep 18 17:17:03 dumb1 systemd[1]: etcd.service: main process exited, code=exited, status=1/FAILURE
Sep 18 17:17:03 dumb1 systemd[1]: Unit etcd.service entered failed state.

Если мы проверим журналы + etcd +, мы увидим что-то вроде этого:

journalctl -b -u etcd
Sep 18 17:21:27 dumb1 systemd[1]: Starting etcd...
Sep 18 17:21:27 dumb1 systemd[1]: Started etcd.
Sep 18 17:21:27 dumb1 etcd[1160]: [etcd] Sep 18 17:21:27.966 INFO      | The path /var/lib/etcd/log is in btrfs
Sep 18 17:21:27 dumb1 etcd[1160]: [etcd] Sep 18 17:21:27.967 INFO      | Set NOCOW to path /var/lib/etcd/log succeeded
Sep 18 17:21:27 dumb1 etcd[1160]: [etcd] Sep 18 17:21:27.967 INFO      |
Sep 18 17:21:28 dumb1 etcd[1160]: [etcd] Sep 18 17:21:28.422 WARNING   | Discovery encountered an error: invalid character 'p' after top-level value
Sep 18 17:21:28 dumb1 etcd[1160]: [etcd] Sep 18 17:21:28.423 WARNING   | 795de101bcd24a3a96aa698f770f0074 failed to connect discovery service[https://discovery.etcd.io/]: invalid character 'p' after top-level value
Sep 18 17:21:28 dumb1 etcd[1160]: [etcd] Sep 18 17:21:28.423 CRITICAL  | 795de101bcd24a3a96aa698f770f0074, the new instance, must register itself to discovery service as required
Sep 18 17:21:28 dumb1 systemd[1]: etcd.service: main process exited, code=exited, status=1/FAILURE
Sep 18 17:21:28 dumb1 systemd[1]: Unit etcd.service entered failed state.

Выделенная строка показывает, что этот конкретный экземпляр не имел токена обнаружения.

Проверьте файловую систему, чтобы увидеть файлы конфигурации, сгенерированные Cloud-Config.

Следующее, что нужно проверить, это то, какие сервисные файлы были сгенерированы в облачной конфигурации

Когда ваш компьютер с ОС CoreOS обрабатывает файл cloud-config, он генерирует файлы модулей заглушки + systemd +, которые он использует для запуска + fleet + и + etcd +. Чтобы увидеть файлы конфигурации + systemd +, которые были созданы и используются для запуска ваших служб, перейдите в каталог, в который они были удалены:

cd /run/systemd/system
ls -F
etcd.service.d/  fleet.service.d/  oem-cloudinit.service

Вы можете увидеть обобщенный файл + oem-cloudinit.service +, который автоматически обрабатывается CoreOS, и каталоги, в которых есть служебная информация. Мы можем увидеть, с какой информацией запускается наш сервис + etcd +, набрав:

cat etcd.servicd.d/20-cloudinit.conf
[Service]
Environment="ETCD_ADDR=10.132.247.162:4001"
Environment="ETCD_DISCOVERY=https://discovery.etcd.io/"
Environment="ETCD_NAME=795de101bcd24a3a96aa698f770f0074"
Environment="ETCD_PEER_ADDR=10.132.247.162:7001"

Это файл-заглушка + systemd +, который используется для добавления дополнительной информации в сервис при запуске. Как вы можете видеть здесь, адрес + ETCD_DISCOVERY + соответствует ошибке, которую мы обнаружили в журналах: в конце нет маркера обнаружения, добавленного в конец. Нам нужно переделать наши машины с помощью облачной конфигурации с действительным токеном обнаружения.

Вы можете получить похожую информацию о + fleet +, набрав:

cat fleet.service.d/20-cloudinit.conf
[Service]
Environment="FLEET_METADATA=region=nyc,public_ip=104.131.1.89"
Environment="FLEET_PUBLIC_IP=10.132.247.162"

Здесь мы можем видеть, что + fleet + получил некоторую информацию о метаданных в облачной конфигурации. Это может быть использовано для планирования при создании файлов сервисных единиц.

Проверка доступа к службе метаданных

Фактический файл конфигурации облака, который предоставляется при создании сервера CoreOS с помощью DigitalOcean, хранится с использованием службы метаданных. Если вы не смогли найти никаких доказательств вашей конфигурации облака на вашем сервере, возможно, вам не удалось получить информацию из службы метаданных DigitalOcean.

Внутри хоста введите:

curl -L 169.254.169.254/metadata/v1
id
hostname
user-data
vendor-data
public-keys
region
interfaces/
dns/

Вы должны включить + -L +, чтобы следовать перенаправлениям. Адрес + 169.254.169.254 + будет использоваться для every сервера, поэтому вам не следует изменять этот адрес. Это показывает вам поля метаданных и каталоги, которые содержат информацию о вашем сервере. Если вы не можете достичь этого с сервера DigitalOcean CoreOS, вам может потребоваться открыть заявку в службу поддержки.

Вы можете запросить этот URL для получения информации о вашем сервере. Вы можете исследовать каждую из записей здесь с помощью дополнительных команд curl, но та, которая содержит файл cloud-config, представляет собой поле + user-data +:

curl -L 169.254.169.254/metadata/v1/user-data
#cloud-config
users:
 - name: core
   passwd: $6$CeKTMyfClO/CPSHB$02scg00.FnwlEYdq/oXiXoohzvvlY6ykUck1enMod7VKJrzyGRAtZGziZh48LNcECu/mtgPZpY6aGCoj.h4bV1
coreos:
 etcd:
   # generated token from https://discovery.etcd.io/new
   discovery: https://discovery.etcd.io/
   # multi-region and multi-cloud deployments need to use $public_ipv4
   addr: $private_ipv4:4001
   peer-addr: $private_ipv4:7001
 fleet:
   public-ip: $private_ipv4
   metadata: region=nyc,public_ip=$public_ipv4
 units:
   - name: etcd.service
     command: start
   - name: fleet.service
     command: start

Если вы можете прочитать ваш cloud-config из этого расположения, это означает, что ваш сервер имеет возможность читать данные cloud-config и должен выполнять свои инструкции при загрузке сервера.

Устранение других проблем с хост-компьютером CoreOS

Если вам необходимо выполнить дальнейшую отладку, вы можете быстро обнаружить, что CoreOS содержит минимальную базовую установку. Поскольку предполагается, что все программное обеспечение будет выполняться в контейнерах, оно не включает даже некоторые из самых основных служебных программ.

К счастью, разработчики CoreOS предлагают элегантное решение этой проблемы. Используя скрипт «toolbox», включенный в каждый хост, вы можете запустить контейнер Fedora с доступом к хост-системам. Внутри этого контейнера вы можете установить любые утилиты, необходимые для отладки хоста.

Чтобы запустить его, просто используйте команду + toolbox +:

toolbox

Это опустит последний образ Fedora и поместит вас в командную строку внутри контейнера. Если вы сделаете несколько быстрых проверок, вы поймете, что у вас есть доступ к сети хост-системы:

ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
   link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
   inet 127.0.0.1/8 scope host lo
      valid_lft forever preferred_lft forever
   inet6 ::1/128 scope host
      valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
   link/ether 04:01:28:7c:39:01 brd ff:ff:ff:ff:ff:ff
   inet 169.254.180.43/16 brd 169.254.255.255 scope link eth0
      valid_lft forever preferred_lft forever
   . . .

У вас также есть полный доступ к процессам хоста:

ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1 106024  4912 ?        Ss   17:10   0:04 /usr/lib/systemd/systemd --switched-root --system --deserialize 19
root         2  0.0  0.0      0     0 ?        S    17:10   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        S    17:10   0:00 [ksoftirqd/0]
root         5  0.0  0.0      0     0 ?        S<   17:10   0:00 [kworker/0:0H]
root         6  0.0  0.0      0     0 ?        S    17:10   0:00 [kworker/u4:0]
root         7  0.0  0.0      0     0 ?        S    17:10   0:00 [rcu_sched]
root         8  0.0  0.0      0     0 ?        S    17:10   0:00 [rcu_bh]
. . .

В этой среде вы можете установить любые инструменты, которые вам нужны. Например, мы можем установить + htop +, главный клон с дополнительными функциями, используя менеджер пакетов Fedora:

yum install htop -y && htop

Это вызовет монитор процессов со всеми загруженными процессами хоста.

Чтобы выйти из среды контейнера, введите «exit» или трижды быстро нажмите «+ CTRL -] +». Вы попадете обратно в сессию оболочки хоста.

Устранение неполадок с любого хоста

Еще одна область, в которой вам может потребоваться устранить неполадки, - это действующие службы, которые вы используете. Поскольку у нас есть + fleet + и + fleetctl + для управления нашими службами во всем кластере, наши первые шаги могут быть выполнены на любом из серверов в нашем кластере.

Мы должны начать с представления о состоянии ваших услуг, как с точки зрения «+ fleet », так и с отдельных хостов, которые были назначены для запуска каждой службы. Инструмент ` fleetctl +` дает нам команды, чтобы легко получить эту информацию.

Во-первых, получите представление о том, как + fleet + видит состояние сервиса, набрав:

fleetctl list-unit-files
UNIT                HASH    DSTATE      STATE       TARGET
[email protected]   06d78fb loaded      loaded      04856ec4.../10.132.249.212
[email protected]   06d78fb loaded      loaded      197a1662.../10.132.249.206
[email protected]   06d78fb loaded      loaded      e3ca8fd3.../10.132.252.37
[email protected]     0f7f53b launched    launched    04856ec4.../10.132.249.212
[email protected]     0f7f53b launched    launched    197a1662.../10.132.249.206
[email protected]     0f7f53b launched    launched    e3ca8fd3.../10.132.252.37
nginx_lb.service        c8541af launched    launched    96ec72cf.../10.132.248.177

Это даст вам обзор всех служб, о которых знает + fleet +. Этот вывод имеет очень важную информацию. Давайте взглянем.

  • * UNIT *: это название устройства. В нашем случае все шесть лучших сервисов являются единицами экземпляра (узнайте больше о https://www.digitalocean.com/community/tutorials/how-to-create-f Flexible-services-for-a-coreos-cluster-with- fleet-unit-files [шаблоны и экземпляры] здесь), а нижняя часть выглядит как статический экземпляр. Это имена, которые мы можем использовать для выдачи команд, влияющих на каждую из этих служб.

  • * HASH *: это хеш файла модуля, используемого для управления этой службой. Как вы можете видеть, все экземпляры + apache-discovery + создаются из одного и того же файла шаблона. Все экземпляры + apache порождаются из другого. Это может быть полезно, чтобы увидеть, проявляет ли какой-либо из ваших сервисов странное поведение, используя устаревший файл модуля.

  • * DSTATE *: это желаемое состояние устройства. Когда вы вводите команду + fleetctl + для изменения состояния юнита, этот столбец изменяется, чтобы отразить желаемое состояние этого юнита.

  • * STATE *: это actual состояние юнита, как известно + fleet +. Если это отличается от DSTATE, это может означать, что операция не удалась.

  • * TARGET *: компьютер, на котором запланировано запустить эту службу. Это будет доступно, когда устройство будет запущено или загружено. Он содержит идентификатор машины и IP-адрес машины.

Как видите, существует довольно много информации, которая может помочь вам отладить проблему.

Однако это не единственное важное место для проверки. Важно понимать, что бывают случаи, когда + fleet + не соглашается с локальным экземпляром машины + systemd + о состоянии службы. Это может произойти по разным причинам, например, если один блок запускает или останавливает другой блок внутри.

Чтобы получить информацию о состоянии каждой службы, взятую из экземпляра + systemd + хоста, на котором выполняется эта служба, используйте вместо этого команду + list-units +:

fleetctl list-units
UNIT                MACHINE             ACTIVE  SUB
[email protected]   04856ec4.../10.132.249.212  active  running
[email protected]   197a1662.../10.132.249.206  active  running
[email protected]   e3ca8fd3.../10.132.252.37   active  running
[email protected]     04856ec4.../10.132.249.212  active  running
[email protected]     197a1662.../10.132.249.206  active  running
[email protected]     e3ca8fd3.../10.132.252.37   active  running
nginx_lb.service        96ec72cf.../10.132.248.177  active  running

Здесь мы видим, что все службы перечислены как работающие. Это не согласуется с информацией, которую показывает + list-unit-files. Это связано с тем, что каждая из служб + apache запускает соответствующую службу` + apache-discovery`, не сообщая об этом + fleet +. Это не ошибка, но может привести к путанице в отношении фактического состояния службы.

Чтобы получить дополнительную информацию о любой из служб, вы можете использовать + fleetctl + для доступа к информации + systemctl status + и + journalctl -u + хост-системы. Просто введите:

fleetctl status
[email protected] - Apache web server service on port 4444
  Loaded: loaded (/run/fleet/units/[email protected]; linked-runtime)
  Active: active (running) since Thu 2014-09-18 18:50:00 UTC; 7min ago
 Process: 3535 ExecStartPre=/usr/bin/docker pull imchairmanm/apache (code=exited, status=0/SUCCESS)
 Process: 3526 ExecStartPre=/usr/bin/docker rm apache.%i (code=exited, status=0/SUCCESS)
 Process: 3518 ExecStartPre=/usr/bin/docker kill apache.%i (code=exited, status=0/SUCCESS)
Main PID: 3543 (docker)
  CGroup: /system.slice/system-apache.slice/[email protected]
          └─3543 /usr/bin/docker run -t --name apache.4444 -p 10.132.249.212:4444:80 imchairmanm/apache /usr/sbin/apache2ctl -D FOREGROUND

Или прочитайте журнал, набрав:

fleetctl journal
-- Logs begin at Mon 2014-09-15 14:54:12 UTC, end at Thu 2014-09-18 18:57:51 UTC. --
Sep 17 14:33:20 lala2 systemd[1]: Started Apache web server service on port 4444.
Sep 17 14:33:20 lala2 docker[21045]: AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.10. Set the 'ServerName' directive globally to suppress this message
Sep 18 18:49:29 lala2 systemd[1]: Stopping Apache web server service on port 4444...
Sep 18 18:49:39 lala2 docker[3500]: apache.4444
Sep 18 18:49:39 lala2 systemd[1]: Stopped Apache web server service on port 4444.
Sep 18 18:49:58 lala2 systemd[1]: Starting Apache web server service on port 4444...
Sep 18 18:49:58 lala2 docker[3518]: apache.4444
Sep 18 18:49:58 lala2 docker[3526]: apache.4444
Sep 18 18:49:58 lala2 docker[3535]: Pulling repository imchairmanm/apache
Sep 18 18:50:00 lala2 systemd[1]: Started Apache web server service on port 4444.

Это может предоставить некоторую полезную информацию о том, почему ваши службы отказывают. Например, если в вашем модульном файле объявлена ​​недоступная зависимость, это будет показано здесь (это может произойти, если зависимость еще не была загружена в + fleet +).

Одна из ошибок, с которой вы можете столкнуться при вводе некоторых из этих команд:

Error running remote command: SSH_ AUTH _SOCK environment variable is not set. Verify ssh-agent is running. See https://github.com/coreos/fleet/blob/master/Documentation/using-the-client.md for help.

Это указывает на то, что вы не пересылали свой пользовательский агент ssh при подключении к этому хосту. Чтобы + fleet + получить информацию о других машинах в кластере, он подключается с использованием учетных данных SSH, которые вы храните на локальном компьютере.

Для этого вы должны запустить агент ssh на локальном компьютере и добавить свой закрытый ключ. Вы можете сделать это на локальном компьютере, набрав:

eval $(ssh-agent)
ssh-add
Identity added: /home//.ssh/id_rsa (/home//.ssh/id_rsa)

Как только ваш ssh-агент получит доступ к вашему секретному ключу, вы должны подключиться к хосту CoreOS с опцией + -A +, чтобы forward эту информацию:

ssh -A core@

Это позволит компьютеру, на котором вы работаете, использовать ваши учетные данные для подключения к другим компьютерам в кластере. Это то, что позволяет вам читать информацию + systemd + из удаленных членов кластера. Это также позволяет вам ssh напрямую другим участникам.

Устранение неполадок с контейнерами с хоста, на котором запущена служба

Хотя вы можете получить много полезной информации, используя только + fleetctl +, иногда вам приходится обращаться к хосту, который отвечает за запуск службы для устранения неполадок.

Как мы уже говорили выше, это легко, когда вы перенаправили свою информацию SSH при подключении. С хоста, к которому вы подключены, вы можете «прыгать» на другие машины, используя + fleetctl +. Вы можете указать идентификатор компьютера или просто имя службы. Процесс + fleetctl + достаточно умен, чтобы знать, на какой хост вы ссылаетесь:

fleetctl ssh

Это даст вам ssh-соединение с хостом, назначенным для запуска этой службы. Служба должна быть в состоянии «загружен» или «запущен», чтобы это работало.

Отсюда у вас будет доступ ко всем локальным средствам устранения неполадок. Например, вы можете получить доступ к более полному набору флагов + journalctl +, который может быть недоступен с помощью команды + fleetctl journal +:

journalctl -b --no-pager -u apache@4444

На этом этапе вы можете решить проблемы с Docker. Чтобы увидеть список запущенных контейнеров, введите:

docker ps
CONTAINER ID        IMAGE                       COMMAND                CREATED             STATUS              PORTS                         NAMES
       imchairmanm/apache:latest   "/usr/sbin/apache2ct   30 minutes ago      Up 30 minutes       10.132.249.212:4444->80/tcp   apache.4444

Мы видим, что в данный момент работает один контейнер. Подсвеченный идентификатор контейнера полезен для многих других операций Docker.

Если ваш сервис не запустился, ваш контейнер не будет работать. Чтобы увидеть список всех контейнеров, включая те, которые вышли / не удалось, передайте флаг + -a +:

docker ps -a
CONTAINER ID        IMAGE                       COMMAND                CREATED             STATUS                     PORTS                         NAMES
b68139630337        imchairmanm/apache:latest   "/usr/sbin/apache2ct   31 minutes ago      Up 31 minutes              10.132.249.212:4444->80/tcp   apache.4444
4389108bff1a        imchairmanm/apache:latest   "/usr/sbin/apache2ct   28 hours ago        Exited (-1) 28 hours ago                                 apache.8888
5af6e4f95642        imchairmanm/lalala:latest   "/usr/sbin/apache2ct   3 days ago          Exited (-1) 3 days ago                                   apache.7777

Чтобы увидеть контейнер last, который был запущен, независимо от его состояния, вы можете использовать вместо этого флаг + -l +:

docker ps -l
CONTAINER ID        IMAGE                       COMMAND                CREATED             STATUS              PORTS                         NAMES
b68139630337        imchairmanm/apache:latest   "/usr/sbin/apache2ct   33 minutes ago      Up 33 minutes       10.132.249.212:4444->80/tcp   apache.4444

Когда у вас есть идентификатор контейнера, который вы ищете, вы можете начать расследование на уровне Docker. Во-первых, вы можете просмотреть журналы:

docker logs

Это даст вам информацию журнала, которую можно собрать из контейнера. Это должно работать независимо от того, запущен контейнер или нет. Если контейнер запускался интерактивно (с флагами + -i + и + -t + и сессией оболочки), весь сеанс будет доступен в журналах.

Вы можете получить список запущенных процессов для любого активного контейнера, набрав:

docker top

Создание сеанса оболочки в контейнере

Один из самых полезных шагов - открыть сеанс оболочки в работающем контейнере, чтобы увидеть, что происходит внутри. Для этого CoreOS поставляется с утилитой + nsenter +.

Контейнеры Docker работают путем настройки пространств имен ядра, и этот инструмент может запустить сеанс в этих средах. Первый шаг - получить PID контейнера, который вы хотите ввести:

PID=$(docker inspect --format {{.State.Pid}} )

Теперь вы можете открыть сеанс оболочки в этой среде контейнера, набрав:

sudo nsenter -t $PID -m -u -i -n -p

Вам будет предоставлен сеанс оболочки в среде контейнера. Отсюда вы можете просматривать журналы или выполнять любые другие необходимые действия по устранению неполадок.

В зависимости от способа создания контейнера вы можете получить сообщение о том, что + bash + не найден. В этом случае вам придется использовать общую оболочку + sh +, добавив ее в конце вашей команды:

sudo nsenter -t $PID -m -u -i -n -p /bin/sh

Заключение

Это лишь некоторые из процедур, которые вы можете использовать для устранения проблем с кластерами CoreOS. Это должно помочь вам отследить проблемы, которые могут возникнуть у вас с файлом конфигурации облака, и устранить неполадки, связанные со способностью ваших компьютеров правильно кластеризовать и запускать службы. Отслеживание проблем с контейнерами и сервисами Docker - это еще одна область, которую мы рассмотрели.

Одна из самых важных вещей, которую нужно иметь в виду, заключается в том, что отладка становится намного проще, чем больше информации о вашей системе вы имеете. Полезно иметь четкое представление о роли каждого компонента и о том, как они взаимодействуют, чтобы помочь системе функционировать. Если вы обнаружили, что потеряли себя при попытке отследить проблему, может быть полезно освежить в себе основы CoreOS.

Related