Заводим кворум без фундаментальщины и теории ?‍♂️ (думаю, что по этому поводу статей хватает). Разбираем 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.

Комментарии (0)