第 3 章 使用 Pacemaker 管理高可用性服务

Pacemaker 服务管理核心容器和主动 - 被动服务,如 Galera、RabbitMQ、Redis 和 HAProxy。您可以使用 Pacemaker 查看和管理受管服务、虚拟 IP 地址、电源管理和隔离的常规信息。

3.1. Pacemaker 资源捆绑包和容器

Pacemaker 将 Red Hat OpenStack Platform (RHOSP)服务作为 Bundle Set 资源或捆绑包进行管理。其中的大部分服务都是以相同方式启动的主动服务,并且始终在每个 Controller 节点上运行。

Pacemaker 管理以下资源类型:

捆绑包(Bundle)
捆绑包资源在所有 Controller 节点上配置和复制相同的容器,将所需的存储路径映射到容器目录,并设置与资源本身相关的特定属性。
Container
容器可以运行不同类型的资源,从 HAProxy 等简单 systemd 服务到复杂的服务,如 Galera 等,这需要特定的资源代理来控制和设置不同节点上的服务状态。
重要
  • 您不能使用 podmansystemctl 管理捆绑包或容器。您可以使用 命令检查服务的状态,但必须使用 Pacemaker 对这些服务执行操作。
  • Podman 将 Pacemaker 控件的 RestartPolicy 设置为 no 的 podman 容器。这是为了确保 Pacemaker (而非 Podman)控制容器启动和停止操作。

3.1.1. 简单捆绑设置资源(简单捆绑包)

简单 Bundle Set 资源或简单捆绑包是一组容器,各自包含要在 Controller 节点上部署的相同 Pacemaker 服务。

以下示例显示了 pcs status 命令的输出中的简单捆绑包列表:

Podman container set: haproxy-bundle [192.168.24.1:8787/rhosp-rhel8/openstack-haproxy:pcmklatest]
  haproxy-bundle-podman-0      (ocf::heartbeat:podman):        Started overcloud-controller-0
  haproxy-bundle-podman-1      (ocf::heartbeat:podman):        Started overcloud-controller-1
  haproxy-bundle-podman-2      (ocf::heartbeat:podman):        Started overcloud-controller-2

对于每个捆绑包,您可以查看以下详情:

  • Pacemaker 为服务分配的名称。
  • 对与捆绑包关联的容器的引用。
  • 在不同 Controller 节点上运行的副本数量和状态。

以下示例显示了 haproxy-bundle simple bundle 的设置:

$ sudo pcs resource show haproxy-bundle
Bundle: haproxy-bundle
 Podman: image=192.168.24.1:8787/rhosp-rhel8/openstack-haproxy:pcmklatest network=host options="--user=root --log-driver=journald -e KOLLA_CONFIG_STRATEGY=COPY_ALWAYS" replicas=3 run-command="/bin/bash /usr/local/bin/kolla_start"
 Storage Mapping:
  options=ro source-dir=/var/lib/kolla/config_files/haproxy.json target-dir=/var/lib/kolla/config_files/config.json (haproxy-cfg-files)
  options=ro source-dir=/var/lib/config-data/puppet-generated/haproxy/ target-dir=/var/lib/kolla/config_files/src (haproxy-cfg-data)
  options=ro source-dir=/etc/hosts target-dir=/etc/hosts (haproxy-hosts)
  options=ro source-dir=/etc/localtime target-dir=/etc/localtime (haproxy-localtime)
  options=ro source-dir=/etc/pki/ca-trust/extracted target-dir=/etc/pki/ca-trust/extracted (haproxy-pki-extracted)
  options=ro source-dir=/etc/pki/tls/certs/ca-bundle.crt target-dir=/etc/pki/tls/certs/ca-bundle.crt (haproxy-pki-ca-bundle-crt)
  options=ro source-dir=/etc/pki/tls/certs/ca-bundle.trust.crt target-dir=/etc/pki/tls/certs/ca-bundle.trust.crt (haproxy-pki-ca-bundle-trust-crt)
  options=ro source-dir=/etc/pki/tls/cert.pem target-dir=/etc/pki/tls/cert.pem (haproxy-pki-cert)
  options=rw source-dir=/dev/log target-dir=/dev/log (haproxy-dev-log)

以下示例显示了捆绑包中容器的以下信息:

  • 镜像 :供容器使用的镜像,引用 undercloud 的本地注册表。
  • 网络 :容器网络类型,本例中为 "host "。
  • 选项 :容器的特定选项。
  • replicas :指示集群中必须运行多少个容器副本。每个捆绑包包括三个容器,每个 Controller 节点都有一个容器。
  • run-command: 用于生成容器的系统命令。
  • 存储映射 :将每个主机上的本地路径映射到容器。haproxy 配置位于 /var/lib/config-data/puppet-generated/haproxy/haproxy.cfg 文件中,而不是 /etc/haproxy/haproxy.cfg 文件。
注意

虽然 HAProxy 通过对所选服务进行负载平衡流量提供高可用性服务,但您可以将 HAProxy 配置为高可用性服务,方法是将它作为 Pacemaker 捆绑包服务进行管理。

