Как развернуть RabbitMQ с операторами Kubernetes за 1 час

by moiseevrus
RabbitMQ является наиболее широко используемым брокером сообщений с открытым исходным кодом. Прежде чем говорить о RabbitMQ, давайте определим, что такое брокер сообщений. Проще говоря, это позволяет приложениям и службам взаимодействовать друг с другом и обмениваться данными. На диаграмме ниже представлен вариант использования шины событий с использованием брокера сообщений:

Концентратор связи программного обеспечения с брокером сообщений (шина событий)
Концентратор связи программного обеспечения с брокером сообщений (шина событий)

Брокеры сообщений очень полезны для разделения связи между вашими компонентами. Это дает вам возможность создавать полностью распределенные и современные архитектуры. В семействе брокеров сообщений вы можете найти другие популярные имена, такие как Apache Kafka , Apache ActiveMQ .

RabbitMQ легковесен и прост в развертывании локально или в облаке. Он предлагает интересные функции:

  • Он поддерживает несколько протоколов обмена сообщениями, таких как AMQP, STOMP, MQTT и т. д.
  • Его можно развернуть в распределенных и федеративных конфигурациях, чтобы удовлетворить требования высокой масштабируемости и высокой доступности.
  • Он предоставляет пользовательский интерфейс для управления и HTTP API для мониторинга.
  • Его можно расширить с помощью множества доступных плагинов.
  • Реализованы клиенты на многих языках программирования: Python, Javascript, Java, Go, Ruby и др.

В этом руководстве мы сосредоточимся на том, как развернуть высокодоступный кластер RabbitMQ в кластере Kubernetes. Выбор будет заключаться в использовании операторов Kubernetes для эффективного достижения этой цели. Мы увидим преимущества их использования и пошаговое развертывание ресурсов RabbitMQ.


Зачем использовать операторы Kubernetes?

«Операторы — это программные расширения для Kubernetes, которые используют настраиваемые ресурсы для управления приложениями и их компонентами». https://kubernetes.io/docs/concepts/extend-kubernetes/operator/

Операторы в Kubernetes позволяют расширять поведение кластера без изменения кода самого Kubernetes. В нашем случае поведение RabbitMQ будет делегировано операторам. Это сэкономит нам много времени на нашей стороне.

Команда RabbitMQ разрабатывает и поддерживает два оператора Kubernetes:

  • Оператор RabbitMQ Cluster Kubernetes для автоматизации подготовки, управления и эксплуатации кластеров RabbitMQ, работающих в Kubernetes.
  • Оператор топологии обмена сообщениями RabbitMQ для управления топологией кластеров (разрешения, пользователи и т. д.)

Операторы устанавливаются через CRD ( Custom Resource Definition ) в кластере Kubernetes. После установки в кластере становятся известны новые ресурсы, такие как классические виды (Pod, Deployment и т. д.). Вам просто нужно создать манифесты YAML, чтобы вызывать их.


Развертывание оператора Kubernetes кластера RabbitMQ

CRD доступен в релизах репозитория . Установите его с помощью kubectlкоманды:

$ kubectl apply -f "https://github.com/rabbitmq/cluster-operator/releases/latest/download/cluster-operator.yml"

namespace/rabbitmq-system created
customresourcedefinition.apiextensions.k8s.io/rabbitmqclusters.rabbitmq.com created
serviceaccount/rabbitmq-cluster-operator created
role.rbac.authorization.k8s.io/rabbitmq-cluster-leader-election-role created
clusterrole.rbac.authorization.k8s.io/rabbitmq-cluster-operator-role created
rolebinding.rbac.authorization.k8s.io/rabbitmq-cluster-leader-election-rolebinding created
clusterrolebinding.rbac.authorization.k8s.io/rabbitmq-cluster-operator-rolebinding created
deployment.apps/rabbitmq-cluster-operator created
Установка оператора RabbitMQ Cluster Kubernetes

