This implements a global toggle `om_enable_rabbitmq_quorum_queues` to enable quorum queues for each service in RabbitMQ, similar to what was done for HA[0]. Quorum Queues are enabled by default. Quorum queues are more reliable, safer, simpler and faster than replicated mirrored classic queues[1]. Mirrored classic queues are deprecated and scheduled for removal in RabbitMQ 4.0[2]. Notice, that we do not need a new policy in the RabbitMQ definitions template, because their usage is enabled on the client side and can't be set using a policy[3]. Notice also, that quorum queues are not yet enabled in oslo.messaging for the usage of reply_ and fanout_ queues (transient queues). This will change once[4] is merged. [0]: https://review.opendev.org/c/openstack/kolla-ansible/+/867771 [1]: https://www.rabbitmq.com/quorum-queues.html [2]: https://blog.rabbitmq.com/posts/2021/08/4.0-deprecation-announcements/ [3]: https://www.rabbitmq.com/quorum-queues.html#declaring [4]: https://review.opendev.org/c/openstack/oslo.messaging/+/888479 Signed-off-by: Sven Kieske <kieske@osism.tech> Change-Id: I6c033d460a5c9b93c346e9e47e93b159d3c27830
5.8 KiB
RabbitMQ
RabbitMQ is a message broker written in Erlang. It is currently the default provider of message queues in Kolla Ansible deployments.
TLS encryption
There are a number of channels to consider when securing RabbitMQ communication. Kolla Ansible currently supports TLS encryption of the following:
- client-server traffic, typically between OpenStack services using the :oslo.messaging-doc:oslo.messaging </> library and RabbitMQ
- RabbitMQ Management API and UI (frontend connection to HAProxy only)
Encryption of the following channels is not currently supported:
- RabbitMQ cluster traffic between RabbitMQ server nodes
- RabbitMQ CLI communication with RabbitMQ server nodes
- RabbitMQ Management API and UI (backend connection from HAProxy to RabbitMQ)
Client-server
Encryption of client-server traffic is enabled by setting
rabbitmq_enable_tls to true. Additionally,
certificates and keys must be available in the following paths (in
priority order):
Certificates:
"{{ kolla_certificates_dir }}/{{ inventory_hostname }}/rabbitmq-cert.pem""{{ kolla_certificates_dir }}/{{ inventory_hostname }}-cert.pem""{{ kolla_certificates_dir }}/rabbitmq-cert.pem"
Keys:
"{{ kolla_certificates_dir }}/{{ inventory_hostname }}/rabbitmq-key.pem""{{ kolla_certificates_dir }}/{{ inventory_hostname }}-key.pem""{{ kolla_certificates_dir }}/rabbitmq-key.pem"
The default for kolla_certificates_dir is
/etc/kolla/certificates.
The certificates must be valid for the IP address of the host running RabbitMQ on the API network.
Additional TLS configuration options may be passed to RabbitMQ via
rabbitmq_tls_options. This should be a dict, and the keys
will be prefixed with ssl_options.. For example:
rabbitmq_tls_options:
ciphers.1: ECDHE-ECDSA-AES256-GCM-SHA384
ciphers.2: ECDHE-RSA-AES256-GCM-SHA384
ciphers.3: ECDHE-ECDSA-AES256-SHA384
honor_cipher_order: true
honor_ecc_order: trueDetails on configuration of RabbitMQ for TLS can be found in the RabbitMQ documentation.
When om_rabbitmq_enable_tls is true (it
defaults to the value of rabbitmq_enable_tls), applicable
OpenStack services will be configured to use oslo.messaging with TLS
enabled. The CA certificate is configured via
om_rabbitmq_cacert (it defaults to
rabbitmq_cacert, which points to the system's trusted CA
certificate bundle for TLS). Note that there is currently no support for
using client certificates.
For testing purposes, Kolla Ansible provides the
kolla-ansible certificates command, which will generate
self-signed certificates for RabbitMQ if
rabbitmq_enable_tls is true.
Management API and UI
The management API and UI are accessed via HAProxy, exposed only on
the internal VIP. As such, traffic to this endpoint is encrypted when
kolla_enable_tls_internal is true. See tls-configuration.
Passing arguments to RabbitMQ server's Erlang VM
Erlang programs run in an Erlang VM (virtual machine) and use the Erlang runtime. The Erlang VM can be configured.
Kolla Ansible makes it possible to pass arguments to the Erlang VM
via the usage of the rabbitmq_server_additional_erl_args
variable. The contents of it are appended to the
RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS environment variable
which is passed to the RabbitMQ server startup script. Kolla Ansible
already configures RabbitMQ server for IPv6 (if necessary). Any argument
can be passed there as documented in https://www.rabbitmq.com/runtime.html
The default value for
rabbitmq_server_additional_erl_args is
+S 2:2 +sbwt none +sbwtdcpu none +sbwtdio none.
By default RabbitMQ starts N schedulers where N is the number of CPU
cores, including hyper-threaded cores. This is fine when you assume all
CPUs are dedicated to RabbitMQ. Its not a good idea in a typical Kolla
Ansible setup. Here we go for two scheduler threads
(+S 2:2). More details can be found here: https://www.rabbitmq.com/runtime.html#scheduling
and here: https://erlang.org/doc/man/erl.html#emulator-flags
The +sbwt none +sbwtdcpu none +sbwtdio none arguments
prevent busy waiting of the scheduler, for more details see: https://www.rabbitmq.com/runtime.html#busy-waiting.
High Availability
- RabbitMQ offers two options to configure HA:
-
- Quorum queues (enabled by default and controlled by
om_enable_rabbitmq_quorum_queuesvariable) - Classic queue mirroring and durable queues (deprecated in RabbitMQ
and to be dropped in 4.0, controlled by
om_enable_rabbitmq_high_availability)
- Quorum queues (enabled by default and controlled by
There are some queue types which are intentionally not mirrored using
the exclusionary pattern
^(?!(amq\\.)|(.*_fanout_)|(reply_)).*.
After enabling this value on a running system, there are some additional steps needed to migrate from transient to durable queues.
Warning
Since the default changed from non-HA to Quorum queues in Bobcat release, following procedure is required to be carried out before an upgrade.
Stop all OpenStack services which use RabbitMQ, so that they will not attempt to recreate any queues yet.
kolla-ansible stop --tags <service-tags>Generate the new config for all services.
kolla-ansible genconfigReconfigure RabbitMQ.
kolla-ansible reconfigure --tags rabbitmqReset the state on each RabbitMQ, to remove the old transient queues and exchanges.
kolla-ansible rabbitmq-reset-stateStart the OpenStack services again, at which point they will recreate the appropriate queues as durable.
kolla-ansible deploy --tags <service-tags>