{"id":631,"date":"2019-07-18T11:21:20","date_gmt":"2019-07-18T17:21:20","guid":{"rendered":"https:\/\/ugit.siua.ac.cr\/?p=631"},"modified":"2019-09-25T13:45:56","modified_gmt":"2019-09-25T19:45:56","slug":"proxmox-5-creacion-de-cluster","status":"publish","type":"post","link":"https:\/\/sada.services\/?p=631","title":{"rendered":"PROXMOX 5: Creaci\u00f3n de cluster"},"content":{"rendered":"\n<p>En esta gu\u00eda explicamos como crear un cluster entre 3 nodos, se asume que existen tres servidores instalados con proxmox, sino puede seguir la gu\u00eda \u00ab<a rel=\"noreferrer noopener\" href=\"http:\/\/desarrollo.siua.ac.cr\/proxmox-5-creaci%C3%B3n-de-cluster\" target=\"_blank\">instalaci\u00f3n PROXMOX<\/a>\u00bb pero el proceso debe servir para \u00abn\u00bb cantidad de servidores.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Escenario:<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Es importante entender el escenario que buscamos lograr, tenemos 3 servidores zeus, poseidon y hestia los cuales uniremos en un gran cluster que llamaremos \u00abcluster-ugit-1\u00bb, por si se llega a implementar otro cluster.<\/li><li>Otro aspecto importante a destacar que que PROXMOX utiliza \u00abcorosync\u00bb como el medio de sincronizaci\u00f3n entre los nodos y en su documentaci\u00f3n oficial indican que lo mejor es que exista una red privada para este servicio y otra donde se maneja la interfaz web de administraci\u00f3n, por esta raz\u00f3n cada servidor va a tener una pata en la red 10.20.200.0\/24 para la interfaz web y otra en 10.20.252.0\/24<\/li><li>Adem\u00e1s dentro del cluster debemos establecer un servidor \u00abmaster\u00bb dentro del cual vamos a crear el cluster y los dem\u00e1s nodos se unir\u00e1n a este, para nuestro ejemplo usaremos el servidor de nombre \u00abPOSEIDON\u00bb<\/li><li>En resumen tenemos:<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"\"><tbody><tr><td>Nombre:<\/td><td>Funci\u00f3n:<\/td><td>VLAN 201<\/td><td>VLAN CORO<\/td><\/tr><tr><td>POSEIDON<\/td><td>MASTER<\/td><td>10.20.200.14<\/td><td>10.20.252.14<\/td><\/tr><tr><td>ZEUS<\/td><td>Cliente 1<\/td><td>10.20.200.10<\/td><td>10.20.252.10<\/td><\/tr><tr><td>HESTIA<\/td><td>Cliente 2<\/td><td>10.20.200.30<\/td><td>10.20.252.30<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Procedimiento:<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Sobre \u00abMaster\u00bb<\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li>Paso 1: ingresamos por SSH al nodo \u00abMASTER\u00bb (POSEIDON)<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>ssh 10.20.200.14 -l root<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Paso 2: Ejecutar el siguiente comando para crear el cluster llamado \u00abcluster-ugit-1\u00bb<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>pvecm create cluster-ugit-1<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Paso 3: podemos verificar el estado del cluster<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>pvecm status<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>RESULTADO:<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>Quorum information\n------------------\nDate: Tue Apr 3 14:31:35 2018\nQuorum provider: corosync_votequorum\nNodes: 1\nNode ID: 0x00000001\nRing ID: 1\/4\nQuorate: Yes\n\nVotequorum information\n----------------------\nExpected votes: 1\nHighest expected: 1\nTotal votes: 1\nQuorum: 1 \nFlags: Quorate \n\nMembership information\n----------------------\n Nodeid Votes Name\n0x00000001 1 10.20.200.14 (local)<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Como podemos ver el cluster de momento solo cuenta con un \u00fanico nodo<\/li><\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Cliente 1: hestia<\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li>Ingresamos por ssh al servidor<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>ssh 10.20.200.30 -l root<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Corremos el comando que nos permite incluirnos en un cluster<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>pvecm add 10.20.200.14<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Nos pide si queremos conectarnos al servidor y nos solicita la contrase\u00f1a del usuario \u00abroot\u00bb<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>The authenticity of host '10.20.200.14 (10.20.200.14)' can't be established.\nECDSA key fingerprint is SHA256:z+hrRqx\/kU1slrr61YbVxE0LIHi5uQt6ejhEGCajFx4.\nAre you sure you want to continue connecting (yes\/no)? yes\nroot@10.20.200.14's password:\ncopy corosync auth key\nstopping pve-cluster service\nbackup old database\nwaiting for quorum...OK\ngenerating node certificates\nmerge known_hosts file\nrestart services\nsuccessfully added node 'hestia' to cluster.<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Cliente 2: Zeus<\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li>Ingresamos por ssh al servidor<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>ssh 10.20.200.10 -l root<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Ejecutamos el comando de inclusi\u00f3n a cluster<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>pvecm add 10.20.200.14<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Dentro de master<\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li>Podemos ejecutar el siguiente comando para ver los nodos disponibles<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>pvecm nodes<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>RESULTADO:<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>Membership information\n----------------------\n    Nodeid      Votes Name\n         3          1 zeus\n         1          1 poseidon (local)\n         2          1 hestia\n\n<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Podemos ver que en el cluster ya tenemos los nodos disponibles, al igual que si entramos v\u00eda web podemos observar que ya est\u00e1n los nodos disponibles<\/li><\/ul>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img fetchpriority=\"high\" decoding=\"async\" width=\"274\" height=\"221\" src=\"\/wp-content\/uploads\/2019\/07\/selecci\u00f3n002_1_o.png\" alt=\"\" class=\"wp-image-632\"\/><\/figure><\/div>\n\n\n\n<h1 class=\"wp-block-heading\">Red Corosync<\/h1>\n\n\n\n<ul class=\"wp-block-list\"><li>En el proceso anterior creamos un cluster, pero tambien se hab\u00eda planteado la recomendaci\u00f3n de PROXMOX de que el corosync tenga una red \u00fanica, esto es lo que vamos hacer.<\/li><li>Lo primero que vamos hacer es garantizar que todos los nodos poseen una interfaz en la red destinada a corosync para nuestro caso 10.20.252.0\/24<\/li><\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">En Master-POSEIDON<\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li>Vamos asegurar que todas las interfaces de redes inician del forma autom\u00e1tica<\/li><\/ul>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img decoding=\"async\" width=\"862\" height=\"429\" src=\"\/wp-content\/uploads\/2019\/07\/selecci\u00f3n003_1_o.png\" alt=\"\" class=\"wp-image-633\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/selecci\u00f3n003_1_o.png 862w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/selecci\u00f3n003_1_o-300x149.png 300w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/selecci\u00f3n003_1_o-768x382.png 768w\" sizes=\"(max-width: 862px) 100vw, 862px\" \/><\/figure><\/div>\n\n\n\n<ul class=\"wp-block-list\"><li>Vamos a crear un puente para cada interfaz<\/li><li>RESULTADO<\/li><\/ul>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img decoding=\"async\" width=\"536\" height=\"254\" src=\"\/wp-content\/uploads\/2019\/07\/selecci\u00f3n004_2_o.png\" alt=\"\" class=\"wp-image-634\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/selecci\u00f3n004_2_o.png 536w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/selecci\u00f3n004_2_o-300x142.png 300w\" sizes=\"(max-width: 536px) 100vw, 536px\" \/><\/figure><\/div>\n\n\n\n<ul class=\"wp-block-list\"><li>Ahora al puente que le hemos asignado la red corosync le asignamos la ip<\/li><\/ul>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1000\" height=\"346\" src=\"\/wp-content\/uploads\/2019\/07\/selecci\u00f3n005_3_o.png\" alt=\"\" class=\"wp-image-635\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/selecci\u00f3n005_3_o.png 1000w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/selecci\u00f3n005_3_o-300x104.png 300w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/selecci\u00f3n005_3_o-768x266.png 768w\" sizes=\"(max-width: 1000px) 100vw, 1000px\" \/><\/figure><\/div>\n\n\n\n<ul class=\"wp-block-list\"><li>Reiniciamos el servidor<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>init 6<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Vamos abrir el archivo:<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>nano \/etc\/network\/interfaces<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>RESULTADO:<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>auto lo\niface lo inet loopback\n\nauto enp66s0\niface enp66s0 inet manual\n#Poseidon INT 2\n\nauto enp4s0\niface enp4s0 inet manual\n#Poseidon EXT\n\nauto enp69s0f0\niface enp69s0f0 inet manual\n#Poseidon INT 6\n\nauto enp69s0f1\niface enp69s0f1 inet manual\n\nauto enp70s0f0\niface enp70s0f0 inet manual\n\nauto enp70s0f1\niface enp70s0f1 inet manual\n\nauto vmbr0\niface vmbr0 inet static\naddress 10.20.200.14\nnetmask 255.255.255.0\ngateway 10.20.200.1\nbridge_ports enp66s0\nbridge_stp off\nbridge_fd 0\n\nauto vmbr1\niface vmbr1 inet static\naddress 10.20.252.14\nnetmask 255.255.255.0\nbridge_ports enp69s0f0\nbridge_stp off\nbridge_fd 0\n#Poseidon INT 6\n\nauto vmbr2\niface vmbr2 inet manual\nbridge_ports enp69s0f1\nbridge_stp off\nbridge_fd 0\n\nauto vmbr3\niface vmbr3 inet manual\nbridge_ports enp70s0f0\nbridge_stp off\nbridge_fd 0\n\nauto vmbr4\niface vmbr4 inet manual\nbridge_ports enp70s0f1\nbridge_stp off\nbridge_fd 0<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Como podemos ver la interfaz \u00abenp66s0\u00bb es la utilizada para la interfaz web a trav\u00e9s de puente \u00abvmbr0\u00bb<\/li><li>La interfaz \u00abenp4s0\u00bb la utilizaremos posteriormente para darle acceso a la interfaz web por una IP publica a trav\u00e9s de puente \u00abvmbr5\u00bb<\/li><li>Y la interfaz \u00abenp69s0f0\u00bb la usaremos para el corosync a trav\u00e9s del puente \u00abvmbr1\u00bb<\/li><\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Cliente 1 &#8211; Hestia<\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li>Vamos hacer el mismo procedimiento<\/li><li>Creamos los puentes y el asignamos una IP de la red corosync<\/li><\/ul>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1000\" height=\"244\" src=\"\/wp-content\/uploads\/2019\/07\/selecci\u00f3n006_5_o_0.png\" alt=\"\" class=\"wp-image-636\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/selecci\u00f3n006_5_o_0.png 1000w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/selecci\u00f3n006_5_o_0-300x73.png 300w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/selecci\u00f3n006_5_o_0-768x187.png 768w\" sizes=\"(max-width: 1000px) 100vw, 1000px\" \/><\/figure><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Cliente 2 &#8211; Zeus<\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li>Vamos hacer el mismo procedimiento<\/li><li>Creamos los puentes y el asignamos una IP de la red corosync<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1000\" height=\"213\" src=\"\/wp-content\/uploads\/2019\/07\/selecci\u00f3n007_4_o.png\" alt=\"\" class=\"wp-image-637\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/selecci\u00f3n007_4_o.png 1000w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/selecci\u00f3n007_4_o-300x64.png 300w, https:\/\/sada.services\/wp-content\/uploads\/2019\/07\/selecci\u00f3n007_4_o-768x164.png 768w\" sizes=\"(max-width: 1000px) 100vw, 1000px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">En master<\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li>Ahora podemos probar que ya tenemos una interfaz en la red de corosync y podemos hacer ping a todos los servidores y desde todos los servidores<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>ping 10.20.252.10\nping 10.20.252.14\nping 10.20.252.30<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Podemos probar tambi\u00e9n con el comando que el multicast funciona se debe ejecutar en todos los servidores<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>omping -c 10000 -i 0.001 -F -q 10.20.252.14 10.20.252.10 10.20.252.30<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Y podemos verificar que el multicast funciona en periodos largos (Dura como 10 minutos)<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>omping -c 600 -i 1 -q 10.20.252.14 10.20.252.10 10.20.252.30<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Dentro de proxmox existen 2 archivos \u00abcorosync.conf\u00bb uno ubicado en \u00ab\/etc\/pve\/corosync.conf\u00bb y el otro en \u00ab\/etc\/corosync\/corosync.conf\u00bb al modificar el primero los cambios se aplican autom\u00e1ticamente en el otro.<\/li><li>El proceso de una modificaci\u00f3n es el siguiente y adem\u00e1s estos archivos tiene un numero \u00abconfig_version\u00bb que debe ir cambiando para que se ejecute la actualizaci\u00f3n en el otro archivo.<\/li><li>Paso 1: copiamos al configuraci\u00f3n del archivo actual en un nuevo archivo para poder modificar este sin que se caiga el corosync<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>cp \/etc\/pve\/corosync.conf \/etc\/pve\/corosync.conf.new<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Paso 2: Ahora podemos hacer los cambios necesarios en el nuevo archivo<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>nano \/etc\/pve\/corosync.conf.new<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Archivo actual<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>logging {\ndebug: off\nto_syslog: yes\n}\n\nnodelist {\nnode {\nname: hestia\nnodeid: 2\nquorum_votes: 1\nring0_addr: hestia\n}\nnode {\nname: poseidon\nnodeid: 1\nquorum_votes: 1\nring0_addr: poseidon\n}\nnode {\nname: zeus\nnodeid: 3\nquorum_votes: 1\nring0_addr: zeus\n}\n}\n\nquorum {\nprovider: corosync_votequorum\n}\n\ntotem {\ncluster_name: cluster-ugit-1\nconfig_version: 3\ninterface {\nbindnetaddr: 10.20.200.14\nringnumber: 0\n}\nip_version: ipv4\nsecauth: on\nversion: 2\n}<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Modificar a: (recuerde cambiar el numero de versi\u00f3n)<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>logging {\ndebug: off\nto_syslog: yes\n}\n\nnodelist {\nnode {\nname: hestia\nnodeid: 2\nquorum_votes: 1\nring0_addr: 10.20.252.30\n}\nnode {\nname: poseidon\nnodeid: 1\nquorum_votes: 1\nring0_addr: 10.20.252.14\n}\nnode {\nname: zeus\nnodeid: 3\nquorum_votes: 1\nring0_addr: 10.20.252.10\n}\n}\n\nquorum {\nprovider: corosync_votequorum\n}\n\ntotem {\ncluster_name: cluster-ugit-1\nconfig_version: 4\ninterface {\nbindnetaddr: 10.20.252.1\nringnumber: 0\n}\nip_version: ipv4\nsecauth: on\nversion: 2\n}<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Paso 3: ahora vamos a respaldar el archivo de configuraci\u00f3n actual por cualquier error<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>cp \/etc\/pve\/corosync.conf \/etc\/pve\/corosync.conf.bak<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Paso 4: ahora actualizamos el archivo de configuraci\u00f3n<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>mv \/etc\/pve\/corosync.conf.new \/etc\/pve\/corosync.conf<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Ahora podemos verificar con:<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>systemctl status corosync\no\njournalctl -b -u corosync<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Los cambios se deben de aplicar autom\u00e1ticamente si no puede reiniciar el servicio<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>systemctl restart corosync<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>En esta gu\u00eda explicamos como crear un cluster entre 3 nodos, se asume que existen tres servidores instalados con proxmox, sino puede seguir la gu\u00eda \u00abinstalaci\u00f3n PROXMOX\u00bb pero el proceso debe servir para \u00abn\u00bb cantidad de servidores.<\/p>\n","protected":false},"author":2,"featured_media":2001,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[75,12],"class_list":["post-631","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-proxmox","tag-cluster","tag-proxmox"],"blocksy_meta":{"styles_descriptor":{"styles":{"desktop":"","tablet":"","mobile":""},"google_fonts":[],"version":6}},"_links":{"self":[{"href":"https:\/\/sada.services\/index.php?rest_route=\/wp\/v2\/posts\/631","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sada.services\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sada.services\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sada.services\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/sada.services\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=631"}],"version-history":[{"count":2,"href":"https:\/\/sada.services\/index.php?rest_route=\/wp\/v2\/posts\/631\/revisions"}],"predecessor-version":[{"id":2053,"href":"https:\/\/sada.services\/index.php?rest_route=\/wp\/v2\/posts\/631\/revisions\/2053"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sada.services\/index.php?rest_route=\/wp\/v2\/media\/2001"}],"wp:attachment":[{"href":"https:\/\/sada.services\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=631"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sada.services\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=631"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sada.services\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=631"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}