2016-02-14 5 views
3

Я успешно установил кластер rabbitmq, используя докер, чтобы понять концепцию кластеризации. Он работал отлично ниже докер Compose файла:Настройка кластера Rabbitmq в Kubernetes

rabbit1: 
    image: ipf-queue-node 
    hostname: rabbit1 
    cap_add: 
    - ALL 
    - NET_ADMIN 
    - SYS_ADMIN 
    ports: 
    - "5671:5671" 
    - "5672:5672" 
    - "15672:15672" 

rabbit2: 
    image: ipf-queue-node 
    hostname: rabbit2 
    cap_add: 
    - ALL 
    - NET_ADMIN 
    - SYS_ADMIN 
    links: 
    - rabbit1 
    environment: 
    - CLUSTERED=true 
    - CLUSTER_WITH=rabbit1 
    - RAM_NODE=true 
    ports: 
     - "5675:5671" 
     - "5673:5672" 
     - "15673:15672" 

Docker файл Содержание:

FROM queue-base 

# Create directories 
RUN mkdir /opt/rabbit 
RUN mkdir /opt/simulator 
RUN mkdir /opt/simulator/tools 

# Add the files from the local repository into the container 
ADD rabbitmq.config  /etc/rabbitmq/ 
ADD rabbitmq-env.conf /etc/rabbitmq/ 
ADD erlang.cookie  /var/lib/rabbitmq/.erlang.cookie 
ADD startclusternode.sh /opt/rabbit/ 
ADD debugnodes.sh  /opt/rabbit/ 
ADD tl     /bin/tl 
ADD rl     /bin/rl 
ADD rst     /bin/rst 

# Add the simulator tooling 
ADD simulator_tools/ /opt/simulator/tools/ 
ADD ./testca /tmp/ssl 
ADD ./server /tmp/ssl 

# Set the file permissions in the container 
RUN chmod 644 /etc/rabbitmq/rabbitmq.config 
RUN chmod 644 /etc/rabbitmq/rabbitmq-env.conf 
RUN chmod 400 /var/lib/rabbitmq/.erlang.cookie 
RUN chmod 777 /opt/rabbit/startclusternode.sh 
RUN chmod 777 /opt/rabbit/debugnodes.sh 
RUN chmod 777 /bin/tl 
RUN chmod 777 /bin/rl 
RUN chmod 777 /bin/rst 
RUN chmod -R 777 /opt/simulator 

# Set ownership permissions on files in the container 
RUN chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie 

# Expose ports inside the container to the host 
EXPOSE 5672 
EXPOSE 5671 
EXPOSE 15672 
EXPOSE 25672 

# Run this to debug the cluster nodes by allowing ssh login 
#CMD /opt/rabbit/debugnodes.sh 

# Run this to autostart the cluster nodes 
CMD /opt/rabbit/startclusternode.sh 

startclusternode.sh это скрипт для настройки кластера:

#!/bin/bash 

logfile="/tmp/rabbitnode.log" 
firsttimefile="/tmp/firsttimerunning" 

curhostname=`hostname` 
username="<<username>>" 
password="<<password>>" 
echo "" > $logfile 
echo "New Start Date:" >> $logfile 
date >> $logfile 
echo "" >> $logfile 

(sleep 40 ; \ 
rabbitmqctl add_user $username $password ; \ 
rabbitmqctl set_user_tags $username administrator ; \ 
rabbitmqctl add_vhost $curhostname ; \ 
rabbitmqctl add_vhost localhost; \ 
rabbitmqctl set_permissions -p $curhostname $username ".*" ".*" ".*" ; \ 
rabbitmqctl set_permissions -p localhost $username ".*" ".*" ".*" ; \ 
rabbitmqctl set_policy ha-all "" '{"ha-mode":"all","ha-sync-mode":"automatic"}' 
) & 

sleep 5 

# For version 3.5.6 the first time running the cluster needs to enable the plugins 
if [ -f $firsttimefile ]; then 
    echo "First Time Running Enabling Plugins" >> $logfile 
    /usr/sbin/rabbitmq-server -d & 
    echo "Waiting for RabbitMQ Server to start" >> $logfile 
    sleep 3 
    echo "Enabling Plugins" >> $logfile 
    /usr/sbin/rabbitmq-plugins enable rabbitmq_stomp rabbitmq_management rabbitmq_management_agent rabbitmq_management_visualiser rabbitmq_federation rabbitmq_federation_management sockjs >> $logfile 
    echo "Waiting for Plugins to finish" >> $logfile 
    sleep 1 
    echo "Stopping the RabbitMQ using stop_app" >> $logfile 
    /usr/sbin/rabbitmqctl stop_app 
    echo "Stopping the RabbitMQ using stop" >> $logfile 
    /usr/sbin/rabbitmqctl stop 

    echo "Stopping the RabbitMQ Server" >> $logfile 
    kill -9 `ps auwwx | grep rabbitmq-server | awk '{print $2}'` 
    sleep 1 

    echo "Done First Time Running Enabling Plugins" >> $logfile 
    rm -f $firsttimefile >> $logfile 
    echo "Done Cleanup First Time File" >> $logfile 


    # Allow the cluster nodes to wait for the master to start the first time 
    if [ -z "$CLUSTERED" ]; then 
    echo "Ignoring as this is the server node" >> $logfile 
    else 
    if [ -z "$CLUSTER_WITH" ]; then 
     echo "Ignoring as this is the cluster master node" >> $logfile 
    else 
     echo "Waiting for the master node to start up" >> $logfile 
     sleep 5 
     echo "Done waiting for the master node to start up" >> $logfile 
    fi 
    fi 
fi 


