CRI-O kao zamjena za Docker kao izvršno okruženje za Kubernetes: postavljanje na CentOS 8

Bok! Zovem se Sergej, ja sam DevOps u Surf-u. DevOps odjel u Surf-u ima zadatak ne samo da uspostavi suradnju među stručnjacima i integrira radne procese, već i da aktivno istražuje i implementira aktualne tehnologije u vlastitu infrastrukturu, kao i u infrastrukturu klijentâ.

U nastavku ću malo govoriti o promjenama u tehnološkom stogu za kontejnere s kojima smo se susreli prilikom proučavanja distribucije. CentOS 8 i o tome što je CRI-O i kako brzo postaviti izvršno okruženje uz njegovu pomoć za Kubernetes.

CRI-O kao zamjena za Docker kao izvršno okruženje za Kubernetes: postavljanje na CentOS 8

Zašto Docker nedostaje u standardnoj isporuci CentOS 8.

Nakon instalacije najnovijih glavnih izdanja RHEL 8 ili CentOS 8 ne može se ne primijetiti: u ovim distribucijama i službenim repozitorijima nedostaje aplikacija Docker, koje ideološki i funkcionalno zamjenjuju pakete Podman, Buildah (prisutan je u distribuciji prema zadanim postavkama) i CRI-O. To je povezano s praktičnom implementacijom standarda koje razvija, između ostalog, i tvrtka Red Hat u okviru projekta Open Container Initiative (OCI).

Cilj OCI, koji je dio The Linux Foundation, je stvaranje otvorenih industrijskih standarda za formate i izvršna okruženja kontejnera koji bi rješavali nekoliko zadataka. Prvo, ne bi smjeli biti u suprotnosti s filozofijom Linux-a (na primjer, u tom dijelu, da svaka aplikacija treba obavljati neku jednu radnju, dok Docker predstavlja svojevrsni kombajn za sve-u-jednom). U drugo, trebali bi ukloniti sve postojeće nedostatke u softveru. DockerTreće, trebali bi biti potpuno kompatibilni s poslovnim zahtjevima koje postavljaju vodeće komercijalne platforme za implementaciju, upravljanje i održavanje kontejneriziranih aplikacija (na primjer, Red Hat OpenShift).

Nedostaci Docker i prednosti novog softvera već su prilično detaljno opisane u ovom članku, a detaljan opis svega što se nudi u okviru projekta OCI softverskog stoga i njegovih arhitektonskih značajki može se pronaći u službenoj dokumentaciji i člancima kako od samog Red Hat-a (dobar članak u Red Hat blogu), tako i u vanjskim pregledima..

Važno je napomenuti koju funkcionalnost imaju komponente predloženog stoga:

  • Podman — izravna interakcija s kontejnerima i pohranom slika putem procesa runC;
  • Buildah — sastavljanje i učitavanje slika u registar;
  • CRI-O — izvršno okruženje za sustave orkestracije kontejnera (npr. Kubernetes).

Mislim da je za razumijevanje opće sheme interakcije između komponenti stoga korisno navesti ovdje shemu povezanosti Kubernetes c runC i nisko-nivojske biblioteke koristeći CRI-O:

CRI-O kao zamjena za Docker kao izvršno okruženje za Kubernetes: postavljanje na CentOS 8

CRI-O i Kubernetes pridržavaju se istog ciklusa izdanja i podrške (matrica kompatibilnosti je vrlo jednostavna: glavni verzije Kubernetes i CRI-O se podudaraju), a to, uz obzirom na usmjerenje na potpuno i sveobuhvatno testiranje rada ovog stoga od strane developera, daje nam pravo da očekujemo maksimalnu stabilnost u radu u svim scenarijima korištenja (ovdje pomaže i relativna lakoća CRI-O u usporedbi s Docker zbog usmjerenog ograničenja funkcionalnosti).

Prilikom instalacije Kubernetes na „pravi način“ (prema OCI-u, naravno) koristeći CRI-O na CentOS 8 nateknuli smo na male poteškoće, koje smo, međutim, uspješno prevazišli. Bit ću zadovoljan podijeliti s vama upute za instalaciju i konfiguraciju, koje će u zbiru trajati najviše 10 minuta.

Kako postaviti Kubernetes na CentOS 8 koristeći CRI-O okruženje

Preduslovi: minimalno jedan poslužitelj (2 jezgre, 4 GB RAM, pohrana ne manja od 15 GB) s instaliranim CentOS 8 (preporučuje se profil instalacije „Server“), kao i zapis za njega u lokalnom DNS-u (u najgorem slučaju, može se proći i sa zapisom u /etc/hosts). I ne zaboravite isključiti swap.