Новые ресурсы находятся внутри rabbitmq-systemпространства имен:

$ kubectl get all -n rabbitmq-system
NAME                                             READY   STATUS    RESTARTS   AGE
pod/rabbitmq-cluster-operator-7cbf865f89-9pq6n   1/1     Running   4          2d21h

NAME                                        READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/rabbitmq-cluster-operator   1/1     1            1           2d21h

NAME                                                   DESIRED   CURRENT   READY   AGE
replicaset.apps/rabbitmq-cluster-operator-7cbf865f89   1         1         1       2d21h
Ресурсы оператора RabbitMQ кластера Kubernetes в пространстве имен rabbitmq-system

Убедитесь, что все ресурсы готовы к следующему шагу.


Создайте кластер RabbitMQ

Оператор кластера RabbitMQ предоставляет RabbitmqClusterвид. Теперь вы можете создать столько кластеров RabbitMQ, сколько хотите, в своем кластере Kubernetes. Вам нужно просто определить их в манифесте YAML следующим образом:

apiVersion: rabbitmq.com/v1beta1
kind: RabbitmqCluster
metadata:
  labels:
    app: rabbitmq
  name: rabbitmq
spec:
  replicas: 3
  image: rabbitmq:3.9.11
  service:
    type: ClusterIP
  persistence:
    storageClassName: hostpath
    storage: 10
  resources:
    requests:
      cpu: 256m
      memory: 1Gi
    limits:
      cpu: 256m
      memory: 1Gi
  rabbitmq:
    additionalPlugins:
      - rabbitmq_management
      - rabbitmq_peer_discovery_k8s
    additionalConfig: |
      cluster_formation.peer_discovery_backend = rabbit_peer_discovery_k8s
      cluster_formation.k8s.host = kubernetes.default.svc.cluster.local
      cluster_formation.k8s.address_type = hostname
      vm_memory_high_watermark_paging_ratio = 0.85
      cluster_formation.node_cleanup.interval = 10
      cluster_partition_handling = autoheal
      queue_master_locator = min-masters
      loopback_users.guest = false
      default_user = guest
      default_pass = guest
    advancedConfig: ""
Манифест кластера RabbitMQ

Давайте повторим содержание манифеста выше:

  • Мы создаем своеобразный ресурс   Rabbitmqcluster. Он определяется CRD, который мы установили в предыдущей части.
  • Кластер имеет 3 реплики для обеспечения высокой доступности и отказоустойчивости.
  • Каждый модуль имеет четко определенные ресурсы.
  • Добавлены плагины: rabbitmq_managementдля интерфейса управления и rabbitmq_peer_discovery_k8sдля формирования кластера. Вы можете найти другие плагины здесь: https://www.rabbitmq.com/plugins.html .
  • Настройка кластера производится в additionalConfigполе: https://www.rabbitmq.com/configure.html#config-file .
  • Используемый тип услуги ClusterIP. Вы можете настроить LoadBalancerтип, если ваше приложение находится вне кластера.
  • Постоянство настроено. Данный пример работает в локальном кластере Kubernetes, поэтому класс хранилища — hostpath. Вы можете просмотреть классы, доступные в Kubernetes, которые соответствуют вашим потребностям: https://kubernetes.io/docs/concepts/storage/storage-classes/
$ kubectl create -f rabbitmq.yaml
$ kubectl get pods -l app.kubernetes.io/name=rabbitmq
NAME                READY   STATUS    RESTARTS   AGE
rabbitmq-server-0   1/1     Running   0          4m41s
rabbitmq-server-1   1/1     Running   0          4m41s
rabbitmq-server-2   1/1     Running   0          4m41s
Создание манифеста кластера RabbitMQ и контрольных модулей

Развертывание оператора топологии RabbitMQ

Теперь перейдем к оператору топологии RabbitMQ. Он позволяет вам управлять определенными ресурсами RabbitMQ, такими как пользователи и разрешения, например: https://www.rabbitmq.com/kubernetes/operator/using-topology-operator.html .

