How to nginx reverse proxy cluster
December 21, 2018 Leave a comment
V tomto navode sa pozreme na konfiuracie vysoko dostopneho reverzneho proxy postaveneho na NGINX. Na riesenie bude pouzity pacemaker stack a samotny nginx.
Pacemaker stack
V súčasnosti predstavuje najpouživanejší nástroj na realizáciu klastra s otvoreným zdrojovým kódom. Pacemaker stack spája dve samostatné služby Corosync a Pacemaker. Corosync je správcu klastra a je zodpovedný za členstvo uzlov v klastri. Pacemaker je správca zdrojov klastra a je mozog celého klastra, ktorý spracováva a reaguje na udalosti týkajúce sa klastra.
Corosync
Služba ktorá zabezpečuje základnú komunikáciu medzi uzlami klastra. Corosync používa protokol totem na sledovanie dostupnosti ostatných uzlov. Uzly si medzi sebou v stanovenom intervale posielajú token (uzol potvrdzuje prijatie tokenu a posiela nový), aby uzol vedel o dostupnosti zvyšných uzlov v klastri. Ak uzol po uplynutí stanoveného krátkeho časového intervalu nedostane naspäť token, uzol je vyhlásený za stratený. Akonáhle je uzol vyhlásený za stratený, zostávajúce uzly vytvárajú nový klaster. Ak zostane dostatočný počet uzlov na vytvorenie kvóra (nadpolovičná väčšina), nový klaster pokračuje v poskytovaní služieb. V prípade dvoj uzlového klastra je kvórum vypnuté a obidva uzly môžu pracovať samostatne. Samotný corosync sa stará iba o členstvo uzlov v klastri, posielaní správ (tokenov) medzi uzlami a kvórum. Čo sa stane po vytvorení nového klastra má na starosti správca zdrojov
Pacemaker
Pokročilý, škálovateľný správca zdrojov pre vysoko dostupné riešenia klastra. Pacemaker beží nad komunikačnou vrstvou klastru Corosync. Podporuje “N-uzlový” klaster s pokročilými možnosťami pre správu zdrojov. Pacemaker slúži na inicializáciu a správu služieb pri zmene stavu klastra. Umožňuje aj periodické monitorovanie zdrojov.
Instalacia
Ako prove nainstalujeme softver s oficialneho repo na obidva uzly.
# yum install pcsd corosync pacemaker pcs-snmp fence-agents-vmware-soap nginx
Vytvorenie klastra
Ako prve skontrolujeme ze obidva uzly maju nastaveny spravny cas, idealne pouzivat ntp client a skontrolujeme ze existuje spravny dns zaznam pripadne maju zaznal ulozeny v subore /etc/hosts
Nastavime heslo uzivalelovi hacluster na obidvoch uzloch. Tymto uctom konfigurejeme cluster pouzitim nastroja pcs
# passwd hacluster
Po nastaveni hesla na uzle z kotreho ideme konfigorovat klaster prevedieme autentifikaciu obidvoch uzlov.
# pcs cluster auth lb-01.dubnik.sk lb-02.dubnik.sk
Teraz mozeme vytvorit klaster. Tento prikaz vytvori konfiguracny subor /etc/corosync/corosync.conf. Ak potrebujeme nieco zmenit mozeme dat dolpnujuce parametre do prikazu, pripadne rucne zeditovat spominany conf subor.
# pcs cluster setup --name lb-cluster lb-01.dubnik.sk lb-02.dubnik.sk
Teraz mozeme inicializovat a spustit cluster
# pcs cluster start --all
V tomto stadiu je vytvoreny klaster uzly spolu komikuju posielanum tokenov ale samotny kalster nic nerobi. Na to aby klaster plnil nejaku ulohu musim nakonfigurovat zdroje. V pripade vysoko dostupneho reverzenho proxy v rezime active/passive potrebujeme plavajucu ip adresu a sluzbu nginx. Oba zdroje budu aktivne vzdy iba na jednom uzle. Este predtym je vsak potrebne zabezpecit fencing teda ohradenie uzla. Ohradenie je súbor metód ako dočasne vylúčiť uzol z klastra a zabrániť tak poškodeniu
zdieľaných dát. Za normálnych okolnosti uzly spolu komunikujú a vymieňajú si medzi seboutoken a dávajú si vedieť že uzol je dostupný a zdravý. Ak však nastane výpadok uzla a uzol v klastri nedostane v dohodnutom čase odpoveď pokúsi sa neodpovedajúci uzol ohradiť.V momente keď uzol stratí token zostávajúci členovia klastra nevedia v akom stave je neodpovedajúci uzol a preto ho treba zastaviť. Najčastejším spôsobom je reštart systému. Na ohradenie existuje cela rada nastrojov ako iLO, IMM, APC atd. V mojom pripade bezia nginx servery v prostredi vsphere od vmware-u a preto pouzijem agent vmware-soap.
Vytvorime teda zdroje na ohradenie uzlov, pre kazdy uzol jeden zdroj.
pcs stonith create lb-01-vmware-fence fence_vmware_soap ipaddr=vcenter.dubnik.sk ipport=443 ssl=1 ssl_insecure=1 login=administrator@vcenter.dubnik.sk passwd=passw0rd pcmk_host_map="lb-01.dubnik:lb01"
pcs stonith create lb-02-vmware-fence fence_vmware_soap ipaddr=vcenter.dubnik.sk ipport=443 ssl=1 ssl_insecure=1 login=administrator@vcenter.dubnik.sk passwd=passw0rd pcmk_host_map="lb-02.dubnik.sk:lb02"
Konfiguracia je priamociara a jednotlive direktivy hovoria sami za seba. Direktiva pcmk_host_map mapuje hostname (ktory bol pouzity pri vytvoreni clustera) a meno VM vo vcentry. Po vytvoreni nastavime obmedzenia aby sa zdroje spustali primarne na uzloch ku ktorym patria.
#pcs constraint location lb-01-vmware-fence prefers lb-01.dubnik.sk INFINITY
#pcs constraint location lb-02-vmware-fence prefers lb-02.dubnik.sk INFINITY
Po vytvoreni skontrolujeme ci zdroje bezia a ci su na spravnom uzle
[root@lb-01 ~]# pcs status | grep -i fence lb-01-vmware-fence (stonith:fence_vmware_soap): Started lb-01.dubnik.sk lb-02-vmware-fence (stonith:fence_vmware_soap): Started lb-02.dubnik.sk
Ak zdroje na ohradenie uspesne bezia dporucujem vyskusat aj manunalne ohradenie oboch uzlov nasedujicim prikazom. Uzol bude ohradeny a dojde k restartu uzla.
pcs stonith fence lb-02.dubnik.sk Node: lb-02.dubnik.sk fenced
A mozeme vidiet aj vo vcentry ze VM bola restartnuta na poziadanie.
Teraz je prvotna konfiguracia klastra pre spravne fungovanie dokoncena a mozeme pridat sluzby aby nas klaster aj realne nieco robil.Vysoká dostupnosť klastra je realizovaná plávajúcou virtuálnou adresou. Aktivny uzol ma priradenu tuto adresu a na tuto adresu je smerovana http/s komunikacia. V pripade vypadku aktivneho uzla si IP adresu prevezme povodne pasivny uzol a stane sa aktivnym. Vytvorime zdroj pre virtualnu IP adresu.
# pcs resource create lb_virtual_ip ocf:heartbeat:IPaddr2 ip=10.20.20.15 cidr_netmask=24 op monitor interval=20s
Ako dalsi zdroj vytvorime spustenie sluzby nginx
# pcs resource create lb_nginx_service systemd:nginx op monitor interval=20s
Teraz zostava nastavit obmedzenia aby sa zdroje spusali spolocne a vzdy iba na jednom uzle. Vyhodne je vytvorit skupinu zdrojov ktora definuje zdroje ktore maju bezat spolu a zabezpeci aj spravne poradie spustenia.
# pcs resource group add lb_resource_group lb_virtual_ip lb_nginx_service
A nastavime obmedzeie pre skupinu aby primarne bezala na uzle lb-01.
# pcs constraint location lb_resource_group prefers lb-01.dubnik.sk INFINITY
Tymto je konfiguracua klastra dokoncena a stav klastra mozeme skontrolovat oblubenym prikazom
Cluster name: lb-cluster Stack: corosync Current DC: metoo-ba-vmlx-lb-02.metoo.sk (version 1.1.19-8.el7_6.1-c3c624ea3d) - partition with quorum Last updated: Mon Dec 24 00:19:02 2018 Last change: Thu Dec 20 23:17:10 2018 by hacluster via crmd on metoo-ba-vmlx-lb-02.metoo.sk 2 nodes configured 4 resources configured Online: [ lb-01.dubnik.sk lb-02.dubnik.sk ] Full list of resources: lb-01-vmware-fence (stonith:fence_vmware_soap): Started lb-01.dubnik.sk lb-02-vmware-fence (stonith:fence_vmware_soap): Started lb-02.dubnik.sk Resource Group: lb_resource_group lb_virtual_ip (ocf::heartbeat:IPaddr2): Started lb-01.dubnik.sk lb_nginx_service (systemd:nginx): Started lb-01.dubnik.sk Daemon Status: corosync: active/enabled pacemaker: active/enabled pcsd: active/enabled
Na zaver doporucujem otestovat klaster nejakymi nahodnymi restartami uzlov aby sme mali prehlad o tom ako sa klaster sprava. V kazdom pripade by sa mal vzdy zotavit.