Sve operacije na poslužitelju obavljaju se pod korisnikom root, budite oprezni.

  1. U prvom koraku ćemo postaviti OS, instalirati i konfigurirati prethodne zavisnosti za CRI-O.
    • Ažuriraćemo OS:
      dnf -y update
      

    • Nakon toga treba postaviti firewall i SELinux. Ovdje se sve oslanja na okruženje u kojem će raditi naš poslužitelj ili poslužitelji. Možete ili postaviti firewall prema preporukama iz dokumentaciju, ili ako ste u pouzdanoj mreži ili koristite vanjski firewall, promijeniti zadanu zonu na pouzdanu ili isključiti firewall:
      firewall-cmd --set-default-zone trusted
      
      firewall-cmd --reload

      Da biste isključili firewall, možete koristiti sljedeću komandu:

      systemctl disable --now firewalld
      

      SELinux treba isključiti ili prebaciti u „permissive“ režim:

      setenforce 0
      
      sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

    • učitaćemo potrebne module jezgra i pakete, postaviti automatsko učitavanje modula „br_netfilter“ pri pokretanju sistema:
      modprobe overlay
      
      modprobe br_netfilter
      
      echo "br_netfilter" >> /etc/modules-load.d/br_netfilter.conf
      
      dnf -y install iproute-tc
      

    • Kako bismo aktivirali preusmjeravanje paketa i ispravno obradili promet, postavit ćemo odgovarajuće postavke:
      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
      

      Primijenit ćemo napravljene postavke:

      sysctl --system

    • Postavit ćemo potrebnu verziju CRI-O (glavna verzija CRI-O, kao što je već spomenuto, podudaraju se s potrebnom verzijom Kubernetes), budući da je posljednja stabilna verzija Kubernetes trenutačno 1.18:
      export REQUIRED_VERSION=1.18
      

      Dodajmo potrebne repozitorije:

      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

    • Sada možemo instalirati CRI-O:
      dnf -y install cri-o
      

      Obratite pažnju na prvi detalj koji srećemo tijekom instalacije: potrebno je urediti konfiguraciju CRI-O prije pokretanja servisa, budući da traženi komponenta conmon ima drugačiju lokaciju od navedene:

      sed -i 's//usr/libexec/crio/conmon//usr/bin/conmon/' /etc/crio/crio.conf

      Sada možemo aktivirati i pokrenuti demon CRI-O:

      systemctl enable --now crio
      

      Možete provjeriti status demona:

      systemctl status crio
      

  2. Instalacija i aktivacija Kubernetes.
    • Dodajmo potrebni repozitorij:
      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
      

      Sada možemo instalirati Kubernetes (verzije 1.18, kako je već navedeno):

      dnf install -y kubelet-1.18* kubeadm-1.18* kubectl-1.18* --disableexcludes=kubernetes

    • Drugi važan detalj: budući da ne koristimo demona Docker, već koristimo demona CRI-O, prije pokretanja i inicijalizacije Kubernetes potrebno je unijeti odgovarajuće postavke u konfiguracijski datoteka /var/lib/kubelet/config.yaml, unaprijed stvarajući potrebni direktorij:
      mkdir /var/lib/kubelet
      
      cat < /var/lib/kubelet/config.yaml
      apiVersion: kubelet.config.k8s.io/v1beta1
      kind: KubeletConfiguration
      cgroupDriver: systemd
      EOF

    • Treći važan detalj s kojim se susrećemo tijekom instalacije: iako smo naveli korišteni vozač cgroup, njegovo postavljanje putem argumenata koji se predaju kubelet je zastarjelo (na što se izravno ukazuje u dokumentaciji), potrebno je dodati argumente u datoteku, inače se naš klaster neće inicijalizirati:
      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

    • Sada možemo aktivirati demon kubelet:
      sudo systemctl enable --now kubelet
      

      Kako postaviti control-plane ili worker čvorove u nekoliko minuta, možete iskoristiti ovaj skript.

  3. Vrijeme je da inicijaliziramo naš klaster.
    • Za inicijalizaciju klastera izvršite komandu:
      kubeadm init --pod-network-cidr=10.244.0.0/16
      

      Obavezno zapišite komandu za pridruživanje klasteru 'kubeadm join ...', koja će biti ponuđena na kraju izlaza, ili barem navedene tokene.

    • Instalirajmo CNI plugin za rad s Pod mrežom. Preporučujem korištenje Calico. Možda popularniji Flannel ima problema s kompatibilnošću s nftables, a i Calico je jedina CNI implementacija preporučena i potpuno testirana od strane projekta Kubernetes:
      kubectl --kubeconfig /etc/kubernetes/admin.conf apply -f https://docs.projectcalico.org/v3.15/manifests/calico.yaml 

    • Za povezivanje worker čvora s našim klasterom potrebno je konfigurirati ga prema uputama 1 i 2, ili iskoristiti skript, zatim izvršiti komandu iz izlaza 'kubeadm init ...', koju smo zabilježili u prethodnom koraku:
      kubeadm join $CONTROL_PLANE_ADDRESS:6443 --token $TOKEN 
          --discovery-token-ca-cert-hash $TOKEN_HASH

    • Provjerimo je li naš klaster inicijaliziran i počeo raditi:
      kubectl --kubeconfig=/etc/kubernetes/admin.conf get pods -A
      

    Gotovo! Već možete postavljati korisne terete na vašem K8s klasteru.

Što nas čeka naprijed

Nadam se da su vam gornje upute pomogle da uštedite nešto vremena i živaca.
Ishod procesa unutar industrije često ovisi o tome kako ih prihvata većina krajnjih korisnika i developera drugog softvera u odgovarajućoj niši. Dok nije sasvim jasno kakvom će ishodu inicijative OCI dovesti kroz nekoliko godina, rado ćemo to pratiti. Svoje mišljenje možete podijeliti odmah u komentarima.

Ostanite s nama!

Ovaj članak je nastao zahvaljujući sljedećim izvorima:



Izvor: habr.com

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster