第 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,这需要控制并在不同节点上设置服务状态的特定资源代理。
-
您不能使用
podman
或systemctl
管理捆绑包或容器。您可以使用 命令检查服务的状态,但您必须使用 Pacemaker 对这些服务执行操作。 -
Pacemaker 控制的 podman 容器,Podman 会将
RestartPolicy
设置为no
。这是为了确保 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
简单捆绑包的设置:
$ 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 的本地 registry。 -
Network
: Container Network type,本例中为"host
"。 -
选项
:容器的特定选项。 -
副本
:指示容器必须在集群中运行多少个副本。每个捆绑包包含三个容器,每个 Controller 节点对应一个容器。 -
run-command
: 用于生成容器的 System 命令。 -
存储映射 :将每个主机上的本地路径映射到容器。
haproxy
配置位于/var/lib/config-data/puppet-generated/haproxy/etc/haproxy/haproxy.cfg
文件中,而不是/etc/haproxy/haproxy.cfg
文件中。
虽然 HAProxy 通过对所选服务进行负载平衡流量来提供高可用性服务,但您可以通过将其作为 Pacemaker 捆绑包服务进行管理,来将 HAProxy 配置为高度可用的服务。
3.1.2. 复杂的 Bundle Set 资源(复杂捆绑包)
复杂的 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 的资源信息”。