CRI-O as ferfanging foar Docker as runtime-omjouwing foar Kubernetes: opset op CentOS 8

Hallo! Myn namme is Sergey, ik bin DevOps by Surf. De DevOps-ôfdieling by Surf is fan doel net allinich ynteraksje tusken spesjalisten te fêstigjen en wurkprosessen te yntegrearjen, mar ek aktyf te ûndersykjen en te ymplementearjen fan aktuele technologyen sawol yn 'e eigen ynfrastruktuer as yn' e ynfrastruktuer fan 'e klant.

Hjirûnder sil ik in bytsje prate oer de feroaringen yn 'e technologystapel foar konteners dy't wy tsjinkamen by it bestudearjen fan de distribúsje CentOS 8 en oer wat it is CRI-O en hoe fluch ynstelle in útfierbere omjouwing foar Kubernetes.

CRI-O as ferfanging foar Docker as runtime-omjouwing foar Kubernetes: opset op CentOS 8

Wêrom is Docker net opnommen yn CentOS 8?

Nei it ynstallearjen fan de lêste grutte releases RJEL 8 of CentOS 8 men kin net oars as opmerke: dizze distribúsjes en offisjele repositories befetsje de applikaasje net Havenarbeider, dy't ideologysk en funksjoneel pakketten ferfange podman, Buildah (standert yn 'e ferdieling oanwêzich) en CRI-O. Dat komt troch de praktyske ymplemintaasje fan noarmen dy't ûnder oare ûntwikkele binne troch Red Hat as ûnderdiel fan it projekt Open Container Initiative (OCI).

It doel fan OCI, dat diel útmakket fan The Linux Foundation, is om iepen yndustrynormen te meitsjen foar kontenerformaten en runtimes dy't ferskate problemen tagelyk oplosse. As earste, se net tsjinsprekke de filosofy fan Linux (bygelyks, yn it diel dat elk programma moat útfiere ien aksje, en Havenarbeider is in soarte fan alles-yn-ien kombinearje). Twadder koene se alle besteande tekoarten yn 'e software eliminearje Havenarbeider. Tredde, se soene folslein kompatibel wêze mei de saaklike easken fan liedende kommersjele platfoarms foar it ynsetten, behearen en tsjinjen fan containerisearre applikaasjes (bygelyks Red Hat OpenShift).

Nijsberjochten Havenarbeider en de foardielen fan 'e nije software binne al beskreaun yn wat detail yn dit artikel, en in detaillearre beskriuwing fan 'e hiele softwarestapel oanbean binnen it OCI-projekt en har arsjitektoanyske funksjes kinne fûn wurde yn' e offisjele dokumintaasje en artikels fan Red Hat sels (net in min artikel yn Red Hat blog) en yn tredden resinsjes.

It is wichtich om te notearjen hokker funksjonaliteit de komponinten fan 'e foarstelde stapel hawwe:

  • podman - direkte ynteraksje mei konteners en ôfbylding opslach fia it runC-proses;
  • Buildah - gearstalling en uploaden fan ôfbyldings nei it register;
  • CRI-O - in útfierbere omjouwing foar kontenerorkestraasjesystemen (bygelyks Kubernetes).

Ik tink dat om it algemiene skema fan ynteraksje tusken de komponinten fan 'e stapel te begripen, it is oan te rieden om hjir in ferbiningsdiagram te leverjen Kubernetes c runC en lege-nivo biblioteken mei help CRI-O:

CRI-O as ferfanging foar Docker as runtime-omjouwing foar Kubernetes: opset op CentOS 8

CRI-O и Kubernetes folgje deselde release- en stipesyklus (de kompatibiliteitsmatrix is ​​heul ienfâldich: grutte ferzjes Kubernetes и CRI-O gearfalle), en dit, mei rekken hâldend mei de fokus op folsleine en wiidweidige testen fan 'e wurking fan dizze stapel troch ûntwikkelders, jout ús it rjocht om de maksimale berikbere stabiliteit yn wurking te ferwachtsjen ûnder alle gebrûksscenario's (relative ljochtheid is hjir ek foardielich CRI-O ferlike mei Havenarbeider fanwege doelbewuste beheining fan funksjonaliteit).

By it ynstallearjen Kubernetes "rjochte manier" manier (neffens OCI, fansels) brûke CRI-O op CentOS 8 Wy troffen wat lytse swierrichheden, dy't wy lykwols mei sukses oerwûn hawwe. Ik sil graach diele mei jo ynstallaasje- en konfiguraasje-ynstruksjes, dy't yn totaal sawat 10 minuten sille duorje.

Hoe kinne jo Kubernetes ynsette op CentOS 8 mei it CRI-O-ramt

Betingsten: oanwêzigens fan op syn minst ien host (2 kearnen, 4 GB RAM, op ​​syn minst 15 GB opslach) mei ynstallearre CentOS 8 (it ynstallaasjeprofyl "Tsjinner" wurdt oanrikkemandearre), lykas ek yngongen dêrfoar yn 'e lokale DNS (as lêste ynstânsje kinne jo trochkomme mei in yngong yn /etc/hosts). En net ferjitte útskeakelje swap.