Этому оператору для работы нужен cert-manager. Разверните его и убедитесь, что все модули работоспособны:

$ kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.3.1/cert-manager.yaml
$ kubectl get pods -n cert-manager
NAME                                       READY   STATUS    RESTARTS   AGE
cert-manager-7dd5854bb4-vt5jn              1/1     Running   0          47s
cert-manager-cainjector-64c949654c-j2npq   1/1     Running   0          47s
cert-manager-webhook-6b57b9b886-f6gwt      1/1     Running   0          47s
Установка cert-manager

Установите ЦРД:

kubectl apply -f https://github.com/rabbitmq/messaging-topology-operator/releases/latest/download/messaging-topology-operator-with-certmanager.yaml
Установка оператора топологии RabbitMQ

Вот пример манифеста для настройки прав гостевого пользователя на выполнение тестов с аутентификацией:

apiVersion: rabbitmq.com/v1beta1
kind: Permission
metadata:
  name: rabbitmq-guest-permission
spec:
  vhost: /
  user: guest
  permissions:
    write: ".*"
    configure: ".*"
    read: ".*"
  rabbitmqClusterReference:
    name: rabbitmq
Манифест для создания разрешений для гостевого пользователя

Установите подключаемый модуль Kubectl оператора кластера RabbitMQ.

Команда RabbitMQ также предоставляет подключаемый модуль kubectl для использования оператора кластера RabbitMQ. Этот плагин автоматизирует многие взаимодействия с Kubernetes API и оператором кластера RabbitMQ.

Плагин требует krewустановленного диспетчера плагинов (здесь установка для MacOSX, проверьте документацию и адаптируйте для своей ОС)

(
  set -x; cd "$(mktemp -d)" &&
  OS="$(uname | tr '[:upper:]' '[:lower:]')" &&
  ARCH="$(uname -m | sed -e 's/x86_64/amd64/' -e 's/\(arm\)\(64\)\?.*/\1\2/' -e 's/aarch64$/arm64/')" &&
  KREW="krew-${OS}_${ARCH}" &&
  curl -fsSLO "https://github.com/kubernetes-sigs/krew/releases/latest/download/${KREW}.tar.gz" &&
  tar zxvf "${KREW}.tar.gz" &&
  ./"${KREW}" install krew
)
Установка менеджера плагинов krew на MacOSX

Обновите PATHпеременную среды, указав местоположение krew:

export PATH="${KREW_ROOT:-$HOME/.krew}/bin:$PATH"

Убедитесь, что установка прошла успешно:

$ kubectl krew

Установите плагин RabbitMQ:

$ kubectl krew install rabbitmq

Проверьте плагин RabbitMQ:

$ kubectl rabbitmq help

Вы можете получить свой кластер в списке:

$ kubectl rabbitmq list                          
NAME       ALLREPLICASREADY   RECONCILESUCCESS   AGE
rabbitmq   True               True               4d20h
Перечислите экземпляр кластера RabbitMQ в вашем кластере Kubernetes.

Вы также можете открыть непосредственно пользовательский интерфейс управления:

$ kubectl rabbitmq manage rabbitmq
Откройте интерфейс управления с помощью подключаемого модуля kubectl.
Интерфейс входа в систему управления RabbitMQ
Интерфейс входа в систему управления RabbitMQ 
Интерфейс управления RabbitMQ
Интерфейс управления RabbitMQ

Вывод

В этом руководстве мы увидели преимущества использования операторов для развертывания Kubernetes. Они обеспечивают прозрачность и легкое предоставление кластеров RabbitMQ. Он автоматизирует большую часть управления и позволяет определять топологию RabbitMQ через манифесты YAML. Наконец, мы увидели, как настроить подключаемый модуль kubectl для взаимодействия с оператором 

эта статья является переводом getbetterdevops.

You may also like

Leave a Comment