
Брокеры сообщений очень полезны для разделения связи между вашими компонентами. Это дает вам возможность создавать полностью распределенные и современные архитектуры. В семействе брокеров сообщений вы можете найти другие популярные имена, такие как Apache Kafka , Apache ActiveMQ .
RabbitMQ легковесен и прост в развертывании локально или в облаке. Он предлагает интересные функции:
- Он поддерживает несколько протоколов обмена сообщениями, таких как AMQP, STOMP, MQTT и т. д.
- Его можно развернуть в распределенных и федеративных конфигурациях, чтобы удовлетворить требования высокой масштабируемости и высокой доступности.
- Он предоставляет пользовательский интерфейс для управления и HTTP API для мониторинга.
- Его можно расширить с помощью множества доступных плагинов.
- Реализованы клиенты на многих языках программирования: Python, Javascript, Java, Go, Ruby и др.
В этом руководстве мы сосредоточимся на том, как развернуть высокодоступный кластер RabbitMQ в кластере Kubernetes. Выбор будет заключаться в использовании операторов Kubernetes для эффективного достижения этой цели. Мы увидим преимущества их использования и пошаговое развертывание ресурсов RabbitMQ.
Contents
Зачем использовать операторы 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-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
Оператор кластера 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: ""
Давайте повторим содержание манифеста выше:
- Мы создаем своеобразный ресурс
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, такими как пользователи и разрешения, например: 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
Установите ЦРД:
kubectl apply -f https://github.com/rabbitmq/messaging-topology-operator/releases/latest/download/messaging-topology-operator-with-certmanager.yaml
Вот пример манифеста для настройки прав гостевого пользователя на выполнение тестов с аутентификацией:
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
)
Обновите 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
Вы также можете открыть непосредственно пользовательский интерфейс управления:
$ kubectl rabbitmq manage rabbitmq


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