Установка RabbitMQ

Базовая установка

Официальная документация тут https://www.rabbitmq.com/kubernetes/operator/operator-overview.html

Кластер развертывается посредством специального оператора. Для его установки применяем команду

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

Далее проверям все ли запустилось.

kubectl get all -n rabbitmq-system

Результат должен быть примерно таким

NAME                                             READY   STATUS    RESTARTS   AGE
pod/rabbitmq-cluster-operator-56f46f6b76-wh52r   1/1     Running   0          37h

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

NAME                                                   DESIRED   CURRENT   READY   AGE
replicaset.apps/rabbitmq-cluster-operator-56f46f6b76   1         1         1       37h

Если еще не установлено нужно установить доступ к локальному диску. Это не обязательно, можно подключить сетевой. Смотрите в примерах. Ссылка будет ниже.

kubectl apply -f https://raw.githubusercontent.com/rancher/local-path-provisioner/master/deploy/local-path-storage.yaml

И делаем его по умолчанию

kubectl annotate storageclass local-path storageclass.kubernetes.io/is-default-class=true

Если нужен доступ по tls, то добавляем сертификаты, если нет то нужно будет убрать секцию tls из конфига.

kubectl create secret tls my-sert --key my.key  --cert my.pem`

И сам сценарий развертывания кластера

apiVersion: rabbitmq.com/v1beta1
kind: RabbitmqCluster
metadata:
  name: rabbitmq-cluster-prod
spec:
  replicas: 3
  tls:
    secretName: my-sert
  resources:
    requests:
      cpu: 1
      memory: 1Gi
    limits:
      cpu: 1
      memory: 1Gi
  rabbitmq:
    additionalPlugins:
      - rabbitmq_management
    additionalConfig: |
      # Разрешаем занимать почти всю память
      vm_memory_high_watermark_paging_ratio = 0.99
      # Делаем юзера админом
      default_user_tags.administrator = true
      default_user = username
      default_pass = passforuser

И применям. Ждем пока кластер развернется.

kubectl get pods

Статус должен быть Running.

Проброс портов во вне

Для того, что бы сервис рабита был доступен из интернета нужно пробросить порты. Мы будет использовать ingress-nginx .
По умолчанию можно пробросить только http протокол. Но есть выход.
Для начала, лучше всего установить ingress-nginx из сценария yaml, что бы можно было его слегка подправить.

Документация по установке ingress-nginx
https://kubernetes.github.io/ingress-nginx/deploy/

Качаем yaml.

wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.7.0/deploy/static/provider/cloud/deploy.yaml

После первой секции по созданию неймспейса добавляем конфиг

apiVersion: v1
kind: ConfigMap
metadata:
  name: tcp-services
  namespace: ingress-nginx
data:
  55671: "default/rabbitmq-cluster-prod:5671"
  55672: "default/rabbitmq-cluster-prod:5672"

Далее в kind: Service name: ingress-nginx-controller в секции ports добавляем порты

  - name: rabbit-tls
    port: 55671
    protocol: TCP
    targetPort: 55671
  - name: rabbit
    port: 55672
    protocol: TCP
    targetPort: 55672

В kind: Deployment в секции args добавляем еще один параметр

        - --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services

Если нужно расширить nginx на несколько нод, читаем тут https://kiran-snippets.ru/job/linux/kubernetes/100

Официальная документация https://kubernetes.github.io/ingress-nginx/user-guide/exposing-tcp-udp-services/

Применяем изменения. И пробуем подключиться.

Доступ к конфигурации из вне

Есть два способа настроить доступ к веб интерфейсу раббита.

Первый и самый простой вводим команду

kubectl port-forward rabbitmq-cluster-prod-server-0 15672:15672

И подключаемся на локльном компьютере на адрес 127.0.0.1:15672

Второй способ так же пробрасываем порт во вне

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: rabbit-control
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /$1
    # Разрешаем доступ только с определнных адресов     
    nginx.ingress.kubernetes.io/whitelist-source-range: 49.36.0.1/32
spec:
  # если не надо, убираем
  tls
  - hosts:
    - my.site.ru
    secretName: my-sert
  rules:
  - host: my.site.ru
    http:
      paths:
      - path: /(.*)
        pathType: Prefix
        backend:
          service:
            name: rabbitmq-cluster-prod
            port:
              number: 15672

Применяем и пробуем.

Дополнительно

Просмотр кластера

kubectl get rabbitmqclusters.rabbitmq.com

Просмотр логов оператора

kubectl -n rabbitmq-system logs -l app.kubernetes.io/name=rabbitmq-cluster-operator

Удаление кластера

kubectl delete rabbitmqclusters.rabbitmq.com

Ссылка на примеры конфигов для раббита https://github.com/rabbitmq/cluster-operator/tree/main/docs/examples/

[ Править ]

@kiranananda