From 53a7c7273c8ff8f66c3753c3b0fabb6a9744ba67 Mon Sep 17 00:00:00 2001 From: suzhengwei Date: Mon, 8 Jun 2020 14:42:14 +0800 Subject: [PATCH] host monitor by consul This spec introduces a new host monitor by consul. It monitors host heartbeat via management, tenant and storage connectivity. Only in the case of defined states, it will trigger host recovery, for example, storage interface disconnected. Change-Id: If81a6a9543513acf199afe6a17dceb1544657272 Implements: bp host-monitor-by-consul --- doc/source/images/host-monitor-by-consul.png | Bin 0 -> 42185 bytes .../xena/approved/host-monitor-by-consul.rst | 178 ++++++++++++++++++ 2 files changed, 178 insertions(+) create mode 100644 doc/source/images/host-monitor-by-consul.png create mode 100644 specs/xena/approved/host-monitor-by-consul.rst diff --git a/doc/source/images/host-monitor-by-consul.png b/doc/source/images/host-monitor-by-consul.png new file mode 100644 index 0000000000000000000000000000000000000000..673b20b9f80325d31496cbfaec309bf5122da796 GIT binary patch literal 42185 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%0Au>P9bKand0-$?OHHO`m}$9 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 F{{eNf9)th@ literal 0 HcmV?d00001 diff --git a/specs/xena/approved/host-monitor-by-consul.rst b/specs/xena/approved/host-monitor-by-consul.rst new file mode 100644 index 0000000..6e4d90b --- /dev/null +++ b/specs/xena/approved/host-monitor-by-consul.rst @@ -0,0 +1,178 @@ +.. + This work is licensed under a Creative Commons Attribution 3.0 Unported + License. + + http://creativecommons.org/licenses/by/3.0/legalcode + +======================= +host monitor by consul +======================= + +https://blueprints.launchpad.net/masakari-monitors/+spec/host-monitor-by-consul + + +Problem description +=================== + +Usually, there are management network, tenant network and storage network +in one cloud platform. The compute nodes may have management, tenant and +storage interface to connect to these three networks. + +Currently, Masakari host monitor uses pacemaker and pacemaker-remote to +monitor hosts' connection. Actually, it is monitoring the hosts heartbeat +through management interface. Once a host's management connectivity is +detected down, it will send notification to masakari to trigger host +failure recovery workflow. + +This solution has some flaws especially when ``management`` connectivity +is down and the other two connectivity ``tenant`` and ``storage`` are up. +Users can still access their VMs without any interruptions, so there is no +need to send notification in this case. + + +Proposed change +=============== + +This spec introduces a new host monitor. Specifically, host connectivity +monitoring via management, tenant and storage interfaces by consul agent. + +The low-level architecture for host monitoring is shown as below: + +.. image:: /images/host-monitor-by-consul.png + +Each host runs three consul agents, which respectively bind management, tenant +and storage interfaces. They make up three independent consul cluster. + +Consul agent runs in server mode on controller nodes, while in client mode on +compute nodes. + +For example, consul cluster via management connectivity. + +All agents bind management interface, and are responsible for running checks +and keeping services in sync. + +Consul is built on top of Serf which provides a full gossip protocol that is +used for multiple purposes. Serf provides membership, failure detection, and +event broadcast. Consul use gossip protocol to manage membership. If one agent +is found disconnected, it will broadcast messages to the cluster quickly. + +Host-monitor periodically retreives all consul members heath data from local +consul agents. It picks out every nodes' managent, tenant and storage health +state separately, and combine them together. + +Then It will send notification depending on defined host states as listed below +in the table: + ++-----------------+-----------------+-----------------+------------------+ +| management | tenant | storage | actions | ++-----------------+-----------------+-----------------+------------------+ +| up | up | down | recovery | ++-----------------+-----------------+-----------------+------------------+ +| up | down | down | recovery | ++-----------------+-----------------+-----------------+------------------+ +| down | up | down | recovery | ++-----------------+-----------------+-----------------+------------------+ +| down | down | down | recovery | ++-----------------+-----------------+-----------------+------------------+ + +* 'up' represents connectivity up. +* 'down' represents connectivity down. +* 'recovery' represents host recovery. + + +Alternatives +------------ + +None + +Data model impact +----------------- + +None + +REST API impact +--------------- + +None + +Security impact +--------------- + +None + +Notifications impact +-------------------- + +None + +Other end user impact +--------------------- + +None + +Performance Impact +------------------ + +None + +Other deployer impact +--------------------- + +None + +Developer impact +---------------- + +None + +Implementation +============== + +Assignee(s) +----------- + +Primary assignee: + +* suzhengwei + +Work Items +---------- + +- Masakari host-monitor driver based on consul + +- masakari documentation updates + +Dependencies +============ + +- Requires that consul agents are installed and running to monitor + the hosts management, tenant and storage connectivity. + +Testing +======= + +Unit tests will be needed. + +Documentation Impact +==================== + +The admin configuration documentation need to be updated. + +References +========== + +https://www.consul.io/ + + +History +======= + +.. list-table:: Revisions + :header-rows: 1 + + * - Release Name + - Description + * - Victoria + - Introduced + * - Xena + - Re-proposed