Ahoj! Volám sa Sergej, som DevOps v Surf. Oddelenie DevOps v Surf si kladie za cieľ nielen zlepšiť spoluprácu medzi špecialistami a integrovať pracovné procesy, ale aj aktívne preskúmavať a zavádzať aktuálne technológie do vlastnej infraštruktúry, ako aj do infraštruktúry zákazníkov.
Nižšie vám trochu prerozprávam zmeny v technologickom stacku pre kontajnery, s ktorými sme sa stretli pri štúdiu distribúcie. CentOS 8 a o tom, čo je CRI-O a ako rýchlo nastaviť pomocou neho vykonávacie prostredie pre Kubernetes.

Prečo Docker chýba v štandardnej distribúcii CentOS 8
Po nainštalovaní posledných hlavných verzií RHEL 8 alebo CentOS 8 sa nedá nepostrehnúť: v týchto distribúciách a oficiálnych repozitároch chýba aplikácia Docker, ktorá ideologicky a funkčne nahrádza balíky Podman, Buildah (prítomné v distribúcii podľa predvolených nastavení) a CRI-O. To je spojené s praktickou realizáciou štandardov, ktoré sú vyvíjané, vrátane spoločnosti Red Hat v rámci projektu Open Container Initiative (OCI).
Cieľom OCI, ktorý je súčasťou The Linux Foundation, je vytvorenie otvorených priemyselných štandardov pre formáty a vykonávacie prostredie kontajnerov, ktoré by riešili niekoľko úloh. Po prvé, nesmeli by byť v rozpore s filozofiou Linuxu (napríklad v tej časti, že každá aplikácia by mala vykonávať len jednu úlohu, zatiaľ čo Docker je akýmsi kombajnom všetko-v-jednom). Po druhé, mali by odstrániť všetky existujúce nedostatky v softvéri. DockerPo tretie, mali by byť plne kompatibilné s obchodnými požiadavkami kladenými poprednými komerčnými platformami pre nasadenie, správu a údržbu kontajnerizovaných aplikácií (napríklad Red Hat OpenShift).
Nevýhody Docker a prednosti nového softvéru už boli dosť podrobne opísané v , a na podrobnosti o všetkom, čo sa ponúka v rámci projektu OCI a jeho architektonických vlastnostiach, sa môžete pozrieť v oficiálnej dokumentácii a článkoch ako od samotnej spoločnosti Red Hat (dobrý v Red Hat blog), tak aj v externých. .
Je dôležité poznamenať, akú funkcionalitu majú komponenty ponúkaného stacku:
- Podman — priame interakcie s kontajnermi a úložiskom obrazov cez proces runC;
- Buildah — zostavovanie a nahrávanie obrazov do registra;
- CRI-O — vykonávacie prostredie pre systémy orchestrácie kontajnerov (napríklad Kubernetes).
Myslím, že na pochopenie celkovej schémy interakcie medzi komponentami stohu je vhodné uviesť diagram vzťahov. Kubernetes c runC a nízkoúrovňové knižnice s využitím CRI-O:

CRI-O a Kubernetes dodržiavajú rovnaký cyklus vydávania a podpory (matrica kompatibility je veľmi jednoduchá: hlavné verzie Kubernetes a CRI-O sú zhodné), a to, s ohľadom na orientáciu na úplné a dôkladné testovanie funkčnosti tohto stacku vývojármi, nám dáva právo očakávať maximálnu dosiahnuteľnú stabilitu pri akýchkoľvek scenároch používania (k prospechu prichádza aj relatívna ľahkosť CRI-O v porovnaní s Docker z dôvodu cieľového obmedzenia funkčnosti).
Pri inštalácii Kubernetes spôsobom „right way“ (podľa OCI, samozrejme) s využitím CRI-O na CentOS 8 stretli sme sa s niekoľkými problémami, ktoré sme však úspešne prekonali. Rád sa s vami podelím o inštrukcie na inštaláciu a nastavenie, ktoré spolu zaberú maximálne 10 minút.
Ako nasadiť Kubernetes na CentOS 8 s použitím prostredia CRI-O
Predpoklady: minimálne jeden hostiteľ (2 jadrá, 4 GB RAM, úložný priestor minimálne 15 GB) s nainštalovanou CentOS 8 (odporúča sa inštalačný profil „Server“), ako aj záznam pre neho v lokálnom DNS (v krajnom prípade možno prežiť so záznamom v /etc/hosts). A nezabudnite .
Všetky operácie na hostiteľovi vykonávame pod menom používateľa root, buďte opatrní.
- Na prvom kroku nastavíme OS, nainštalujeme a nastavíme predbežné závislosti pre CRI-O.
- Aktualizujeme OS:
dnf -y update
- Následne je potrebné nastaviť firewall a SELinux. Tu všetko závisí od prostredia, v ktorom budú pracovať naši hostitelia. Môžete buď nastaviť firewall podľa odporúčaní z , alebo, ak ste v dôveryhodnej sieti alebo používate externý firewall, zmeniť predvolenú zónu na dôveryhodnú alebo vypnúť firewall:
firewall-cmd --set-default-zone trusted firewall-cmd --reloadNa vypnutie firewallu môžeme použiť nasledujúci príkaz:
systemctl disable --now firewalldSELinux musí byť buď vypnutý, alebo prepnúť do režimu „permissive“:
setenforce 0 sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
- načítame potrebné jadrové moduly a balíky, nastavíme automatické načítanie modulu „br_netfilter“ pri štarte systému:
modprobe overlay modprobe br_netfilter echo "br_netfilter" >> /etc/modules-load.d/br_netfilter.conf dnf -y install iproute-tc
- pre aktiváciu forwardingu paketov a správne spracovanie trafičku vykonáme príslušné nastavenia:
cat > /etc/sysctl.d/99-kubernetes-cri.conf <<EOF net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 net.bridge.bridge-nf-call-ip6tables = 1 EOFaplikujeme vykonané nastavenia:
sysctl --system
- nastavíme potrebnú verziu CRI-O (hlavná verzia CRI-O, ako už bolo spomenuté, zodpovedá požadovanej verzii Kubernetes), pretože posledná stabilná verzia Kubernetes je momentálne 1.18:
export REQUIRED_VERSION=1.18pridáme potrebné repozitáre:
dnf -y install 'dnf-command(copr)' dnf -y copr enable rhcontainerbot/container-selinux curl -L -o /etc/yum.repos.d/devel:kubic:libcontainers:stable.repo https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable/CentOS_8/devel:kubic:libcontainers:stable.repo curl -L -o /etc/yum.repos.d/devel:kubic:libcontainers:stable:cri-o:$REQUIRED_VERSION.repo https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable:cri-o:$REQUIRED_VERSION/CentOS_8/devel:kubic:libcontainers:stable:cri-o:$REQUIRED_VERSION.repo
- teraz môžeme nainštalovať CRI-O:
dnf -y install cri-oVšimnite si prvý bod, s ktorým sa stretávame počas inštalácie: je potrebné upraviť konfiguráciu CRI-O pred spustením služby, pretože požadovaný komponent conmon má iné, ako uvedené miesto umiestnenia:
sed -i 's//usr/libexec/crio/conmon//usr/bin/conmon/' /etc/crio/crio.confTeraz môžeme aktivovať a spustiť démon CRI-O:
systemctl enable --now crioMôžeme skontrolovať stav démona:
systemctl status crio
- Aktualizujeme OS:
- Inštalácia a aktivácia Kubernetes.
- Pridáme požadovaný repozitár:
cat < /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-$basearch enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg exclude=kubelet kubeadm kubectl EOFTeraz môžeme nainštalovať Kubernetes (verzia 1.18, ako už bolo uvedené vyššie):
dnf install -y kubelet-1.18* kubeadm-1.18* kubectl-1.18* --disableexcludes=kubernetes
- Druhý dôležitý bod: pretože nepoužívame démon Docker, ale používame démon CRI-O, pred spustením a inicializáciou Kubernetes je potrebné vykonať príslušné nastavenia v konfiguračnom súbore /var/lib/kubelet/config.yaml, pričom najskôr vytvoríme potrebný adresár:
mkdir /var/lib/kubelet cat < /var/lib/kubelet/config.yaml apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration cgroupDriver: systemd EOF
- Tretí dôležitý bod, s ktorým sa stretávame pri inštalácii: napriek tomu, že sme uviedli používaný ovládač cgroup, a jeho nastavenie prostredníctvom argumentov predávaných kubelet je zastarané (čo je priamo uvedené v dokumentácii), musíme pridať argumenty do súboru, inak sa náš klaster neinitializuje:
cat /dev/null > /etc/sysconfig/kubelet cat < /etc/sysconfig/kubelet KUBELET_EXTRA_ARGS=--container-runtime=remote --cgroup-driver=systemd --container-runtime-endpoint='unix:///var/run/crio/crio.sock' EOF
- Teraz môžeme aktivovať démon kubelet:
sudo systemctl enable --now kubeletNa konfiguráciu ovládacieho panela alebo pracovník uzlov za pár minút môžete využiť .
- Pridáme požadovaný repozitár:
- Je čas inicializovať náš klaster.
- Na inicializáciu klastera zadajte príkaz:
kubeadm init --pod-network-cidr=10.244.0.0/16Nezabudnite si zaznamenať príkaz na pripojenie k klasteru „kubeadm join …“, ktorý sa navrhuje využiť na konci výstupu, alebo aspoň uvedené tokeny.
- Nainštalujeme plugin (CNI) na prácu s Pod sieťou. Odporúčam použiť Calico. Možno populárnejší Flannel má problémy s kompatibilitou s nftables, a tiež Calico — jediná implementácia CNI, odporúčaná a úplne testovaná projektom Kubernetes:
kubectl --kubeconfig /etc/kubernetes/admin.conf apply -f https://docs.projectcalico.org/v3.15/manifests/calico.yaml
- Na pripojenie pracovník uzla k nášmu klasteru je potrebné ho nastaviť podľa bodov 1 a 2, alebo využiť , potom vykonajte príkaz z výstupu „kubeadm init …“, ktorý sme si zapísali na predchádzajúcom kroku:
kubeadm join $CONTROL_PLANE_ADDRESS:6443 --token $TOKEN --discovery-token-ca-cert-hash $TOKEN_HASH
- Skontrolujme, že náš klaster bol inicializovaný a začal pracovať:
kubectl --kubeconfig=/etc/kubernetes/admin.conf get pods -A
Hotovo! Už môžete umiestniť na svoj K8s klaster záťaž.
- Na inicializáciu klastera zadajte príkaz:
Čo nás čaká ďalej
Dúfam, že vyššie uvedený návod vám pomohol ušetriť trochu času a nervov.
Osud procesov, ktoré prebiehajú v priemysle, často závisí od toho, ako ich prijíma väčšina koncových používateľov a vývojárov iného softvéru v príslušnej oblasti. Zatiaľ nie je úplne jasné, akého výsledku dosiahnu iniciatívy OCI za niekoľko rokov, ale budeme to s radosťou sledovať. Svoj názor môžete zdieľať hneď teraz v komentároch.
Stay tuned!
Tento článok vznikol vďaka nasledujúcim zdrojom:
- Sekcii o Container runtimes v
- projektu CRI-O na internete
- Článkom na blogoch Red Hat: , a mnohým ďalším
Zdroj: habr.com
