{"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\/it\/blog\/administrirovanie\/besprostojnaya-migratsiya-rabbitmq-v-kubernetes","title":{"rendered":"Migrazione non semplice di RabbitMQ in Kubernetes","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Migrazione non semplice di RabbitMQ in Kubernetes\" src=\"\/wp-content\/uploads\/2019\/05\/32c491c8605e2488550efadbcb052320.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nRabbitMQ \u00e8 un broker di messaggi scritto in Erlang, che consente di organizzare un cluster ad alta disponibilit\u00e0 con replicazione completa dei dati su pi\u00f9 nodi, dove ogni nodo pu\u00f2 gestire richieste di lettura e scrittura. Avendo in produzione molti cluster Kubernetes, gestiamo un gran numero di installazioni di RabbitMQ e ci siamo trovati nella necessit\u00e0 di migrare dati da un cluster all'altro senza downtime.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Questa operazione \u00e8 stata necessaria in almeno due casi:<\/p>\n<ol>\n<li> Trasferire dati da un cluster RabbitMQ non Kubernetes a un nuovo cluster 'kubernetesizzato' (cio\u00e8 funzionante in pod K8s).<\/li>\n<li> Migrazione di RabbitMQ all'interno di Kubernetes da un namespace a un altro (ad esempio, se i confini sono delimitati dagli spazi dei nomi, \u00e8 necessario trasferire l'infrastruttura da un confine all'altro).<\/li>\n<\/ol>\n<p>\nLa ricetta proposta nell'articolo \u00e8 orientata a situazioni (ma non limitata a esse) in cui \u00e8 presente un vecchio cluster RabbitMQ (ad esempio, composto da 3 nodi), che \u00e8 gi\u00e0 in K8s o su server obsoleti. Un'applicazione, gi\u00e0 presente o prevista, lavora con questo cluster in Kubernetes:<\/p>\n<p><img decoding=\"async\" alt=\"Migrazione non semplice di RabbitMQ in Kubernetes\" src=\"\/wp-content\/uploads\/2019\/05\/5fba162c90bc441978429288c59300ef.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u2026 e ci troviamo di fronte alla necessit\u00e0 di migrare il cluster in un nuovo ambiente di produzione in Kubernetes.<\/p>\n<p>Inizialmente verr\u00e0 descritto l'approccio generale alla migrazione, seguito da dettagli tecnici sulla sua attuazione.<\/p>\n<h2>Algoritmo di migrazione<\/h2>\n<p>\nIl primo passo preliminare prima di qualsiasi azione \u00e8 verificare che nella vecchia installazione di RabbitMQ sia attivata la modalit\u00e0 ad alta disponibilit\u00e0 (<noindex><a rel=\"nofollow\" href=\"https:\/\/www.rabbitmq.com\/ha.html\">HA<\/a><\/noindex>). La ragione \u00e8 ovvia: non vogliamo perdere alcun dato. Per effettuare questo controllo, \u00e8 possibile accedere all'interfaccia di amministrazione di RabbitMQ e nella scheda Admin \u2192 Policies verificare che il valore sia impostato su <code>ha-mode: all<\/code>:<\/p>\n<p><img decoding=\"async\" alt=\"Migrazione non semplice di RabbitMQ in Kubernetes\" src=\"\/wp-content\/uploads\/2019\/05\/2e37be2cd3685eb8cedfbc5949e5036f.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIl passo successivo consiste nel creare un nuovo cluster RabbitMQ in pod Kubernetes (nel nostro caso, ad esempio, composto da 3 nodi, ma il numero pu\u00f2 variare).<\/p>\n<p>Dopo di ci\u00f2, uniamo il vecchio e il nuovo cluster RabbitMQ, ottenendo un unico cluster (di 6 nodi):<\/p>\n<p><img decoding=\"async\" alt=\"Migrazione non semplice di RabbitMQ in Kubernetes\" src=\"\/wp-content\/uploads\/2019\/05\/52204b814f0ba73a20c4854e990c4059.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nViene avviato il processo di sincronizzazione dei dati tra il vecchio e il nuovo cluster RabbitMQ. Dopo che tutti i dati sono stati sincronizzati tra tutti i nodi del cluster, possiamo passare l'applicazione all'uso del nuovo cluster:<\/p>\n<p><img decoding=\"async\" alt=\"Migrazione non semplice di RabbitMQ in Kubernetes\" src=\"\/wp-content\/uploads\/2019\/05\/8bf19d4176e38b4679e96e0f1b8b57c1.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDopo queste operazioni, \u00e8 sufficiente disattivare i vecchi nodi dal cluster RabbitMQ, e il trasferimento pu\u00f2 considerarsi completato:<\/p>\n<p><img decoding=\"async\" alt=\"Migrazione non semplice di RabbitMQ in Kubernetes\" src=\"\/wp-content\/uploads\/2019\/05\/bccc9b9fc8d6691d24195e9a97a0f88b.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAbbiamo applicato questo schema pi\u00f9 volte nella nostra produzione. Tuttavia, per comodit\u00e0, lo abbiamo implementato all'interno di un sistema specializzato che distribuisce configurazioni standard RMQ su pi\u00f9 cluster Kubernetes. <i>(per chi \u00e8 curioso: si tratta di <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/addon-operator\">addon-operator<\/a><\/noindex>, di cui abbiamo <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/449096\/\">proprio recentemente abbiamo parlato<\/a><\/noindex>)<\/i>. Di seguito verranno presentate singole istruzioni che ognuno pu\u00f2 applicare nelle proprie installazioni per provare la soluzione proposta in azione.<\/p>\n<h2>Proviamo nella pratica<\/h2>\n<p><\/p>\n<h3>Requisiti<\/h3>\n<p>\nI requisiti sono molto semplici:<\/p>\n<ol>\n<li> Un cluster Kubernetes (va bene anche minikube);<\/li>\n<li> Un cluster RabbitMQ (pu\u00f2 essere implementato su bare metal o come un normale cluster in Kubernetes utilizzando il Helm-chart ufficiale).<\/li>\n<\/ol>\n<p>\nPer l'esempio descritto di seguito, ho implementato RMQ in Kubernetes e l'ho chiamato <code>rmq-old<\/code>.<\/p>\n<h3>Preparazione dell'ambiente<\/h3>\n<p>\n1. Scarichiamo il Helm-chart e lo modifichiamo leggermente:<\/p>\n<pre><code class=\"bash\">helm fetch --untar stable\/rabbitmq-ha<\/code><\/pre>\n<p>\nPer comodit\u00e0 impostiamo la password, <code>ErlangCookie<\/code> e impostiamo la policy <code>ha-all<\/code>, in modo che per default le code siano sincronizzate tra tutti i nodi del cluster 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. Installiamo il chart:<\/p>\n<pre><code class=\"bash\">helm install . --name rmq-old --namespace rmq-old<\/code><\/pre>\n<p>\n3. Accediamo all'amministrazione di RabbitMQ, creiamo una nuova coda e aggiungiamo alcuni messaggi. Ci serviranno per verificare che tutti i dati siano stati salvati e che non abbiamo perso nulla dopo la migrazione:<\/p>\n<p><img decoding=\"async\" alt=\"Migrazione non semplice di RabbitMQ in Kubernetes\" src=\"\/wp-content\/uploads\/2019\/05\/b4b78ce622903dada396ced196c2ecce.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nL'ambiente di test \u00e8 pronto: abbiamo un RabbitMQ \"vecchio\" con i dati che devono essere trasferiti.<\/p>\n<h3>Migrazione del cluster RabbitMQ<\/h3>\n<p>\n1. Per prima cosa, implementiamo un nuovo RabbitMQ in <b>un'altra<\/b> namespace con <b>le stesse<\/b> <code>ErlangCookie<\/code> e password per l'utente. Per farlo, effettuiamo le operazioni descritte sopra, modificando il comando finale per l'installazione di RMQ come segue:<\/p>\n<pre><code class=\"bash\">helm install . --name rmq-new --namespace rmq-new<\/code><\/pre>\n<p>\n2. Ora dobbiamo unire il nuovo cluster con quello vecchio. A tal fine, accediamo a ciascun pod del <b>nuovo<\/b> RabbitMQ ed eseguiamo i seguenti comandi:<\/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>\nNella variabile <code>OLD_RMQ<\/code> c'\u00e8 l'indirizzo di uno dei nodi <b>del vecchio<\/b> cluster RMQ.<\/p>\n<p>Questi comandi fermeranno il nodo attuale <b>nuovo<\/b> del cluster RMQ, lo uniranno al cluster vecchio e lo riavvieranno.<\/p>\n<p>3. Il cluster RMQ con 6 nodi \u00e8 pronto:<\/p>\n<p><img decoding=\"async\" alt=\"Migrazione non semplice di RabbitMQ in Kubernetes\" src=\"\/wp-content\/uploads\/2019\/05\/88f4655556c1146f7a6e54fd2fd798f4.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00c8 necessario attendere che i messaggi vengano sincronizzati tra tutti i nodi. Non \u00e8 difficile intuire che il tempo di sincronizzazione dei messaggi dipende dalle capacit\u00e0 hardware su cui \u00e8 distribuito il cluster e dal numero di messaggi. Nel caso descritto, ce ne sono solo 10, quindi i dati si sono sincronizzati istantaneamente, ma con un numero sufficientemente elevato di messaggi, la sincronizzazione pu\u00f2 durare ore.<\/p>\n<p>Quindi, stato di sincronizzazione:<\/p>\n<p><img decoding=\"async\" alt=\"Migrazione non semplice di RabbitMQ in Kubernetes\" src=\"\/wp-content\/uploads\/2019\/05\/1185591d8d5478634f35b7433ca75bbc.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nQui <code>+5<\/code> significa che i messaggi si trovano gi\u00e0 <b>ancora<\/b> su 5 nodi (oltre a quello specificato nel campo <code>Node<\/code>). Pertanto, la sincronizzazione \u00e8 stata completata con successo.<\/p>\n<p>4. Resta solo da cambiare nell'app l'indirizzo RMQ al nuovo cluster (le azioni specifiche qui dipendono dal stack tecnologico che stai utilizzando e da altre specificit\u00e0 dell'app), dopo di che puoi salutare il vecchio.<\/p>\n<p>Per l'ultima operazione (cio\u00e8 gi\u00e0 <b>la data rientri nel PITR.<\/b> il passaggio dell'app al nuovo cluster), accediamo a ciascun nodo <b>del vecchio<\/b> del cluster e eseguiamo i comandi:<\/p>\n<pre><code class=\"bash\">rabbitmqctl stop_app\nrabbitmqctl reset<\/code><\/pre>\n<p>\nIl cluster ha \"dimenticato\" i vecchi nodi: puoi rimuovere il vecchio RMQ, a quel punto la migrazione sar\u00e0 completata.<\/p>\n<p><i><b>Nota<\/b>: Se utilizzi RMQ con certificati, non cambia nulla di sostanziale: il processo di migrazione avverr\u00e0 proprio allo stesso modo.<\/i><\/p>\n<h2>Conclusioni<\/h2>\n<p>\nLo schema descritto si adatta praticamente a tutti i casi in cui dobbiamo migrare RabbitMQ o semplicemente trasferirci a un nuovo cluster.<\/p>\n<p>Nel nostro caso, le difficolt\u00e0 si sono presentate solo una volta, quando RMQ veniva utilizzato da molti luoghi e non avevamo la possibilit\u00e0 di cambiare ovunque l'indirizzo RMQ al nuovo. In quel caso, abbiamo avviato un nuovo RMQ nella stessa namespace con gli stessi label, affinch\u00e9 rientrasse nei servizi e negli ingress gi\u00e0 esistenti. Durante l'avvio del pod, abbiamo manipolato manualmente le etichette, rimuovendole all'inizio in modo che i richieste non andassero a un RMQ vuoto, e aggiungendole di nuovo dopo la sincronizzazione dei messaggi.<\/p>\n<p>Abbiamo applicato la stessa strategia durante l'aggiornamento di RabbitMQ a una nuova versione con una configurazione modificata: tutto ha funzionato perfettamente.<\/p>\n<h2>P.S.<\/h2>\n<p>\nCome naturale continuazione di questo materiale, stiamo preparando articoli su MongoDB (migrazione da server fisico a Kubernetes) e MySQL (come prepariamo questo DBMS all'interno di Kubernetes). Saranno pubblicati nei prossimi mesi.<\/p>\n<h2>P.P.S.<\/h2>\n<p>\nLeggi anche nel nostro blog:<\/p>\n<ul>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/flant\/blog\/431500\/\">Database e Kubernetes (panoramica e video relazione)<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/417509\/\">K8s tips &amp; tricks: Acceleriamo il bootstrap di grandi database<\/a><\/noindex>\u00bb.<\/li>\n<\/ul>\n<p>Fonte: <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.1.1 - 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\/it\/blog\/administrirovanie\/besprostojnaya-migratsiya-rabbitmq-v-kubernetes\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\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\/it\/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\udd47Migrazione semplice di RabbitMQ in Kubernetes | ProHoster","description":"RabbitMQ \u2013 un broker scritto in Erlang.","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/besprostojnaya-migratsiya-rabbitmq-v-kubernetes","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","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\/it\/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\/it\/wp-json\/wp\/v2\/posts\/33075","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=33075"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/33075\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/24827"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=33075"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=33075"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=33075"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}