- CoreOS – moderní clusterovaný OS pro datová centra (1) – Úvod a instalace
- CoreOS – moderní clusterovaný OS pro datová centra (2) – Etcd, distribuovaný state
- CoreOS – moderní clusterovaný OS pro datová centra (3) – Etcd a konzistence
- CoreOS – moderní clusterovaný OS pro datová centra (4) – Fleet
- CoreOS – moderní clusterovaný OS pro datová centra (5) – pokročilý Fleet
- CoreOS – moderní clusterovaný OS pro datová centra (6) – je to Docker orchestrátor?
Minule jsme si popsali CoreOS a nainstalovali 3-nodový cluster. Dnes se podíváme na to, jak se v clusteru sdílí state – na distribuovaný key/value store Etcd, který nachází využití i mimo samotný CoreOS.
Základní operace s CLI
Etcd není nic tajemného ani složitého. Jednoduše nastavíte nějaký klíč a jemu přiřadíte hodnotu. Tato informace pak bude dostupná v celém clusteru. Nejprve to vyzkoušíme s CLI klientem, který je v CoreOS připraven.
V prvním okně si otevřete core-01 (vagrant ssh core-01), vytvořte klíč /pozdrav a dejte mu hodnotu.
core@core-01 ~ $ etcdctl set /pozdrav "HPE zdravi CoreOS" HPE zdravi CoreOS
Přečtěme ji.
core@core-01 ~ $ etcdctl get /pozdrav HPE zdravi CoreOS
V druhém okně si otevřete session do core-02 a přečtěte si hodnotu klíče /pozdrav. Informace je replikována.
core@core-02 ~ $ etcdctl get /pozdrav HPE zdravi CoreOS
V core-02 hodnotu změníme.
core@core-02 ~ $ etcdctl set /pozdrav "HPE zdravi Etcd" HPE zdravi Etcd
A v core01 přečteme.
core@core-01 ~ $ etcdctl get /pozdrav HPE zdravi Etcd
Kromě samotné hodnoty jsou uložena základní metadata, jako je Index (pro naše účely zatím neřešme co to je, berme to třeba jako jakési globální pořadové číslo).
Vypište si informace v JSON formátu.
core@core-01 ~ $ etcdctl -o json get /pozdrav {"action":"get","node":{"key":"/pozdrav","value":"HPE zdravi Etcd","nodes":null,"createdIndex":14920,"modifiedIndex":14920},"prevNode":null}
Nebo textově, ale s kompletními údaji.
core@core-01 ~ $ etcdctl -o extended get /pozdrav Key: /pozdrav Created-Index: 14920 Modified-Index: 14920 TTL: 0 Index: 15491 HPE zdravi Etcd
Adresáře
Klíče si můžete logicky seskupovat do adresářů, což je v zásadě přidání další části URL. Dává tak smysl sdružovat nějakou sadu informací. Například jedním z typických využití Etcd je discovery služeb, například aplikace v kontejneru takto může poznat, kde má databázi a jak se do ní připojit.
Vyzkoušejme si to.
core@core-01 ~ $ etcdctl set /mojedb/ip "1.2.3.4" 1.2.3.4 core@core-01 ~ $ etcdctl set /mojedb/port 3306 3306 core@core-01 ~ $ etcdctl set /mojedb/username mujlogin mujlogin core@core-01 ~ $ etcdctl set /mojedb/password mojeheslo mojeheslo
Můžete si vypsat klíče v adresáři.
core@core-01 ~ $ etcdctl ls /mojedb /mojedb/ip /mojedb/port /mojedb/username /mojedb/password
S trouchou “bashování” si vypišme hodnoty.
core@core-01 ~ $ etcdctl ls /mojedb | xargs -I{} etcdctl get {} 1.2.3.4 3306 mujlogin mojeheslo
Čekání na změny
Dalším typickým použitím je, že jedna aplikace (kontejner, proces) reaguje na nějakou změnu stavu iniciovanou jiným procesem. Třeba kdy se objeví nějaká služba nebo naopak zmizí (a pak na ni není dobré nic posílat) či dojde k nějaké jiné změně. Abyste nemuseli neefektivně tahat informaci v pravidelných intervalech, je možné použít “long poll”, tedy otevřít si komunikaci na Etcd a dostat avízo hned, jak ke změně klíče dojde.
Vyzkoušejte si. Na core-01 nastavte barvu na modrou a čekejte na změny. CLI se zastaví.
core@core-01 ~ $ etcdctl set /barva modra modra core@core-01 ~ $ etcdctl watch /barva --forever
V core-02 změňte několikrát barvu.
core@core-02 ~ $ etcdctl set /barva cervena cervena core@core-02 ~ $ etcdctl set /barva zelena zelena
Mezitím v core vám budou změny rovnou naskakovat.
core@core-01 ~ $ etcdctl watch /barva --forever cervena zelena
Můžete dokonce na základě změny hodnoty reagovat přímo spuštěním nějakého příkazu. Vyzkoušíme si třeba vyvolání ping v okamžiku změny (asi nic moc praktického, ale na ukázku dobré).
core@core-01 ~ $ etcdctl exec-watch /barva -- ping -c 2 127.0.0.1
V core-02 změňte barvu.
core@core-02 ~ $ etcdctl set /barva oranzova oranzova
V core-01 se nám na základě toho spustil příkaz.
core@core-01 ~ $ etcdctl exec-watch /barva -- ping -c 2 127.0.0.1 PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data. 64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.000 ms 64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.088 ms --- 127.0.0.1 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 999ms rtt min/avg/max/mdev = 0.000/0.044/0.088/0.044 ms
Časově omezené informace
Některé údaje mohou zastarávat. Etcd můžete například použít k informaci o zdravotním stavu nebo přístupnosti nějaké služby (třeba komponenty s REST API nebo webového serveru, na který balancujete). Etcd není nástroj, který by monitoroval dostupnost služeb, ale může dobře posloužit k šíření této informace. Typicky tak třeba při startu kontejneru tento zaregestruje službu v Etcd. Pokud kontejner zrušíte, je dobré to provádět přes SIGTERM (tedy dát procesům chviličku na poklidnou smrt). Kontejner službu odregistruje, tedy vymaže z Etcd. Může se ale také stát, že se služba odporoučí násilně. Řešením může být záznam služby časově omezit a pravidelně aktualizovat. Pokud služba zmizí ze světa, po nějakém čase zmizí i z Etcd.
Nastavme dočasnou hodnotu s platností 30 vteřin. A přečtete si ji – uvidíte zbývající TTL.
core@core-01 ~ $ etcdctl set /docasna hodnota --ttl 30 hodnota core@core-01 ~ $ etcdctl -o extended get /docasna Key: /docasna Created-Index: 16041 Modified-Index: 16041 TTL: 24 Index: 16044 hodnota core@core-01 ~ $ etcdctl -o extended get /docasna Key: /docasna Created-Index: 16041 Modified-Index: 16041 TTL: 11 Index: 16054 hodnota
Po nějaké době tam už nebude.
core@core-01 ~ $ etcdctl -o extended get /docasna Error: 100: Key not found (/docasna) [16065]
Použití REST API
CLI nám výborně posloužilo pro lidskou interakci, ale nejčastějším “zákazníkem” Etcd budou aplikace využívající jeho vlastností. Pro ty je pochopitelně daleko příjemnější a přirozenější použít REST API. To samozřejmě dokáže totéž co CLI, ale i něco navíc (nové funkce jsou typicky nejprve dostupné v API, CLI se řeší až později). Určitě jste si všimli, že názvy klíčů a vytváření adresářů vypadají trochu jako URL, že?
Takto vytvoříte nový klíč a jeho hodnotu – pošlete HTTP PUT na URL Etcd, kde do cesty uvedete název nového klíče.
core@core-01 ~ $ curl http://127.0.0.1:4001/v2/keys/dalsiklic -X PUT -d value=hodnota {"action":"set","node":{"key":"/dalsiklic","value":"hodnota","modifiedIndex":16695,"createdIndex":16695}}
Čtení probíhá na stejné URL, jen použijete HTTP metodu GET.
core@core-01 ~ $ curl http://127.0.0.1:4001/v2/keys/dalsiklic -X GET {"action":"get","node":{"key":"/dalsiklic","value":"hodnota","modifiedIndex":16695,"createdIndex":16695}}
Chcete smazat klíč? Stejná URL, ale HTTP DELETE (docela předvídatelné, ne?)
core@core-01 ~ $ curl http://127.0.0.1:4001/v2/keys/dalsiklic -X DELETE {"action":"delete","node":{"key":"/dalsiklic","modifiedIndex":16717,"createdIndex":16695},"prevNode":{"key":"/dalsiklic","value":"hodnota","modifiedIndex":16695,"createdIndex":16695}} core@core-01 ~ $ curl http://127.0.0.1:4001/v2/keys/dalsiklic -X GET -d value=hodnota {"errorCode":100,"message":"Key not found","cause":"/dalsiklic","index":16719}
Můžeme třeba nastavit klíči TTL – stačí příslušný atribut přidat.
core@core-01 ~ $ curl http://127.0.0.1:4001/v2/keys/docasnyklic -X PUT -d value=hodnota -d ttl=10 {"action":"set","node":{"key":"/docasnyklic","value":"hodnota","expiration":"2016-03-29T10:57:36.699456935Z","ttl":10,"modifiedIndex":16777,"createdIndex":16777}}
A otevření dlouhé session číhající na změnu hodnoty? Přidejte do URL parametr wait=true.
core@core-01 ~ $ curl -L http://127.0.0.1:4001/v2/keys/mujklic?wait=true -X GET -d value=hodnota core@core-02 ~ $ etcdctl set /mujklic hodnota hodnota core@core-01 ~ $ curl -L http://127.0.0.1:4001/v2/keys/mujklic?wait=true -X GET -d value=hodnota {"action":"set","node":{"key":"/mujklic","value":"hodnota","modifiedIndex":16849,"createdIndex":16849}}
A takto bychom mohli pokračovat dál. Pokud máte nějakou zkušenost s REST API, zjistíte, že je to vlastně ještě jednodušší a logičtější, než příkazová řádka. Etcd je hodně jednoduché na použití a při tom velmi mocné.