CRI-O ca înlocuitor pentru Docker ca mediu de rulare pentru Kubernetes: configurare pe CentOS 8

Buna ziua! Numele meu este Sergey, sunt DevOps la Surf. Departamentul DevOps de la Surf își propune nu numai să stabilească interacțiunea între specialiști și să integreze procesele de lucru, ci și să cerceteze și să implementeze în mod activ tehnologiile actuale atât în ​​infrastructura proprie, cât și în infrastructura clientului.

Mai jos voi vorbi puțin despre modificările în stiva de tehnologie pentru containere pe care le-am întâlnit în timp ce studiam distribuția CentOS 8 și despre ce este CRI-O și cum să configurați rapid un mediu executabil pentru Kubernetes.

CRI-O ca înlocuitor pentru Docker ca mediu de rulare pentru Kubernetes: configurare pe CentOS 8

De ce Docker nu este inclus în CentOS 8?

După instalarea celor mai recente versiuni majore rhel 8 sau CentOS 8 nu se poate să nu observăm: aceste distribuții și depozite oficiale nu conțin aplicația Docher, care înlocuiesc ideologic și funcțional pachetele Podman, Buildah (prezentă implicit în distribuție) și CRI-O. Acest lucru se datorează implementării practice a standardelor dezvoltate, printre altele, de Red Hat ca parte a proiectului Open Container Initiative (OCI).

Scopul OCI, care face parte din Fundația Linux, este de a crea standarde industriale deschise pentru formate de containere și timpi de execuție care rezolvă mai multe probleme simultan. În primul rând, nu au contrazis filozofia Linux (de exemplu, în partea în care fiecare program ar trebui să efectueze o acțiune și Docher este un fel de combină all-in-one). În al doilea rând, ar putea elimina toate deficiențele existente în software Docher. În al treilea rând, acestea ar fi pe deplin compatibile cu cerințele de afaceri ale platformelor comerciale de top pentru implementarea, gestionarea și servirea aplicațiilor containerizate (de exemplu, Red Hat OpenShift).

Limitări Docher iar avantajele noului software au fost deja descrise în detaliu în acest articol, și o descriere detaliată a întregului pachet de software oferit în cadrul proiectului OCI și a caracteristicilor sale arhitecturale pot fi găsite în documentația oficială și articolele de la Red Hat însuși (nu este rău articol în blogul Red Hat) și în terțe părți recenzii.

Este important de reținut ce funcționalitate au componentele stivei propuse:

  • Podman — interacțiune directă cu containerele și stocarea imaginilor prin procesul runC;
  • Buildah — asamblarea și încărcarea imaginilor în registru;
  • CRI-O — un mediu executabil pentru sistemele de orchestrare a containerelor (de exemplu, Kubernetes).

Cred că pentru a înțelege schema generală de interacțiune dintre componentele stivei, este recomandabil să furnizați aici o diagramă de conexiune Kubernetes c alergaC și biblioteci de nivel scăzut folosind CRI-O:

CRI-O ca înlocuitor pentru Docker ca mediu de rulare pentru Kubernetes: configurare pe CentOS 8

CRI-O и Kubernetes să adere la același ciclu de lansare și suport (matricea de compatibilitate este foarte simplă: versiuni majore Kubernetes и CRI-O coincid), iar acest lucru, ținând cont de accentul pus pe testarea completă și cuprinzătoare a funcționării acestei stive de către dezvoltatori, ne dă dreptul de a ne aștepta la o stabilitate maximă realizabilă în funcționare în orice scenarii de utilizare (luminozitatea relativă este, de asemenea, benefică aici CRI-O comparativ cu Docher datorită limitării intenționate a funcționalității).

La instalare Kubernetes „modul corect” (conform OCI, desigur) folosind CRI-O pe CentOS 8 Am întâmpinat câteva dificultăți minore, pe care însă le-am depășit cu succes. Voi fi bucuros să vă împărtășesc instrucțiuni de instalare și configurare, care în total vor dura aproximativ 10 minute.

Cum să implementați Kubernetes pe CentOS 8 folosind cadrul CRI-O

Cerințe preliminare: prezența a cel puțin o gazdă (2 nuclee, 4 GB RAM, cel puțin 15 GB stocare) cu instalat CentOS 8 (se recomandă profilul de instalare „Server”), precum și intrările pentru acesta în DNS-ul local (ca ultimă soluție, vă puteți descurca cu o intrare în /etc/hosts). Și nu uita dezactivați schimbul.

