{"id":33075,"date":"2019-10-31T21:50:35","date_gmt":"2019-10-31T18:50:35","guid":{"rendered":"https:\/\/prohoster.info\/blog\/besprostojnaya-migratsiya-rabbitmq-v-kubernetes\/"},"modified":"2019-10-31T21:50:35","modified_gmt":"2019-10-31T18:50:35","slug":"besprostojnaya-migratsiya-rabbitmq-v-kubernetes","status":"publish","type":"post","link":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/besprostojnaya-migratsiya-rabbitmq-v-kubernetes","title":{"rendered":"Migraci\u00f3n no trivial de RabbitMQ en Kubernetes","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Migraci\u00f3n no trivial de RabbitMQ en Kubernetes\" src=\"\/wp-content\/uploads\/2019\/05\/32c491c8605e2488550efadbcb052320.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nRabbitMQ es un broker de mensajes escrito en Erlang que permite organizar un cl\u00faster tolerante a fallos con replicaci\u00f3n completa de datos en varios nodos, donde cada nodo puede manejar solicitudes de lectura y escritura. Habiendo utilizado m\u00faltiples cl\u00fasteres de Kubernetes en producci\u00f3n, soportamos una gran cantidad de instalaciones de RabbitMQ y hemos enfrentado la necesidad de migrar datos de un cl\u00faster a otro sin tiempo de inactividad.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Esta operaci\u00f3n fue necesaria para nosotros en al menos dos casos:<\/p>\n<ol>\n<li> Transferir datos de un cl\u00faster de RabbitMQ que no est\u00e1 en Kubernetes a un nuevo cl\u00faster que ya est\u00e1 \"kubernetizado\" (es decir, funcionando en pods de K8s).<\/li>\n<li> Migrar RabbitMQ dentro de Kubernetes de un namespace a otro (por ejemplo, si los contornos est\u00e1n delimitados por espacios de nombres, para trasladar infraestructura de un contorno a otro).<\/li>\n<\/ol>\n<p>\nLa receta propuesta en este art\u00edculo est\u00e1 orientada a situaciones (pero no se limita a ellas) en las que hay un antiguo cl\u00faster de RabbitMQ (por ejemplo, de 3 nodos), que est\u00e1 ya en K8s o en algunos servidores antiguos. Est\u00e1 asociado a una aplicaci\u00f3n que se ubica en Kubernetes (ya sea all\u00ed o en perspectiva):<\/p>\n<p><img decoding=\"async\" alt=\"Migraci\u00f3n no trivial de RabbitMQ en Kubernetes\" src=\"\/wp-content\/uploads\/2019\/05\/5fba162c90bc441978429288c59300ef.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u2026 y se nos presenta la tarea de migrarlo a un nuevo entorno de producci\u00f3n en Kubernetes.<\/p>\n<p>Primero se describir\u00e1 el enfoque general para la migraci\u00f3n, y luego se detallar\u00e1n los aspectos t\u00e9cnicos de su implementaci\u00f3n.<\/p>\n<h2>Algoritmo de migraci\u00f3n<\/h2>\n<p>\nEl primer paso preliminar antes de cualquier acci\u00f3n es verificar que la antigua instalaci\u00f3n de RabbitMQ tiene activado el modo de alta disponibilidad (<noindex><a rel=\"nofollow\" href=\"https:\/\/www.rabbitmq.com\/ha.html\">HA<\/a><\/noindex>). La raz\u00f3n es evidente: no queremos perder ning\u00fan dato. Para llevar a cabo esta verificaci\u00f3n, se puede acceder al panel de administraci\u00f3n de RabbitMQ y en la pesta\u00f1a Admin \u2192 Policies asegurarse de que est\u00e1 configurado el valor <code>ha-mode: all<\/code>:<\/p>\n<p><img decoding=\"async\" alt=\"Migraci\u00f3n no trivial de RabbitMQ en Kubernetes\" src=\"\/wp-content\/uploads\/2019\/05\/2e37be2cd3685eb8cedfbc5949e5036f.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEl siguiente paso es levantar un nuevo cl\u00faster de RabbitMQ en pods de Kubernetes (en nuestro caso, por ejemplo, compuesto por 3 nodos, pero puede ser cualquier otro n\u00famero).<\/p>\n<p>Despu\u00e9s de esto, combinamos el antiguo y el nuevo cl\u00faster de RabbitMQ, obteniendo un \u00fanico cl\u00faster (de 6 nodos):<\/p>\n<p><img decoding=\"async\" alt=\"Migraci\u00f3n no trivial de RabbitMQ en Kubernetes\" src=\"\/wp-content\/uploads\/2019\/05\/52204b814f0ba73a20c4854e990c4059.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSe inicia el proceso de sincronizaci\u00f3n de datos entre el antiguo y el nuevo cl\u00faster de RabbitMQ. Despu\u00e9s de que todos los datos se sincronicen entre todos los nodos del cl\u00faster, podemos cambiar la aplicaci\u00f3n para usar el nuevo cl\u00faster:<\/p>\n<p><img decoding=\"async\" alt=\"Migraci\u00f3n no trivial de RabbitMQ en Kubernetes\" src=\"\/wp-content\/uploads\/2019\/05\/8bf19d4176e38b4679e96e0f1b8b57c1.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDespu\u00e9s de estas operaciones, es suficiente desconectar los antiguos nodos del cl\u00faster de RabbitMQ y se puede considerar finalizada la migraci\u00f3n:<\/p>\n<p><img decoding=\"async\" alt=\"Migraci\u00f3n no trivial de RabbitMQ en Kubernetes\" src=\"\/wp-content\/uploads\/2019\/05\/bccc9b9fc8d6691d24195e9a97a0f88b.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nHemos utilizado este esquema en producci\u00f3n en varias ocasiones. Sin embargo, para nuestra propia comodidad, lo implementamos en el marco de un sistema especializado que distribuye configuraciones est\u00e1ndar de RMQ en m\u00faltiples cl\u00fasteres de Kubernetes. <i>(para aquellos a quienes les interese: se trata de <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/addon-operator\">addon-operator<\/a><\/noindex>, del cual ya hemos <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/449096\/\">recientemente hablamos de<\/a><\/noindex>)<\/i>. A continuaci\u00f3n se presentar\u00e1n instrucciones espec\u00edficas que cada uno puede aplicar en sus instalaciones para probar la soluci\u00f3n propuesta en acci\u00f3n.<\/p>\n<h2>Probando en la pr\u00e1ctica<\/h2>\n<p><\/p>\n<h3>Requisitos<\/h3>\n<p>\nLos requisitos son muy sencillos:<\/p>\n<ol>\n<li> Cl\u00faster de Kubernetes (tambi\u00e9n sirve minikube);<\/li>\n<li> Un cl\u00faster RabbitMQ (que puede estar desplegado en bare metal o configurado como un cl\u00faster est\u00e1ndar en Kubernetes utilizando el Helm chart oficial).<\/li>\n<\/ol>\n<p>\nPara el ejemplo a continuaci\u00f3n, desplegu\u00e9 RMQ en Kubernetes y lo llam\u00e9 <code>rmq-old<\/code>.<\/p>\n<h3>Preparaci\u00f3n del entorno<\/h3>\n<p>\n1. Descargamos el Helm chart y lo editamos un poco:<\/p>\n<pre><code class=\"bash\">helm fetch --untar stable\/rabbitmq-ha<\/code><\/pre>\n<p>\nPor comodidad, establecemos una contrase\u00f1a, <code>ErlangCookie<\/code> y creamos una pol\u00edtica <code>ha-all<\/code>, para que por defecto las colas se sincronicen entre todos los nodos del cl\u00faster RMQ:<\/p>\n<pre><code class=\"plaintext\">rabbitmqPassword: guest\nrabbitmqErlangCookie: mae9joopaol7aiVu3eechei2waiGa2we\ndefinitions:\npolicies: |-\n  {\n    \"name\": \"ha-all\",\n    \"pattern\": \".*\",\n    \"vhost\": \"\\\/\",\n    \"definition\": {\n      \"ha-mode\": \"all\",\n      \"ha-sync-mode\": \"automatic\",\n      \"ha-sync-batch-size\": 81920\n    }\n  }<\/code><\/pre>\n<p>\n2. Instalamos el chart:<\/p>\n<pre><code class=\"bash\">helm install . --name rmq-old --namespace rmq-old<\/code><\/pre>\n<p>\n3. Entramos en la interfaz de administraci\u00f3n de RabbitMQ, creamos una nueva cola y a\u00f1adimos algunos mensajes. Los necesitaremos para asegurarnos, despu\u00e9s de la migraci\u00f3n, de que todos los datos se han preservado y no hemos perdido nada:<\/p>\n<p><img decoding=\"async\" alt=\"Migraci\u00f3n no trivial de RabbitMQ en Kubernetes\" src=\"\/wp-content\/uploads\/2019\/05\/b4b78ce622903dada396ced196c2ecce.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEl entorno de prueba est\u00e1 listo: tenemos un RabbitMQ \"antiguo\" con datos que deben ser transferidos.<\/p>\n<h3>Migraci\u00f3n del cl\u00faster RabbitMQ<\/h3>\n<p>\n1. Primero, desplegaremos un nuevo RabbitMQ en <b>otra<\/b> un espacio de nombres con <b>las mismas<\/b> <code>ErlangCookie<\/code> y contrase\u00f1a para el usuario. Para ello, realizaremos las operaciones descritas anteriormente, modificando el comando final para la instalaci\u00f3n de RMQ de la siguiente manera:<\/p>\n<pre><code class=\"bash\">helm install . --name rmq-new --namespace rmq-new<\/code><\/pre>\n<p>\n2. Ahora es necesario unir el nuevo cl\u00faster con el antiguo. Para ello, accedemos a cada uno de los pod <b>nuevo<\/b> RabbitMQ y ejecutamos los comandos:<\/p>\n<pre><code class=\"bash\">export OLD_RMQ=rabbit@rmq-old-rabbitmq-ha-0.rmq-old-rabbitmq-ha-discovery.rmq-old.svc.cluster.local &amp;&amp; \n  rabbitmqctl stop_app &amp;&amp; \n  rabbitmqctl join_cluster $OLD_RMQ &amp;&amp; \n  rabbitmqctl start_app<\/code><\/pre>\n<p>\nEn la variable <code>OLD_RMQ<\/code> es la direcci\u00f3n de uno de los nodos <b>del antiguo<\/b> cl\u00faster RMQ.<\/p>\n<p>Estos comandos detendr\u00e1n el nodo actual <b>nuevo<\/b> del cl\u00faster RMQ, lo unir\u00e1n al cl\u00faster antiguo y lo reiniciar\u00e1n.<\/p>\n<p>3. El cl\u00faster RMQ de 6 nodos est\u00e1 listo:<\/p>\n<p><img decoding=\"async\" alt=\"Migraci\u00f3n no trivial de RabbitMQ en Kubernetes\" src=\"\/wp-content\/uploads\/2019\/05\/88f4655556c1146f7a6e54fd2fd798f4.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nHay que esperar a que los mensajes se sincronicen entre todos los nodos. No es dif\u00edcil adivinar que el tiempo de sincronizaci\u00f3n de mensajes depende de la capacidad del hardware en el que se despliega el cl\u00faster y de la cantidad de mensajes. En el escenario descrito, hay solo 10, por lo que los datos se sincronizaron instant\u00e1neamente, pero con una cantidad significativamente mayor de mensajes, la sincronizaci\u00f3n puede llevar horas.<\/p>\n<p>As\u00ed que, el estado de sincronizaci\u00f3n:<\/p>\n<p><img decoding=\"async\" alt=\"Migraci\u00f3n no trivial de RabbitMQ en Kubernetes\" src=\"\/wp-content\/uploads\/2019\/05\/1185591d8d5478634f35b7433ca75bbc.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAqu\u00ed <code>+5<\/code> significa que los mensajes ya est\u00e1n <b>a\u00fan<\/b> en 5 nodos (adem\u00e1s del que se indica en el campo <code>Nodo<\/code>). As\u00ed, la sincronizaci\u00f3n fue exitosa.<\/p>\n<p>4. Solo queda cambiar en la aplicaci\u00f3n la direcci\u00f3n de RMQ al nuevo cl\u00faster (las acciones espec\u00edficas aqu\u00ed dependen de la pila tecnol\u00f3gica que est\u00e9s usando y de otras especificidades de la aplicaci\u00f3n), despu\u00e9s de lo cual puedes despedirte del antiguo.<\/p>\n<p>Para la \u00faltima operaci\u00f3n (es decir, ya <b>despu\u00e9s de<\/b> cambiando la aplicaci\u00f3n al nuevo cl\u00faster) accedemos a cada nodo <b>del antiguo<\/b> del cl\u00faster y ejecutamos los comandos:<\/p>\n<pre><code class=\"bash\">rabbitmqctl stop_app\nrabbitmqctl reset<\/code><\/pre>\n<p>\nEl cl\u00faster \"ha olvidado\" acerca de los antiguos nodos: se puede eliminar el viejo RMQ, completando as\u00ed la migraci\u00f3n.<\/p>\n<p><i><b>Nota<\/b>: Si utilizas RMQ con certificados, entonces no hay cambios fundamentales: el proceso de migraci\u00f3n se llevar\u00e1 a cabo exactamente de la misma manera.<\/i><\/p>\n<h2>Conclusiones<\/h2>\n<p>\nEl esquema descrito se adapta pr\u00e1cticamente a todos los casos en que necesitamos trasladar RabbitMQ o simplemente mudarnos a un nuevo cl\u00faster.<\/p>\n<p>En nuestro caso, solo tuvimos dificultades una vez, cuando RMQ fue accedido desde m\u00faltiples lugares, y no tuvimos la oportunidad de cambiar la direcci\u00f3n de RMQ a la nueva en todos los lugares. En ese caso, lanzamos un nuevo RMQ en el mismo espacio de nombres con las mismas etiquetas, para que se incluyera en los servicios y Ingress ya existentes, y al iniciar el pod, manipulamos las etiquetas manualmente, elimin\u00e1ndolas al principio para que las solicitudes no llegaran al RMQ vac\u00edo, y volvi\u00e9ndolas a a\u00f1adir despu\u00e9s de la sincronizaci\u00f3n de mensajes.<\/p>\n<p>Aplicamos la misma estrategia al actualizar RabbitMQ a una nueva versi\u00f3n con una configuraci\u00f3n modificada: todo funcion\u00f3 a la perfecci\u00f3n.<\/p>\n<h2>P.D.<\/h2>\n<p>\nComo continuaci\u00f3n l\u00f3gica de este material, estamos preparando art\u00edculos sobre MongoDB (migraci\u00f3n de un servidor f\u00edsico a Kubernetes) y MySQL (c\u00f3mo preparamos esta base de datos dentro de Kubernetes). Se publicar\u00e1n en los pr\u00f3ximos meses.<\/p>\n<h2>P.P.D.<\/h2>\n<p>\nTambi\u00e9n puedes leer en nuestro blog:<\/p>\n<ul>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/flant\/blog\/431500\/\">Bases de datos y Kubernetes (rese\u00f1a y video de la presentaci\u00f3n)<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/417509\/\">Consejos y trucos de K8s: Acelerando el arranque de grandes bases de datos<\/a><\/noindex>\u00bb.<\/li>\n<\/ul>\n<p>Fuente: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/450662\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>RabbitMQ \u2013 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 Erlang \u0431\u0440\u043e\u043a\u0435\u0440 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0441 \u043f\u043e\u043b\u043d\u043e\u0439 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0435\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0437\u043b\u043e\u0432, \u0433\u0434\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0443\u0437\u0435\u043b \u043c\u043e\u0436\u0435\u0442 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0435 \u0438 \u0437\u0430\u043f\u0438\u0441\u044c. \u0418\u043c\u0435\u044f \u0432 production-\u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432 Kubernetes, \u043c\u044b \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u043d\u0441\u0442\u0430\u043b\u043b\u044f\u0446\u0438\u0439 RabbitMQ \u0438 \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0438\u0441\u044c \u0441 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c\u044e \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u0431\u0435\u0437 \u043f\u0440\u043e\u0441\u0442\u043e\u044f. \u0414\u0430\u043d\u043d\u0430\u044f [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":24827,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-33075","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"RabbitMQ \u2013 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 Erlang \u0431\u0440\u043e\u043a\u0435\u0440.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/besprostojnaya-migratsiya-rabbitmq-v-kubernetes\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"es_ES\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0411\u0435\u0441\u043f\u0440\u043e\u0441\u0442\u043e\u0439\u043d\u0430\u044f \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044f RabbitMQ \u0432 Kubernetes | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"RabbitMQ \u2013 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 Erlang \u0431\u0440\u043e\u043a\u0435\u0440.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/besprostojnaya-migratsiya-rabbitmq-v-kubernetes\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T18:50:35+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:50:35+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Migraci\u00f3n sin complicaciones de RabbitMQ a Kubernetes | ProHoster","description":"RabbitMQ es un broker escrito en Erlang.","canonical_url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/besprostojnaya-migratsiya-rabbitmq-v-kubernetes","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"es_ES","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0411\u0435\u0441\u043f\u0440\u043e\u0441\u0442\u043e\u0439\u043d\u0430\u044f \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044f RabbitMQ \u0432 Kubernetes | ProHoster","og:description":"RabbitMQ \u2013 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 Erlang \u0431\u0440\u043e\u043a\u0435\u0440.","og:url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/besprostojnaya-migratsiya-rabbitmq-v-kubernetes","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T18:50:35+00:00","article:modified_time":"2019-10-31T18:50:35+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"33075","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-21 13:51:33","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 02:47:28","updated":"2026-01-21 13:51:33","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/33075","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/comments?post=33075"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/33075\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media\/24827"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=33075"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=33075"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=33075"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}