CRI-O als Ersatz fir Docker als Runtime Ëmfeld fir Kubernetes: Setup op CentOS 8

Hallo! Mäin Numm ass Sergey, ech sinn DevOps bei Surf. D'DevOps Departement bei Surf zielt net nëmmen d'Interaktioun tëscht Spezialisten z'etabléieren an d'Aarbechtsprozesser z'integréieren, awer och aktiv ze recherchéieren an aktuell Technologien souwuel an der eegener Infrastruktur wéi och an der Infrastruktur vum Client ze realiséieren.

Drënner wäert ech e bëssen iwwer d'Ännerungen am Technologiestack fir Container schwätzen, déi mir begéint hunn wärend der Verdeelung studéiert. CentOS 8 an iwwer wat et ass CRI-O a wéi Dir séier en ausführbar Ëmfeld opbaut fir Kubernetes.

CRI-O als Ersatz fir Docker als Runtime Ëmfeld fir Kubernetes: Setup op CentOS 8

Firwat ass Docker net an CentOS 8 abegraff?

Nodeems Dir déi lescht grouss Verëffentlechungen installéiert hutt RECHEL 8 oder CentOS 8 et kann net hëllefen, awer ze bemierken: dës Verdeelungen an offiziell Repositories enthalen net d'Applikatioun Docker, déi ideologesch a funktionell Packagen ersetzen podman, Buildah (präsent an der Verdeelung als Standard) an CRI-O. Dëst ass wéinst der praktescher Ëmsetzung vu Standarden, déi ënner anerem vum Red Hat am Kader vum Open Container Initiative (OCI) Projet entwéckelt goufen.

D'Zil vun OCI, deen Deel vun der Linux Foundation ass, ass oppe Industriestandards fir Containerformater a Runtime ze kreéieren déi verschidde Probleemer gläichzäiteg léisen. Als éischt hunn se d'Philosophie vu Linux net widdersprécht (zum Beispill am Deel datt all Programm eng Handlung sollt ausféieren, an Docker ass eng Zort All-in-One Kombinatioun). Zweetens kënne se all existent Mängel an der Software eliminéieren Docker. Drëttens, si wiere voll kompatibel mat de Geschäftsbedéngungen vu féierende kommerziellen Plattforme fir d'Deployment, d'Gestioun an d'Déngscht vun containeriséierte Applikatiounen (zum Beispill Red Hat OpenShift).

Defiziter Docker an d'Virdeeler vun der neier Software sinn schonn am Detail beschriwwe ginn dësen Artikel, an eng detailléiert Beschreiwung vum ganze Software Stack ugebueden am OCI Projet a seng architektonesch Fonctiounen kann an der offizieller Dokumentatioun an Artikele vum Red Hat selwer fonnt ginn (net schlecht en Artikel am Red Hat Blog) an an Drëtt Partei Rezensiounen.

Et ass wichteg ze notéieren wéi eng Funktionalitéit d'Komponente vum proposéierte Stack hunn:

  • podman - direkt Interaktioun mat Container a Bildlagerung duerch de RunC Prozess;
  • Buildah - Assemblée an eropluede Biller an de Registry;
  • CRI-O - en ausféierbar Ëmfeld fir Container Orchestratiounssystemer (zum Beispill Kubernetes).

Ech denken datt fir den allgemenge Schema vun der Interaktioun tëscht de Komponente vum Stack ze verstoen, ass et ubruecht e Verbindungsdiagramm hei ze bidden Kubernetes c runC an niddereg-Niveau Bibliothéiken benotzt CRI-O:

CRI-O als Ersatz fir Docker als Runtime Ëmfeld fir Kubernetes: Setup op CentOS 8