if [ -z "$CLUSTERED" ]; then 

    echo "Starting non-Clustered Server Instance" >> $logfile 
    # if not clustered then start it normally as if it is a single server 
    /usr/sbin/rabbitmq-server >> $logfile 
    echo "Done Starting non-Clustered Server Instance" >> $logfile 

    # Tail to keep the foreground process active. 
    tail -f /var/log/rabbitmq/* 

else 
    if [ -z "$CLUSTER_WITH" ]; then 
    # If clustered, but cluster is not specified then start normally as this could be the first server in the cluster 
    echo "Starting Single Server Instance" >> $logfile 
    /usr/sbin/rabbitmq-server >> $logfile 

    echo "Done Starting Single Server Instance" >> $logfile 
    else 
    echo "Starting Clustered Server Instance as a DETACHED single instance" >> $logfile 
    /usr/sbin/rabbitmq-server -detached >> $logfile 

    echo "Stopping App with /usr/sbin/rabbitmqctl stop_app" >> $logfile 
    /usr/sbin/rabbitmqctl stop_app >> $logfile 

    # This should attempt to join a cluster master node from the yaml file 
    if [ -z "$RAM_NODE" ]; then 
     echo "Attempting to join as DISC node: /usr/sbin/rabbitmqctl join_cluster [email protected]$CLUSTER_WITH" >> $logfile 
     /usr/sbin/rabbitmqctl join_cluster [email protected]$CLUSTER_WITH >> $logfile 
    else 
     echo "Attempting to join as RAM node: /usr/sbin/rabbitmqctl join_cluster --ram [email protected]$CLUSTER_WITH" >> $logfile 
     /usr/sbin/rabbitmqctl join_cluster --ram [email protected]$CLUSTER_WITH >> $logfile 
    fi 
    echo "Starting App" >> $logfile 
    /usr/sbin/rabbitmqctl start_app >> $logfile 

    echo "Done Starting Cluster Node" >> $logfile 
    fi 

    # Tail to keep the foreground process active. 
    tail -f /var/log/rabbitmq/* 

fi 

Проблема заключается в том, когда я попытался сделать ту же настройку с помощью kubernetes. Я не могу подключиться к master из подчиненного узла. Подход, который я взял, я создал модуль для главного узла, а другой для подчиненного узла, передал имя хоста главной (в настоящее время жестко запрограммированной) через переменную среды. Я также проверил файл журнала на /tmp/rabbitmq.log, он правильно принимает все переменные среды. Однако он не может зарегистрироваться у мастера. Я попытался сделать это вручную, используя команду rabbitmqctl. Но он не работал, говорит хозяин, недоступный. Пробовал также изменить файл/etc/hosts.

В соответствии с моим пониманием стручки в кубернетах обмениваются данными через службы, я предполагаю, что из-за этого передача непосредственно имени хоста контейнера не работает, а кроличья кластерная работа основана на именах хостов.

Пробовали ли какие-либо обходные пути? Я хочу запустить master и slaves на разных узлах. Ниже приведено содержание ведущих и ведомых стручки:

apiVersion: v1 
kind: Service 
metadata: 
    name: rabbitmqsvc 
    labels: 
    app: queue-master 
spec: 
    ports: 
    - port: 5672 
     name: queue-rw-port 
    - port: 15672 
     name: queue-mgt-port 
     nodePort: 31606 
    - port: 5671 
     name: queue-ssl 
     nodePort: 32718 
    selector: 
    app: queue-master 
    type: NodePort 
    clusterIP: 10.16.0.121 
--- 
apiVersion: v1 
kind: ReplicationController 
metadata: 
    name: rabbitmq-controller 
    labels: 
    app: queue-master 
spec: 
    replicas: 1 
    selector: 
    app: queue-master 
    template: 
    metadata: 
     name: rabbitmq-pod 
     labels: 
     app: queue-master 
    spec: 
     nodeSelector: 
     nodesize: small1 
     containers: 
     - name: rabbitmq-master 
     image: 172.17.0.1:5000/queue-node 
     ports: 
     - containerPort: 5672 
      name: queue-rw-port 
     - containerPort: 15672 
      name: queue-mgt-port 
     - containerPort: 5671 
      name: queue-ssl 

SLAVE:

apiVersion: v1 
kind: Service 
metadata: 
    name: rabbitmqsvc-slave 
    labels: 
    app: queue-slave 
spec: 
    ports: 
    - port: 5672 
     name: queue-rw-port 
    - port: 15672 
     name: queue-mgt-port 
     nodePort: 31607 
    - port: 5671 
     name: queue-ssl 
     nodePort: 32719 
    selector: 
    app: queue-slave 
    type: NodePort 
    clusterIP: 10.16.0.122 
--- 
apiVersion: v1 
kind: ReplicationController 
metadata: 
    name: rabbitmq-controller-slave 
    labels: 
    app: queue-slave 
spec: 
    replicas: 1 
    selector: 
    app: queue-slave 
    template: 
    metadata: 
     name: rabbitmq-pod 
     labels: 
     app: queue-slave 
    spec: 
     nodeSelector: 
     nodesize: small2 
     containers: 
     - name: rabbitmq-slave 
     image: 172.17.0.1:5000/queue-node 
     env: 
     - name: CLUSTERED 
      value: "true" 
     - name: CLUSTER_WITH 
      value: "rabbitmq-controller-2ll1s" 
     - name: RAM_NODE 
      value: "true" 
     - name: HOST_NAME 
      value: "rabbit2" 
     ports: 
     - containerPort: 5672 
      name: queue-rw-port 
     - containerPort: 15672 
      name: queue-mgt-port 
     - containerPort: 5671 
      name: queue-ssl 
+0

Есть описание, как я могу установить RabbitMQ в kubernetes с minikube/kubectl (не нужен кластер)? – powder366

ответ

3

Вы не можете использовать Docker имен хостов и ссылку с Kubernetes. Он работает только тогда, когда у вас есть одна машина, но Кубернетес назначается кластеризованным решением.

Включить DNS в кластере. Создание Master service (rabbitmqsvc - уже сделано), а затем использовать DNS имя вашего Master service в вас подчиненную конфигурации:

- name: CLUSTER_WITH 
     value: "rabbitmqsvc.svc.cluster.local" 

Вы можете использовать также environment variables, но ИМХО DNS это лучший вариант.

+0

Или используйте «clusterIP» вашей основной службы, если у вас нет надстройки DNS. –

+0

Спасибо за ваш быстрый ответ. Я уже пробовал использовать службу Cluster IP, RABBITMQSVC_SERVICE_HOST ничего не работает. Проблема заключается в настройке кластера rabbitmq. Я не могу использовать IP, доменное имя службы для настройки кластера, для этого требуется имя узла узла. Я думаю, что мне нужно настроить его за пределами кластера в том же vnet. Или есть ли другой способ обхода? – Vivek

+0

Получил работу окончательно. Изменен файл/etc/hosts и сопоставлен ip с именем хоста, и он начал регистрировать узлы. Теперь измените скрипт и попытайтесь автоматизировать это. Спасибо за вашу помощь. – Vivek

2

Мы просто открываем готовый кластер для кроликов для развертывания для кубернетов. Он использует StatefulSets, поэтому он требует Kubernetes 1.5.X или новее.

Вы можете найти его здесь: https://github.com/nanit/kubernetes-rabbitmq-cluster

Смежные вопросы