Ahoj,
po delší odmlce přináším zase nějaké informace o vývoji vpsAdminOS. Je
to už půl roku, bude to delší.
TL;DR je, že migrace produkčních VPS je stále daleko, ale spuštění
produkčního node jsme blíže. Postupně vylepšujeme staging, odstávky už
nejsou tak často a poctivě je hlásíme dopředu. Kdo chce nebo potřebuje,
VPS už tam může provozovat. Produkce to ale stále není.
Padající vpsAdmin
=================
Na únorové schůzi jsem zmiňoval, že nám na vpsAdminOS nehorázně často
padá vpsAdmin. A to na segfault v ruby, nic z čeho by se dalo zotavit.
Bohužel to padalo vždy při ukládání výsledku vykonaných operací, což pak
vedlo k tomu, že se vykonávaly vícekrát a vznikaly tak nesmysly na disku
i v databázi. Nakonec se mi to podařilo vyřešit aktualizací všech
komponent, zejména mysql connector byl v nixpkgs v nějaké zapomenuté
verzi. Teď to... sice taky občas padá, ale ne tak často a ne v tu
nejhorší chvíli.
NFS na stagingu
===============
Další nekonečný příběh je zpřístupnění nasboxu, nebo obecně NFS. V čem
je problém: VPS používají user namespace, tzn. váš root z VPS nemá na
nodu uid 0, ale nějaké jiné číslo. Z pohledu nodu je to neprivilegovaný
uživatel a jako superuživatel se tváří jen ve VPS. To taky znamená, že
pokud připojíte NFS export, na NFS server chodí UID/GID z VPS tak jak je
vidí node, čili jako neprivilegovaní uživatelé. Proto i na NFS serveru
mapujeme UID/GID na vašich datasetech, aby to sedělo s user namespace ve
VPS.
V březnu jsem ve vpsAdminu dokončil implementaci správy user namespace,
nastavování map u datasetů a mounty. Hned jsem to chtěl vyzkoušet a šel
datasety na nasboxu exportovat i na adresu node1.stg... No a byl z toho
několikahodinový výpadek [1]. Exporty na NFS serveru se mění jeden po
druhém, takže každý bude mít krátký výpadek a jede se dál, že? Bohužel
ani náhodou. Nevím čím to je, ale když takhle hromadně měníte exporty,
NFS server přestane obsluhovat klienty. Všechny klienty. Ani po
zastavení operace server nezačal klienty obsluhovat, takže panika,
restarty NFSD a znovu všechno exportovat... Ponaučení: více trpělivosti
a nesahat na exporty bez nahlášené odstávky někdy v noci. Jinak by
stačilo chvíli počkat a server by začal pracovat, prostě to jen dlouho
trvalo.
Po téhle bitvě to nakonec na stagingu stejně nefungovalo správně.
Protože root z VPS byl na NFS serveru co? Neprivilegovaný uživatel. Jako
neprivilegovaný uživatel neměl oprávnění pracovat se soubory jiných
uživatelů, atd. Prakticky nepoužitelné. Zde se nabízejí dvě řešení: NFS
klient musí posílat UID/GID tak jak je vidí VPS, na NFS serveru by tak
root byl privilegovaný uživatel. Druhá možnost by byla nastavit NFS
server tak, aby určité neprivilegované UID bral jako privilegované.
Protože jsem v tu dobu nenašel žádnou aktivitu vývojářů NFS v tomhle
ohledu, rozhodl jsem se implementovat tu druhou variantu, neboť mi
přišla jednodušší. Výsledkem je nový parametr u exportu root_uid, což by
se nastavilo podle mapování roota v jednotlivých VPS:
zfs set sharenfs="root_uid=666000" storage/vpsfree.cz/nas/...
Potíž je, že to vyžaduje patch kernelu [2] i patch nfs-utils [3] v
userspace. Funguje to pěkně, jenže na nasboxu není vpsAdminOS. Sice by
to šlo napasovat i na OpenVZ, ale rozhodli jsme se rovnou přejít na
vpsAdminOS. Protože nasbox používá kolem 700 VPS, nejdříve jsme si
vpsAdminOS vyzkoušeli na backuperu, který v tomto ohledu není tak důležitý.
Jeden problém s NFS při startu systému jsme skutečně odhalili a snad i
opravili. Jinak to funguje velice pěkně. nasbox je další na řadě.
Bohužel se to teď zase komplikuje, protože do Linuxu 5.2 přistály patche
[4], které implementují tu první možnost: UID/GID překládá už klient a
na server chodí tak jak je vidí VPS. To je pro nás velká komplikace a
než se k něčemu rozhodneme, musíme to vyzkoušet. Z NFS na stagingu tedy
ještě nějaký měsíc nic nebude.
br_netfilter
============
Někdo se na IRC ptal na br_netfilter, který v Linuxu nepodporuje
namespace a ve VPS tak nejde používat. Existuje ale patchset, který to
implementuje. Do našeho kernelu jsme tento patchset přidali, nicméně...
nevím k čemu se to používá, vím akorát že to používají nějaké aplikace v
dockeru. Pokud to někdo potřebujete, řekněte nám prosím na co a jak je
to důležité. Jinak není vyloučeno, že to budeme muset pustit, pokud se
to nedostane do upstreamu.
Linux 5.0, 5.1, ZFS
===================
Na stagingu průběžně přecházíme na nové verze kernelu. V produkci pak
počítám že na delší dobu zakotvíme na nějakém LTS kernelu.
Pro naše patche kernelu jsme vytvořili repozitář na githubu:
https://github.com/vpsfreecz/linux/branches/all
Mohli jste zaznamenat, že Linux 5.0 omezil export funkcí [5] pro práci s
FPU na GPL-only a odstřihl tak ZFS on Linux. Tímhle si nehodláme
komplikovat život, ani snižovat výkon. Ten export jsme si v kernelu
patchnuli, stejně jako to pak udělal i NixOS [6].
V pátek jsme přešli na Linux 5.1 a ZFS on Linux 0.8.0. ZoL 0.8 je
opravdu parádní vydání, doporučuju se podívat na novinky [7].
/sys/devices/system/cpu/online
==============================
... používají některé aplikace na detekci počtu procesorů, aby věděly
kolik mají používat vláken, workerů, apod. Tyto údaje v Linuxu nejsou
nijak virtualizované a řeší se to v userspace pomocí LXCFS. Co všechno
máte ve VPS "virtualizováno" přes LXCFS zjístite s:
grep lxcfs /proc/mounts
V pátek jsme nasadili verzi LXCFS, která řeší i
/sys/devices/system/cpu/online. Používá to např. Python když zavoláte
multiprocessing.cpu_count().
pty-wrapper
===========
Aby měly všechny VPS otevřenou konzoli, pouštíme je ve wrapperu, který
přichystá pseudoterminál a pak zprostředkovává komunikaci mezi osctld ve
vpsAdminOS a vzdálenou konzolí ve vpsAdminu. Původně jsme tento program
měli napsán v Ruby, jenže to na každou VPS zabíralo cca 15 MB paměti,
které se účtovaly k zabrané paměti VPS. sorki to přepsal [8] do Haskellu
a jsme teď na 5 MB na VPS.
Deklarativní konfigurace ZFS datasetů
=====================================
Při instalaci nodu je potřeba nastavit ZFS properties, jako např.
zapnutí komprese, nebo vytvořit nějaké datasety na zpoolu. Vše je teď
možné deklarativně nastavit v konfiguračních souborech [9], abychom na
nic nezapomněli.
Parametry kernelu
=================
Kernel má spoustu hejblátek, které omezují určité prostředky, jako
velikost ARP tabulky, inotify, kernel keyring a počty procesů. Právě na
maximální počet procesů jsme na node1.stg nedávno narazili. Pokusil jsem
se s tím udělat pořádek a vpsAdminOS nyní obsahuje doporučené nastavení
[10] těchto voleb.
Zjednodušení vytváření kontejnerů
=================================
vpsAdminOS původně vyžadoval manuální správu mapování UID/GID v user
namespace. Na stagingu to za vás řeší vpsAdmin, ale v OS samotném to
bylo zbytečně komplikované. Aby šel vytvořit kontejner, muselo nejdřív
existovat ono mapování:
osctl user new --map 0:666000:65536 myuser
osctl ct new --user myuser --distribution ubuntu myct
Nově je nastavení UID/GID map volitelné. Ve výchozím stavu se pro každý
kontejner alokuje unikátní blok UID/GID z definovaného rozsahu. --user
se tak vůbec nemusí používat a stačí:
osctl ct new --distribution ubuntu myct
Díky tomu jsou od sebe kontejnery automaticky odděleny a zároveň to není
žádná práce pro uživatele navíc.
nixos-modules
=============
Máme už celkem dost konfigurace a modulů v Nixu. Aby se daly některé
moduly použít na více místech, vytvořili jsme repozitář nixos-modules
[11]. Zatím obsahuje modul na použití libvirtu, který funguje i ve VPS.
build.vpsfree.cz
================
Máme nový (resp. je to nějaký starší HW) stroj na sestavování OS a
bootovacích obrazů pro nody. I zde je vpsAdminOS, ale nainstalovaný na
disku a bootuje ze ZFS. I takto se dá použít.
Chystám se zde taky automatizovat build šablon distribucí pro VPS. Nyní
se šablony musí sestavovat a testovat manuálně, což se nikomu nechce
dělat a zejména rolling-release distribuce zaostávají. O tom zase někdy
příště.
IPv6 na stagingu
================
Kdo máte VPS na stagingu, určitě jste si všimli problémů s IPv6. Bylo to
tím, že neseděly BGP timeouty mezi Dell switchi a birdem na node1.stg.
Už nějakou dobu to funguje stabilně.
Co dál
======
Ke spuštění produkčního node chybí: NFS (viz výše) a syslog namespace.
Monitoring už tak nějak funguje -- při výpadku nám chodí SMS, ale ještě
je co vylepšovat co se týče sledování zdrojů.
syslog namespace je důležitý k tomu, abyste dostávali informaci o tom,
že vaši VPS navštívil OOM killer. Teď vám mohou mizet procesy a nevíte o
tom. Patchset už máme [12], musí se to přidat do kernelu a vyzkoušet.
[1]
https://vpsadmin.vpsfree.cz/?page=outage&action=show&id=511
[2]
https://github.com/vpsfreecz/linux/commit/ab987ee27f0a57f0dae3f0847db2ce4da…
[3]
https://github.com/vpsfreecz/vpsadminos/blob/master/os/packages/nfs-utils/p…
[4]
https://lwn.net/Articles/788292/
[5]
https://www.root.cz/zpravicky/zfs-on-linux-ma-mensi-zadrhel-s-kernelem-5-0/
[6]
https://www.phoronix.com/scan.php?page=news_item&px=NixOS-Linux-5.0-ZFS…
[7]
https://github.com/zfsonlinux/zfs/releases/tag/zfs-0.8.0
[8]
https://github.com/vpsfreecz/pty-wrapper
[9]
https://vpsadminos.org/os/pools/#declarative-pool-structure
[10]
https://github.com/vpsfreecz/vpsadminos/blob/master/os/configs/tunables.nix
[11]
https://github.com/vpsfreecz/nixos-modules
[12]
https://github.com/torvalds/linux/compare/master...vpsfreecz:syslogns-5.1
Jakub