CRI-O ako náhrada za Docker ako vykonávacie prostredie pre Kubernetes: konfigurácia na CentOS 8

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.

CRI-O ako náhrada za Docker ako vykonávacie prostredie pre Kubernetes: konfigurácia na CentOS 8

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 tomto článku, 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ý článok v Red Hat blog), tak aj v externých. recenziá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 ako náhrada za Docker ako vykonávacie prostredie pre Kubernetes: konfigurácia na CentOS 8

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 vypnúť swap.

Všetky operácie na hostiteľovi vykonávame pod menom používateľa root, buďte opatrní.

  1. 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 dokumenácie, 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 --reload

      Na vypnutie firewallu môžeme použiť nasledujúci príkaz:

      systemctl disable --now firewalld
      

      SELinux 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
      EOF
      

      aplikujeme 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.18
      

      pridá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-o
      

      Vš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.conf

      Teraz môžeme aktivovať a spustiť démon CRI-O:

      systemctl enable --now crio
      

      Môžeme skontrolovať stav démona:

      systemctl status crio
      

  2. 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
      EOF
      

      Teraz 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 kubelet
      

      Na konfiguráciu ovládacieho panela alebo pracovník uzlov za pár minút môžete využiť tento skript.

  3. Je čas inicializovať náš klaster.
    • Na inicializáciu klastera zadajte príkaz:
      kubeadm init --pod-network-cidr=10.244.0.0/16
      

      Nezabudnite 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ť skript, 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ž.

Č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:



Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster