- Вопрос или проблема
- apiVersion: apps/v1 kind: StatefulSet metadata: name: rabbitmq-node2a namespace: rabbitmq-cluster spec: serviceName: rabbitmq-node2a replicas: 1 selector: matchLabels: app: rabbitmq-node2a template: metadata: labels: app: rabbitmq-node2a spec: containers: – name: rabbitmq image: rabbitmq:4.0.5-management ports: – containerPort: 5672 # Уникальный AMQP порт – containerPort: 15672 # Уникальный интерфейс управления – containerPort: 4369 # EPMD порт – containerPort: 25672 # Порт для общения в кластере env: – name: RABBITMQ_ERLANG_COOKIE value: “mysecretcookie” – name: RABBITMQ_DEFAULT_USER value: “admin” – name: RABBITMQ_DEFAULT_PASS value: “rabbitmqpassword”
- apiVersion: apps/v1 kind: StatefulSet metadata: name: rabbitmq-node2b namespace: rabbitmq-cluster spec: serviceName: rabbitmq-node2b replicas: 1 selector: matchLabels: app: rabbitmq-node2b template: metadata: labels: app: rabbitmq-node2b spec: containers: – name: rabbitmq image: rabbitmq:4.0.5-management ports: – containerPort: 5672 # Уникальный AMQP порт – containerPort: 15672 # Уникальный интерфейс управления – containerPort: 4369 # EPMD порт – containerPort: 25672 # Порт для общения в кластере env: – name: RABBITMQ_ERLANG_COOKIE value: “mysecretcookie” – name: RABBITMQ_DEFAULT_USER value: “admin” – name: RABBITMQ_DEFAULT_PASS value: “rabbitmqpassword”
- Ответ или решение
- Теоретическая основа (Т):
- Пример (Э):
- Проблема, с которой вы столкнулись:
- Применение (А):
Вопрос или проблема
Я пытаюсь создать Quorum очередь в RabbitMQ, для которой нужно 3 узла. В данный момент у меня есть 2 физических машины: одна с IP 192.168.2.70 и другая с IP 192.168.2.60. На :70 я установил 2 pod – 2 RabbitMQ(V4.05)[node2a-0 и node2b-0], а на :60 установил 1 pod -1[node1-0] RabbitMQ. Все три работают независимо хорошо. Я смог заставить :70’s 2 pod создать кластер. Теперь мне нужно присоединить :60 к кластеру на :70. К сожалению, я не могу присоединить к кластеру. Я поделюсь 3 YAML файлами и ошибкой присоединения ниже
node1-0.yaml
apiVersion: apps/v1 kind: StatefulSet metadata: name: rabbitmq-node1 namespace: rabbitmq-cluster spec: serviceName: rabbitmq-node1 replicas: 1 selector: matchLabels: app: rabbitmq-node1 template: metadata: labels: app: rabbitmq-node1 spec: containers: – name: rabbitmq image: rabbitmq:4.0.5-management ports: – containerPort: 5672 # AMQP порт – containerPort: 15672 # Интерфейс управления – containerPort: 4369 # EPMD порт – containerPort: 25672 # Порт для общения в кластере env: – name: RABBITMQ_ERLANG_COOKIE value: “mysecretcookie” – name: RABBITMQ_DEFAULT_USER value: “admin” – name: RABBITMQ_DEFAULT_PASS value: “rabbitmqpassword” – name: RABBITMQ_USE_LONGNAME value: “true”
-
name: RABBITMQ_NODENAME
value: “rabbit@rabbit1”
– name: RABBITMQ_CLUSTER_PARTITION_HANDLING
value: “autoheal”
– name: RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS
value: “-rabbit peer_discovery_backend rabbit_peer_discovery_k8s”
– name: RABBITMQ_PEER_DISCOVERY_K8S_SERVICE_NAME
value: “rabbitmq”
apiVersion: v1
kind: Service
metadata:
name: rabbitmq-node1
namespace: rabbitmq-cluster
spec:
ports:
– port: 5672
targetPort: 5672
name: amqp
nodePort: 30171
– port: 4369
targetPort: 4369
name: epmd
nodePort: 30172
– port: 25672
targetPort: 25672
name: clustering
nodePort: 30173
– port: 15672
targetPort: 15672
name: management
nodePort: 30174
selector:
app: rabbitmq-node1
type: NodePort
node2a-0.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: rabbitmq-node2a
namespace: rabbitmq-cluster
spec:
serviceName: rabbitmq-node2a
replicas: 1
selector:
matchLabels:
app: rabbitmq-node2a
template:
metadata:
labels:
app: rabbitmq-node2a
spec:
containers:
– name: rabbitmq
image: rabbitmq:4.0.5-management
ports:
– containerPort: 5672 # Уникальный AMQP порт
– containerPort: 15672 # Уникальный интерфейс управления
– containerPort: 4369 # EPMD порт
– containerPort: 25672 # Порт для общения в кластере
env:
– name: RABBITMQ_ERLANG_COOKIE
value: “mysecretcookie”
– name: RABBITMQ_DEFAULT_USER
value: “admin”
– name: RABBITMQ_DEFAULT_PASS
value: “rabbitmqpassword”
apiVersion: v1
kind: Service
metadata:
name: rabbitmq-node2a
namespace: rabbitmq-cluster
spec:
ports:
- port: 5672
targetPort: 5672
name: amqp
nodePort: 30271 - port: 4369
targetPort: 4369
name: epmd
nodePort: 30272 - port: 25672
targetPort: 25672
name: clustering
nodePort: 30273 - port: 15672
node2b-0.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: rabbitmq-node2b
namespace: rabbitmq-cluster
spec:
serviceName: rabbitmq-node2b
replicas: 1
selector:
matchLabels:
app: rabbitmq-node2b
template:
metadata:
labels:
app: rabbitmq-node2b
spec:
containers:
– name: rabbitmq
image: rabbitmq:4.0.5-management
ports:
– containerPort: 5672 # Уникальный AMQP порт
– containerPort: 15672 # Уникальный интерфейс управления
– containerPort: 4369 # EPMD порт
– containerPort: 25672 # Порт для общения в кластере
env:
– name: RABBITMQ_ERLANG_COOKIE
value: “mysecretcookie”
– name: RABBITMQ_DEFAULT_USER
value: “admin”
– name: RABBITMQ_DEFAULT_PASS
value: “rabbitmqpassword”
apiVersion: v1
kind: Service
metadata:
name: rabbitmq-node2b
namespace: rabbitmq-cluster
spec:
ports:
- port: 5672
targetPort: 5672
name: amqp
nodePort: 30371 - port: 4369
targetPort: 4369
name: epmd
nodePort: 30372 - port: 25672
targetPort: 25672
name: clustering
nodePort: 30373 - port: 15672
Ошибка при попытке присоединения node1-0 к node2a-0/node2b-0
api03@finsource-api03:~$ sudo microk8s kubectl exec -it rabbitmq-node1-0 -n rabbitmq-cluster — rabbitmqctl stop_app Остановка приложения rabbit на узле rabbitmq-node1-0@rabbitmq-node1-0.rabbitmq-node1.rabbitmq-cluster.svc.cluster.local … api03@finsource-api03:~$ sudo microk8s kubectl exec -it rabbitmq-node1-0 -n rabbitmq-cluster — rabbitmqctl join_cluster rabbitmq-node2a-0@rabbitmq-node2a-0.rabbitmq-node2a.rabbitmq-cluster.svc.cluster.local
Кластеризация узла rabbitmq-node1-0@rabbitmq-node1-0.rabbitmq-node1.rabbitmq-cluster.svc.cluster.local с rabbitmq-node2a-0@rabbitmq-node2a-0.rabbitmq-node2a.rabbitmq-cluster.svc.cluster.local
12:46:51.983 [ошибка] Функциональные флаги: ошибка во время выполнения: Функциональные флаги: rabbit_ff_controller:running_nodes[] Функциональные флаги: на узле rabbitmq-node2a-0@rabbitmq-node2a-0.rabbitmq-node2a.rabbitmq-cluster.svc.cluster.local: Функциональные флаги: исключение ошибка: {erpc,noconnection} Функциональные флаги: в функции erpc:call/5 (erpc.erl, строка 1376) Функциональные флаги: в вызове rabbit_ff_controller:rpc_call/5 (rabbit_ff_controller.erl, строка 1394) Функциональные флаги: в вызове rabbit_ff_controller:list_nodes_clustered_with/1 (rabbit_ff_controller.erl, строка 486) Функциональные флаги: в вызове rabbit_ff_controller:check_node_compatibility_task/2 (rabbit_ff_controller.erl, строка 398) Функциональные флаги: в вызове rabbit_db_cluster:can_join/1 (rabbit_db_cluster.erl, строка 60) Функциональные флаги: в вызове rabbit_db_cluster:join/2 (rabbit_db_cluster.erl, строка 92) Функциональные флаги: в вызове erpc:execute_call/4 (erpc.erl, строка 1250)
Ошибка: {:aborted_feature_flags_compat_check, {:error, {:erpc, :noconnection}}} команда завершилась с кодом выхода 69
Как это можно исправить?
Ответ или решение
Создание RabbitMQ кластера в среде Kubernetes с использованием MicroK8s может быть сложной задачей, особенно если вы пытаетесь объединить узлы, находящиеся на разных физических машинах. В вашем случае вы столкнулись с проблемой при добавлении узла node1-0
на 192.168.2.60
в уже существующий кластер, состоящий из node2a-0
и node2b-0
на 192.168.2.70
. Давайте разберёмся, как решить эту проблему, и какие шаги нужно предпринять для успешного создания кластера RabbitMQ.
Теоретическая основа (Т):
RabbitMQ управляет кластеризацией с помощью узлов, которые должны быть единообразно конфигурированы. Одним из ключевых аспектов является использование Erlang cookie, который позволяет узлам доверять друг другу. Все узлы должны иметь одинаковый cookie для успешной кластеризации. Кроме того, RabbitMQ использует несколько специфичных портов для общения узлов между собой: 4369 для epmd, 25672 для внутренней кластерной коммуникации и другие.
Пример (Э):
Рассмотрим вашу текущую конфигурацию YAML для узлов node1-0
, node2a-0
и node2b-0
. Основные параметры включают настройки контейнера RabbitMQ, порты и переменные окружения, такие как RABBITMQ_ERLANG_COOKIE
и RABBITMQ_NODENAME
. Для успешной интеграции всех узлов в кластер они должны быть согласованы между собой.
Проблема, с которой вы столкнулись:
Вы получаете ошибку {:aborted_feature_flags_compat_check, {:error, {:erpc, :noconnection}}}
при попытке присоединить узел node1-0
к кластеру. Это указывает на проблему с соединением между узлами, связанную с несоответствием параметров конфигурации.
Применение (А):
-
Проверьте Erlang Cookie:
Убедитесь, что значениеRABBITMQ_ERLANG_COOKIE
идентично на всех узлах. Это гарантирует, что узлы могут доверять друг другу. -
Убедитесь в корректности именования узлов:
ПараметрRABBITMQ_NODENAME
должен быть уникален для каждого узла, но в то же время следовать согласованной структуре. Убедитесь, что имена действительно уникальны и правильно настроены. -
Проверьте сетевые настройки и доступность портов:
Убедитесь, что межузловая связь разрешена для всех нужных портов (4369, 25672 и др.). Настройки брандмауэра и маршрутизации должны обеспечивать возможность связи между всеми узлами. -
Проверьте совместимость версий:
Убедитесь, что используемая версия RabbitMQ поддерживает нужные вам функции и совместима между узлами. -
Используйте правильные DNS-сервисы и настройки:
Убедитесь, что имена узлов правильно разрешаются в вашей Kubernetes-среде, и все необходимые сервисы имеют корректные DNS-записи. -
Рассмотрите использование доп. инструментов диагностики:
Используйте утилиты, такие какrabbitmq-diagnostics
иrabbitmq-ctl
, для диагностики проблем с кластеризацией и проверки работы узлов. -
Логирование и управление журналами:
Включите расширенное логирование на всех узлах, чтобы выявить скрытые проблемы в процессе связи и кластеризации. -
Развертывание с учетом особенностей микросервисов:
Если возможно, используйте операторы специфичные для RabbitMQ, которые могут автоматизировать часть конфигураций и упростить процесс развертывания.
Следуя этим шагам, вы должны устранить возникшую проблему и успешно интегрировать узел node1-0
в существующий кластер RabbitMQ. Ваше внимание к деталям конфигурации и усилия по отладке являются ключом к успешному решению проблемы.