Efectuăm toate operațiunile pe gazdă ca utilizator root, aveți grijă.

  1. În primul pas, vom configura sistemul de operare, vom instala și configura dependențe preliminare pentru CRI-O.
    • Să actualizăm sistemul de operare:
      dnf -y update
      

    • Apoi, trebuie să configurați firewall-ul și SELinux. Aici totul depinde de mediul în care vor lucra gazda sau gazdele noastre. Puteți fie să configurați un firewall conform recomandărilor de la documentație, sau, dacă sunteți într-o rețea de încredere sau utilizați un paravan de protecție terță parte, schimbați zona implicită la de încredere sau dezactivați paravanul de protecție:
      firewall-cmd --set-default-zone trusted
      
      firewall-cmd --reload

      Pentru a dezactiva firewall-ul puteți folosi următoarea comandă:

      systemctl disable --now firewalld
      

      SELinux trebuie să fie oprit sau comutat în modul „permisiv”:

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

    • Încărcați modulele și pachetele necesare de kernel, configurați încărcarea automată a modulului „br_netfilter” la pornirea sistemului:
      modprobe overlay
      
      modprobe br_netfilter
      
      echo "br_netfilter" >> /etc/modules-load.d/br_netfilter.conf
      
      dnf -y install iproute-tc
      

    • Pentru a activa redirecționarea pachetelor și procesarea corectă a traficului, vom face setările corespunzătoare:
      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
      

      aplicati setarile facute:

      sysctl --system

    • setați versiunea necesară CRI-O (versiunea majoră CRI-O, după cum sa menționat deja, se potrivește cu versiunea necesară Kubernetes), de la cea mai recentă versiune stabilă Kubernetes în prezent 1.18:
      export REQUIRED_VERSION=1.18
      

      adăugați depozitele necesare:

      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

    • acum putem instala CRI-O:
      dnf -y install cri-o
      

      Atenție la prima nuanță pe care o întâlnim în timpul procesului de instalare: trebuie să editați configurația CRI-O înainte de a începe serviciul, deoarece componenta comună necesară are o locație diferită de cea specificată:

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

      Acum puteți activa și porni demonul CRI-O:

      systemctl enable --now crio
      

      Puteți verifica starea demonului:

      systemctl status crio
      

  2. Instalare și activare Kubernetes.
    • Să adăugăm depozitul necesar:
      cat <<EOF > /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
      

      Acum putem instala Kubernetes (versiunea 1.18, după cum s-a menționat mai sus):

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

    • A doua nuanță importantă: deoarece nu folosim un daemon Docher, dar folosim demonul CRI-O, înainte de lansare și inițializare Kubernetes trebuie să faceți setările corespunzătoare în fișierul de configurare /var/lib/kubelet/config.yaml, după ce ați creat mai întâi directorul dorit:
      mkdir /var/lib/kubelet
      
      cat <<EOF > /var/lib/kubelet/config.yaml
      apiVersion: kubelet.config.k8s.io/v1beta1
      kind: KubeletConfiguration
      cgroupDriver: systemd
      EOF

    • Al treilea punct important pe care îl întâlnim în timpul instalării: în ciuda faptului că am indicat driverul utilizat cgroup, și configurația sa prin argumentele trecute kubelet este învechit (așa cum se precizează în mod explicit în documentație), trebuie să adăugăm argumente la fișier, altfel clusterul nostru nu va fi inițializat:
      cat /dev/null > /etc/sysconfig/kubelet
      
      cat <<EOF > /etc/sysconfig/kubelet
      KUBELET_EXTRA_ARGS=--container-runtime=remote --cgroup-driver=systemd --container-runtime-endpoint='unix:///var/run/crio/crio.sock'
      EOF

    • Acum putem activa demonul kubelet:
      sudo systemctl enable --now kubelet
      

      A personaliza planul de control sau lucrător noduri în câteva minute, puteți utiliza cu acest script.

  3. Este timpul să ne inițializam clusterul.
    • Pentru a inițializa clusterul, rulați comanda:
      kubeadm init --pod-network-cidr=10.244.0.0/16
      

      Asigurați-vă că notați comanda pentru a vă alătura clusterului „kubeadm join …”, pe care vi se cere să o utilizați la sfârșitul ieșirii, sau cel puțin token-urile specificate.

    • Să instalăm pluginul (CNI) pentru rețeaua Pod. Recomand folosirea Stambă. Posibil mai popular Flanel are probleme de compatibilitate cu nftables, da și da Stambă - singura implementare CNI recomandată și testată complet de proiect Kubernetes:
      kubectl --kubeconfig /etc/kubernetes/admin.conf apply -f https://docs.projectcalico.org/v3.15/manifests/calico.yaml 

    • Pentru a conecta un nod de lucru la clusterul nostru, trebuie să-l configurați conform instrucțiunilor 1 și 2 sau să îl utilizați scenariu, apoi rulați comanda din ieșirea „kubeadm init...” pe care am notat-o ​​în pasul anterior:
      kubeadm join $CONTROL_PLANE_ADDRESS:6443 --token $TOKEN 
          --discovery-token-ca-cert-hash $TOKEN_HASH

    • Să verificăm dacă clusterul nostru este inițializat și a început să funcționeze:
      kubectl --kubeconfig=/etc/kubernetes/admin.conf get pods -A
      

    Gata! Puteți găzdui deja încărcături utile pe clusterul K8s.

Ceea ce ne așteaptă înainte

Sper că instrucțiunile de mai sus v-au ajutat să economisiți timp și nervi.
Rezultatul proceselor care apar în industrie depinde adesea de modul în care sunt acceptate de majoritatea utilizatorilor finali și dezvoltatorilor de alte software din nișa corespunzătoare. Nu este încă pe deplin clar la ce vor duce inițiativele OCI în câțiva ani, dar vom urmări cu plăcere. Vă puteți împărtăși părerea chiar acum în comentarii.

Rămâneţi aproape!

Acest articol a apărut datorită următoarelor surse:



Sursa: www.habr.com

Adauga un comentariu