CRI-O и Kubernetes hale sech un déiselwecht Verëffentlechung an Ënnerstëtzungszyklus (d'Kompatibilitéitsmatrix ass ganz einfach: grouss Versiounen Kubernetes и CRI-O zesummekommen), an dëst, andeems de Fokus op kompletten an ëmfaassenden Tester vun der Operatioun vun dësem Stack vun Entwéckler berécksiichtegt, gëtt eis d'Recht déi maximal erreechbar Stabilitéit an der Operatioun ënner all Benotzungsszenarien ze erwaarden (relativ Liichtegkeet ass och gutt hei CRI-O verglach mat Docker opgrond vun enger gezielter Begrenzung vun der Funktionalitéit).

Bei der Installatioun Kubernetes "richteg Manéier" Manéier (no OCI, natierlech) benotzt CRI-O op CentOS 8 Mir stoungen op e puer kleng Schwieregkeeten, déi mir awer erfollegräich iwwerwonnen hunn. Ech wäert frou Iech Installatiouns- a Konfiguratiounsinstruktiounen ze deelen, déi am Ganzen ongeféier 10 Minutten daueren.

Wéi deployéiert Kubernetes op CentOS 8 mam CRI-O Kader

Viraussetzunge: Präsenz vun mindestens engem Host (2 Kären, 4 GB RAM, mindestens 15 GB Späichere) mat installéiert CentOS 8 (de "Server" Installatiounsprofil ass recommandéiert), souwéi Entréen dofir an der lokaler DNS (als leschten Auswee kënnt Dir mat engem Entrée an /etc/hosts duerchgoen). An net vergiessen auszeschalten Swap.

Mir maachen all Operatiounen um Host als Root Benotzer, passt op.

  1. Am éischte Schrëtt wäerte mir d'OS konfiguréieren, virleefeg Ofhängegkeete fir CRI-O installéieren a konfiguréieren.
    • Loosst eis den OS aktualiséieren:
      dnf -y update
      

    • Als nächst musst Dir d'Firewall a SELinux konfiguréieren. Hei hänkt alles vum Ëmfeld of, an deem eise Host oder Hosten schaffe wäerten. Dir kënnt entweder eng Firewall opbauen no de Empfehlungen vun Dokumentatioun, oder, wann Dir op engem vertrauenswürdege Netzwierk sidd oder eng Drëtt-Partei Firewall benotzt, ännert d'Standardzon op vertraut oder schalt d'Firewall aus:
      firewall-cmd --set-default-zone trusted
      
      firewall-cmd --reload

      Fir d'Firewall auszeschalten kënnt Dir de folgende Kommando benotzen:

      systemctl disable --now firewalld
      

      SELinux muss ausgeschalt ginn oder op de "permissive" Modus gewiesselt ginn:

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

    • Lued déi néideg Kernel Moduler a Packagen, konfiguréiert d'automatesch Luede vum Modul "br_netfilter" beim Systemstart:
      modprobe overlay
      
      modprobe br_netfilter
      
      echo "br_netfilter" >> /etc/modules-load.d/br_netfilter.conf
      
      dnf -y install iproute-tc
      

    • Fir Packet Forwarding a korrekt Trafficveraarbechtung z'aktivéieren, maache mir déi entspriechend Astellungen:
      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
      

      gëllen déi gemaach Astellungen:

      sysctl --system

    • déi néideg Versioun setzen CRI-O (Major Versioun CRI-O, wéi schonn ernimmt, Match der néideg Versioun Kubernetes), zënter der leschter stabiler Versioun Kubernetes aktuell 1.18:
      export REQUIRED_VERSION=1.18
      

      fügen déi néideg Repositories un:

      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

    • elo kënne mir installéieren CRI-O:
      dnf -y install cri-o
      

      Opgepasst op déi éischt Nuance déi mir während dem Installatiounsprozess begéinen: Dir musst d'Konfiguratioun änneren CRI-O ier Dir de Service ufänkt, well déi erfuerderlech Conmon Komponent eng aner Plaz huet wéi déi spezifizéiert:

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

      Elo kënnt Dir den Daemon aktivéieren an starten CRI-O:

      systemctl enable --now crio
      

      Dir kënnt den Daemon Status kontrolléieren:

      systemctl status crio
      

  2. Installatioun an Aktivatioun Kubernetes.
    • Loosst eis de erfuerderleche Repository addéieren:
      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
      

      Elo kënne mir installéieren Kubernetes (Versioun 1.18, wéi uewen ernimmt):

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

    • Déi zweet wichteg Nuance: well mir net en Daemon benotzen Docker, mee mir benotzen den Daemon CRI-O, virum Start an Initialiséierung Kubernetes Dir musst déi entspriechend Astellungen an der Konfiguratiounsdatei /var/lib/kubelet/config.yaml maachen, nodeems Dir als éischt de gewënschte Verzeichnis erstallt hutt:
      mkdir /var/lib/kubelet
      
      cat <<EOF > /var/lib/kubelet/config.yaml
      apiVersion: kubelet.config.k8s.io/v1beta1
      kind: KubeletConfiguration
      cgroupDriver: systemd
      EOF

    • Den drëtte wichtege Punkt dee mir während der Installatioun begéinen: trotz der Tatsaach datt mir de benotzte Chauffer uginn hunn cgroup, a seng Konfiguratioun duerch d'Argumenter passéiert kubelet ass veroudert (wéi explizit an der Dokumentatioun uginn), musse mir Argumenter an d'Datei addéieren, soss gëtt eise Cluster net initialiséiert:
      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

    • Elo kënne mir den Daemon aktivéieren kubelet:
      sudo systemctl enable --now kubelet
      

      Fir ze personaliséieren Kontroll-Fliger oder Aarbechter Noden a Minutten, kënnt Dir benotzen mat dësem Skript.

  3. Et ass Zäit eise Cluster ze initialiséieren.
    • Fir de Cluster ze initialiséieren, fuert de Kommando:
      kubeadm init --pod-network-cidr=10.244.0.0/16
      

      Gitt sécher de Kommando opzeschreiwen fir de Cluster "kubeadm join ..." ze verbannen, deen Dir gefrot gëtt um Enn vun der Ausgab ze benotzen, oder op d'mannst déi spezifizéiert Tokens.

    • Loosst eis de Plugin (CNI) fir de Pod Netzwierk installéieren. Ech recommandéieren ze benotzen Calico. Méiglech méi populär Flannel huet Onbedenklechkeet Problemer mat nftables,jo an Calico - déi eenzeg CNI Ëmsetzung recommandéiert a voll getest vum Projet Kubernetes:
      kubectl --kubeconfig /etc/kubernetes/admin.conf apply -f https://docs.projectcalico.org/v3.15/manifests/calico.yaml 

    • Fir e Worker Node mat eisem Cluster ze verbannen, musst Dir en no den Instruktioune 1 an 2 konfiguréieren, oder benotzen Schrëft, fuert dann de Kommando aus dem "kubeadm init..." Output deen mir am virege Schrëtt geschriwwen hunn:
      kubeadm join $CONTROL_PLANE_ADDRESS:6443 --token $TOKEN 
          --discovery-token-ca-cert-hash $TOKEN_HASH

    • Loosst eis kucken ob eise Cluster initialiséiert ass an ugefaang huet ze schaffen:
      kubectl --kubeconfig=/etc/kubernetes/admin.conf get pods -A
      

    Fäerdeg! Dir kënnt scho Notzlaascht op Ärem K8s Cluster hosten.

Wat op eis erwaart

Ech hoffen, datt d'Instruktioune hei uewen gehollef hunn Iech Zäit an Nerven ze spueren.
D'Resultat vu Prozesser, déi an der Industrie optrieden, hänkt dacks dovun of wéi se vun de Gros vun Endbenotzer an Entwéckler vun anere Software an der entspriechender Nisch akzeptéiert ginn. Wat d'OCI-Initiativen an e puer Joer wäerte féieren ass nach net ganz kloer, mä mir wäerte mat Freed kucken. Dir kënnt Är Meenung elo an de Kommentaren deelen.

Bleift drun!

Dësen Artikel erschéngt dank de folgende Quellen:



Source: will.com

Setzt e Commentaire