Заводим кворум без фундаментальщины и теории 🤷♂️ (думаю, что по этому поводу статей хватает). Разбираем helm bitnami/rabbitmq-cluster-operator (чуть-чуть).
Поскольку Classic Queue Mirroring приказывает долго не жить, до версии 4.0 и Depricated со своим "Error while waiting for Mnesia tables", при этом нам настоятельно сватают Quorum Queues, значит, пора женить 👰🏻🤵🏻!
При создании не напоритесь на "безобидное" ограничение символов в названии со странным сообщением: "INSTALLATION FAILED: "rabbitmq-cluster-operator-rabbitmq-messaging-topology-operator" already exists
Но простого:
helm upgrade --install rmqco bitnami/rabbitmq-cluster-operator
нам будет мало. Развернётся только:
Cluster Operator - автоматизирует подготовку, управление и эксплуатацию кластеров RabbitMQ
Messaging Topology Operator - управляет топологиями обмена сообщениями RabbitMQ в кластере RabbitMQ
Необходимо добавить сам сервер RabbitMQ (с логами в json формате конечно же) через helm values из файла rabbitmqCluster.yaml:
extraDeploy:
- apiVersion: rabbitmq.com/v1beta1
kind: RabbitmqCluster
metadata:
name: rabbitmq
spec:
replicas: 1
persistence:
storage: 8Gi
rabbitmq:
additionalConfig: |
log.console.formatter = json
helm upgrade --install rmqco bitnami/rabbitmq-cluster-operator -f rabbitmqCluster.yaml
Если необходимо задать пользователя по умолчанию самим, несмотря на то, что при создании автоматически генерируется пользователь с административными правами, то требуется создать секрет с нашим именем <RabbitmqCluster>-default-user, но обязательно перед созданием RabbitMQ кластера:
apiVersion: v1
kind: Secret
metadata:
name: rabbitmq-default-user
stringData:
default_user.conf: |
default_user = <USERNAME-HERE>
default_pass = <PASSWORD-HERE>
password: <PASSWORD-HERE>
username: <USERNAME-HERE>
Можно создать дополнительных пользователей с назначением прав и с использованием секрета:
---
apiVersion: v1
kind: Secret
metadata:
name: rabbitmquser-cred
type: Opaque
stringData:
username: rabbitmquser
password: verysecurepw
---
apiVersion: rabbitmq.com/v1beta1
kind: User
metadata:
name: rabbitmquser
spec:
rabbitmqClusterReference:
name: rabbitmq
importCredentialsSecret:
name: rabbitmquser-cred
---
apiVersion: rabbitmq.com/v1beta1
kind: Permission
metadata:
name: rabbitmquser
spec:
vhost: "/"
user: "rabbitmquser"
permissions:
write: ".*"
configure: ".*"
read: ".*"
rabbitmqClusterReference:
name: rabbitmq
Остался мониторинг самого RabbitMQ и оператора. Пример для ServiceMonitor:
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: rabbitmq
spec:
endpoints:
- port: prometheus
scheme: http
interval: 15s
scrapeTimeout: 14s
- port: prometheus
scheme: http
path: /metrics/detailed
params:
family:
- queue_coarse_metrics
- queue_metrics
interval: 15s
scrapeTimeout: 14s
selector:
matchLabels:
app.kubernetes.io/component: rabbitmq
Ну и конечно же это всё можно использовать в extraDeploy:
rabbitmqCluster.yaml
extraDeploy:
- apiVersion: rabbitmq.com/v1beta1
kind: RabbitmqCluster
metadata:
name: rabbitmq
spec:
replicas: 1
persistence:
storage: 8Gi
rabbitmq:
additionalConfig: |
prometheus.return_per_object_metrics = true
log.console.formatter = json
- apiVersion: rabbitmq.com/v1beta1
kind: User
metadata:
name: rabbitmquser
spec:
rabbitmqClusterReference:
name: rabbitmq
importCredentialsSecret:
name: rabbitmquser-cred
- apiVersion: rabbitmq.com/v1beta1
kind: Permission
metadata:
name: rabbitmquser
spec:
vhost: "/"
user: "rabbitmquser"
permissions:
write: ".*"
configure: ".*"
read: ".*"
rabbitmqClusterReference:
name: rabbitmq
- apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: rabbitmq
spec:
endpoints:
- port: prometheus
scheme: http
interval: 15s
scrapeTimeout: 14s
- port: prometheus
scheme: http
path: /metrics/detailed
params:
family:
- queue_coarse_metrics
- queue_metrics
interval: 15s
scrapeTimeout: 14s
selector:
matchLabels:
app.kubernetes.io/component: rabbitmq
также добавим запуск оператора с отслеживанием одного namespace nsqrmq с мониторингом и шлюпками и тремя репликами (не забудьте создать секреты):
helm -n nsrmq upgrade --install rmqco bitnami/rabbitmq-cluster-operator -f rabbitmqCluster.yaml \
--set clusterOperator.watchAllNamespaces=false \
--set clusterOperator.watchNamespaces={nsrmq} \
--set msgTopologyOperator.watchAllNamespaces=false \
--set msgTopologyOperator.watchNamespaces={nsrmq} \
--set extraDeploy[0].spec.replicas=3 \
--set clusterOperator.metrics.service.enabled=true \
--set clusterOperator.metrics.serviceMonitor.enabled=true \
--timeout 2m0s
З.ы. Уже запущенные реплики просто так не уменьшить.
Ещё немного примеров для cluster operator и messaging topology operator.