Wy fiere alle operaasjes op 'e host as de root-brûker, wês foarsichtich.

  1. Yn 'e earste stap sille wy it OS konfigurearje, foarriedige ôfhinklikens foar CRI-O ynstallearje en konfigurearje.
    • Litte wy it OS bywurkje:
      dnf -y update
      

    • Folgjende moatte jo de firewall en SELinux konfigurearje. Hjir hinget alles ôf fan 'e omjouwing wêryn ús host of hosts sille wurkje. Jo kinne of in firewall ynstelle neffens de oanbefellings fan dokumintaasje, of, as jo op in fertroud netwurk binne of in firewall fan tredden brûke, feroarje de standertsône nei fertroud of skeakelje de firewall út:
      firewall-cmd --set-default-zone trusted
      
      firewall-cmd --reload

      Om de firewall út te skeakeljen kinne jo it folgjende kommando brûke:

      systemctl disable --now firewalld
      

      SELinux moat wurde útskeakele of oerskeakele nei "permissive" modus:

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

    • Laad de nedige kernelmodules en pakketten, konfigurearje it automatysk laden fan 'e module "br_netfilter" by it opstarten fan it systeem:
      modprobe overlay
      
      modprobe br_netfilter
      
      echo "br_netfilter" >> /etc/modules-load.d/br_netfilter.conf
      
      dnf -y install iproute-tc
      

    • Om trochstjoere fan pakketten te aktivearjen en ferkearsferwurking te korrizjearjen, sille wy de passende ynstellings meitsje:
      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
      

      tapasse de makke ynstellings:

      sysctl --system

    • set de fereaske ferzje CRI-O (haad ferzje CRI-O, lykas al neamd, oerien mei de fereaske ferzje Kubernetes), sûnt de lêste stabile ferzje Kubernetes no 1.18:
      export REQUIRED_VERSION=1.18
      

      foegje de nedige repositories ta:

      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

    • no kinne wy ​​ynstallearje CRI-O:
      dnf -y install cri-o
      

      Soarch omtinken foar de earste nuânse dy't wy tsjinkomme tidens it ynstallaasjeproses: jo moatte de konfiguraasje bewurkje CRI-O foardat de tsjinst begjint, om't de fereaske konmon-komponint in oare lokaasje hat as de opjûne:

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

      No kinne jo de daemon aktivearje en begjinne CRI-O:

      systemctl enable --now crio
      

      Jo kinne de daemon-status kontrolearje:

      systemctl status crio
      

  2. Ynstallaasje en aktivearring Kubernetes.
    • Litte wy it fereaske repository tafoegje:
      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
      

      No kinne wy ​​ynstallearje Kubernetes (ferzje 1.18, lykas hjirboppe neamd):

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

    • De twadde wichtige nuânse: om't wy gjin daemon brûke Havenarbeider, mar wy brûke de daemon CRI-O, foar lansearring en inisjalisaasje Kubernetes jo moatte de passende ynstellings meitsje yn it konfiguraasjetriem /var/lib/kubelet/config.yaml, nei't jo earst de winske map makke hawwe:
      mkdir /var/lib/kubelet
      
      cat <<EOF > /var/lib/kubelet/config.yaml
      apiVersion: kubelet.config.k8s.io/v1beta1
      kind: KubeletConfiguration
      cgroupDriver: systemd
      EOF

    • It tredde wichtige punt dat wy tsjinkomme by ynstallaasje: nettsjinsteande it feit dat wy de brûkte bestjoerder hawwe oanjûn cgroup, en syn konfiguraasje troch de trochjûn arguminten cubelet is ferâldere (lykas eksplisyt oanjûn yn 'e dokumintaasje), moatte wy arguminten tafoegje oan it bestân, oars sil ús kluster net inisjalisearre wurde:
      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

    • No kinne wy ​​de daemon aktivearje cubelet:
      sudo systemctl enable --now kubelet
      

      Om oan te passen kontrôle-fleantúch of wurkster knopen yn minuten, kinne jo brûke mei dit skript.

  3. It is tiid om ús kluster te inisjalisearjen.
    • Om it kluster te inisjalisearjen, útfiere it kommando:
      kubeadm init --pod-network-cidr=10.244.0.0/16
      

      Wês wis dat jo it kommando opskriuwe om mei te dwaan oan it kluster "kubeadm join ...", dat jo frege wurde om te brûken oan 'e ein fan' e útfier, of op syn minst de oantsjutte tokens.

    • Litte wy de plugin (CNI) ynstallearje foar it Pod-netwurk. Ik advisearje it brûken Calico. Mooglik populêrder Flannel hat komptabiliteit problemen mei nftables,jo en Calico - de ienige CNI-ymplemintaasje oanrikkemandearre en folslein hifke troch it projekt Kubernetes:
      kubectl --kubeconfig /etc/kubernetes/admin.conf apply -f https://docs.projectcalico.org/v3.15/manifests/calico.yaml 

    • Om in wurkknooppunt oan ús kluster te ferbinen, moatte jo it konfigurearje neffens ynstruksjes 1 en 2, of brûke skrift, fier dan it kommando út fan de útfier "kubeadm init..." dy't wy yn 'e foarige stap opskreaun hawwe:
      kubeadm join $CONTROL_PLANE_ADDRESS:6443 --token $TOKEN 
          --discovery-token-ca-cert-hash $TOKEN_HASH

    • Litte wy kontrolearje dat ús kluster is inisjalisearre en begon te wurkjen:
      kubectl --kubeconfig=/etc/kubernetes/admin.conf get pods -A
      

    Klear! Jo kinne nutladingen al hostje op jo K8s-kluster.

Wat wachtet ús foarút

Ik hoopje dat de ynstruksjes hjirboppe holpen jo wat tiid en senuwen te besparjen.
De útkomst fan prosessen dy't foarkomme yn 'e yndustry hinget faak ôf fan hoe't se wurde akseptearre troch it grutste part fan ein brûkers en ûntwikkelders fan oare software yn' e oerienkommende niche. It is noch net hielendal dúdlik wêr't de OCI-inisjativen oer in pear jier ta liede sille, mar wy sille mei nocht sjen. Jo kinne jo miening op it stuit diele yn 'e kommentaren.

Bliuw op 'e hichte!

Dit artikel ferskynde tanksij de folgjende boarnen:



Boarne: www.habr.com

Add a comment