3.1.2. complex Bundle Set resources (complex bundle)

复杂的 Bundle Set 资源或复杂捆绑包是 Pacemaker 服务,除了包含在简单捆绑包中的基本容器配置外,还要指定资源配置。

需要此配置来管理多状态资源,哪些服务根据其上运行的 Controller 节点具有不同的状态。

本例显示 pcs status 命令的输出中的复杂捆绑包列表:

Podman container set: rabbitmq-bundle [192.168.24.1:8787/rhosp-rhel8/openstack-rabbitmq:pcmklatest]
  rabbitmq-bundle-0    (ocf::heartbeat:rabbitmq-cluster):      Started overcloud-controller-0
  rabbitmq-bundle-1    (ocf::heartbeat:rabbitmq-cluster):      Started overcloud-controller-1
  rabbitmq-bundle-2    (ocf::heartbeat:rabbitmq-cluster):      Started overcloud-controller-2
Podman container set: galera-bundle [192.168.24.1:8787/rhosp-rhel8/openstack-mariadb:pcmklatest]
  galera-bundle-0      (ocf::heartbeat:galera):        Master overcloud-controller-0
  galera-bundle-1      (ocf::heartbeat:galera):        Master overcloud-controller-1
  galera-bundle-2      (ocf::heartbeat:galera):        Master overcloud-controller-2
Podman container set: redis-bundle [192.168.24.1:8787/rhosp-rhel8/openstack-redis:pcmklatest]
  redis-bundle-0       (ocf::heartbeat:redis): Master overcloud-controller-0
  redis-bundle-1       (ocf::heartbeat:redis): Slave overcloud-controller-1
  redis-bundle-2       (ocf::heartbeat:redis): Slave overcloud-controller-2

这个输出显示了有关每个复杂捆绑包的以下信息:

  • RabbitMQ:所有三个 Controller 节点都运行服务的独立实例,类似于简单的捆绑包。
  • Galera:所有三个 Controller 节点都作为 Galera master 运行,其限制相同。
  • Redis: overcloud-controller-0 容器作为 master 运行,另外两个 Controller 节点则作为从设备运行。每个容器类型可能在不同的约束下运行。

以下示例显示了 galera-bundle 复杂捆绑包的设置:

[...]
Bundle: galera-bundle
 Podman: image=192.168.24.1:8787/rhosp-rhel8/openstack-mariadb:pcmklatest masters=3 network=host options="--user=root --log-driver=journald -e KOLLA_CONFIG_STRATEGY=COPY_ALWAYS" replicas=3 run-command="/bin/bash /usr/local/bin/kolla_start"
 Network: control-port=3123
 Storage Mapping:
  options=ro source-dir=/var/lib/kolla/config_files/mysql.json target-dir=/var/lib/kolla/config_files/config.json (mysql-cfg-files)
  options=ro source-dir=/var/lib/config-data/puppet-generated/mysql/ target-dir=/var/lib/kolla/config_files/src (mysql-cfg-data)
  options=ro source-dir=/etc/hosts target-dir=/etc/hosts (mysql-hosts)
  options=ro source-dir=/etc/localtime target-dir=/etc/localtime (mysql-localtime)
  options=rw source-dir=/var/lib/mysql target-dir=/var/lib/mysql (mysql-lib)
  options=rw source-dir=/var/log/mariadb target-dir=/var/log/mariadb (mysql-log-mariadb)
  options=rw source-dir=/dev/log target-dir=/dev/log (mysql-dev-log)
 Resource: galera (class=ocf provider=heartbeat type=galera)
  Attributes: additional_parameters=--open-files-limit=16384 cluster_host_map=overcloud-controller-0:overcloud-controller-0.internalapi.localdomain;overcloud-controller-1:overcloud-controller-1.internalapi.localdomain;overcloud-controller-2:overcloud-controller-2.internalapi.localdomain enable_creation=true wsrep_cluster_address=gcomm://overcloud-controller-0.internalapi.localdomain,overcloud-controller-1.internalapi.localdomain,overcloud-controller-2.internalapi.localdomain
  Meta Attrs: container-attribute-target=host master-max=3 ordered=true
  Operations: demote interval=0s timeout=120 (galera-demote-interval-0s)
              monitor interval=20 timeout=30 (galera-monitor-interval-20)
              monitor interval=10 role=Master timeout=30 (galera-monitor-interval-10)
              monitor interval=30 role=Slave timeout=30 (galera-monitor-interval-30)
              promote interval=0s on-fail=block timeout=300s (galera-promote-interval-0s)
              start interval=0s timeout=120 (galera-start-interval-0s)
              stop interval=0s timeout=120 (galera-stop-interval-0s)
[...]

此输出显示,与简单捆绑包不同,galera-bundle 资源包含明确的资源配置,用于决定多状态资源的所有方面。

注意

虽然服务可以同时在多个 Controller 节点上运行,但 Controller 节点本身可能无法侦听访问这些服务所需的 IP 地址。有关如何检查服务的 IP 地址的详情请参考 第 3.4 节 “查看高可用性集群中虚拟 IP 的资源信息”