CRI-O als Ersatz für Docker als Laufzeit für Kubernetes: Einrichten auf CentOS 8

Hallo! Mein Name ist Sergey, ich bin DevOps bei Surf. Ziel der DevOps-Abteilung bei Surf ist es nicht nur, die Interaktion zwischen Spezialisten zu etablieren und Arbeitsabläufe zu integrieren, sondern auch die aktive Erforschung und Implementierung relevanter Technologien sowohl in der eigenen Infrastruktur als auch in der Infrastruktur des Kunden.

Im Folgenden werde ich ein wenig über die Änderungen im Technologie-Stack für Container sprechen, die wir beim Studium der Verteilung kennengelernt haben. 8 CentOS und was ist ERSTELLE ES und wie man damit schnell eine ausführbare Umgebung einrichtet Kubernetes.

CRI-O als Ersatz für Docker als Laufzeit für Kubernetes: Einrichten auf CentOS 8

Warum fehlt Docker in der Standarddistribution von CentOS 8?

Nach der Installation der neuesten Hauptversionen RHEL 8 oder 8 CentOS Nicht zu übersehen: Bei diesen Distributionen und offiziellen Repositories fehlt die Anwendung Docker, die Pakete ideologisch und funktional ersetzen Podman, Bauah (standardmäßig in der Distribution vorhanden) und ERSTELLE ES. Dies ist auf die praktische Umsetzung von Standards zurückzuführen, die unter anderem von Red Hat im Rahmen des Projekts Open Container Initiative (OCI) entwickelt wurden.

Das Ziel von OCI, das Teil der Linux Foundation ist, besteht darin, offene Industriestandards für Containerformate und ausführbare Umgebungen zu schaffen, die mehrere Probleme gleichzeitig lösen würden. Erstens widersprachen sie nicht der Philosophie von Linux (zum Beispiel in dem Teil davon, dass jedes Programm eine bestimmte Aktion ausführen muss, und Docker ist eine Art All-in-One-Mähdrescher). Zweitens konnten wir alle bestehenden Mängel in der Software beseitigen Docker. Drittens wären sie vollständig kompatibel mit den Geschäftsanforderungen der führenden kommerziellen Plattformen für die Bereitstellung, Verwaltung und Wartung von Containeranwendungen (z. B. Red Hat OpenShift).

Begrenztheit Docker und die Vorteile der neuen Software wurden bereits ausführlich beschrieben Dieser Artikel, und eine detaillierte Beschreibung, wie der gesamte im Rahmen des OCI-Projekts angebotene Software-Stack und seine Architekturmerkmale in der offiziellen Dokumentation und in Artikeln sowohl von Red Hat selbst (gut) zu finden sind Beitrag im Red Hat-Blog) und in Drittanbietern Bewertungen.

Es ist wichtig zu beachten, welche Funktionalität die Komponenten des vorgeschlagenen Stacks haben:

  • Podman - direkte Interaktion mit Containern und Bildspeicher durch den runC-Prozess;
  • Bauah - Zusammenstellen und Laden der Bilder in das Register;
  • ERSTELLE ES - Laufzeitumgebung für Container-Orchestrierungssysteme (z. B. Kubernetes).

Ich denke, um das allgemeine Schema der Interaktion zwischen den Komponenten des Stapels zu verstehen, ist es ratsam, hier ein Verbindungsdiagramm anzugeben Kubernetes c laufenC und Low-Level-Bibliotheken verwenden ERSTELLE ES:

CRI-O als Ersatz für Docker als Laufzeit für Kubernetes: Einrichten auf CentOS 8

ERSTELLE ES и Kubernetes folgen Sie demselben Release- und Support-Zyklus (die Kompatibilitätsmatrix ist sehr einfach: Hauptversionen). Kubernetes и ERSTELLE ES zusammenfallen), und dies, unter Berücksichtigung des Fokus auf vollständiges und umfassendes Testen der Arbeit dieses Stacks durch Entwickler, gibt uns das Recht, die maximal erreichbare Arbeitsstabilität in allen Nutzungsszenarien zu erwarten (relative Leichtigkeit ist auch hier von Vorteil). ERSTELLE ES im Vergleich zu Docker aufgrund bewusster Einschränkung der Funktionalität).

Bei der Installation von Kubernetes „richtiger Weg“ (natürlich laut OCI) verwenden ERSTELLE ES auf 8 CentOS Wir hatten einige kleinere Schwierigkeiten, die wir jedoch erfolgreich gemeistert haben. Gerne teile ich Ihnen die Installations- und Konfigurationsanleitung mit, die insgesamt höchstens 10 Minuten in Anspruch nehmen wird.

So stellen Sie Kubernetes unter CentOS 8 mithilfe der CRI-O-Umgebung bereit

Voraussetzungen: Verfügen Sie über mindestens einen Host (2 Kerne, 4 GB RAM, mindestens 15 GB Speicher) mit 8 CentOS (empfohlenes Installationsprofil „Server“), sowie Einträge dafür im lokalen DNS (im Extremfall kommt man auch mit einem Eintrag in /etc/hosts aus). Und vergiss es nicht Swap deaktivieren.

Wir führen alle Vorgänge auf dem Host im Namen des Root-Benutzers aus. Seien Sie vorsichtig.

  1. Im ersten Schritt richten wir das Betriebssystem ein, installieren und konfigurieren die vorläufigen Abhängigkeiten für CRI-O.
    • Betriebssystem aktualisieren:
      dnf -y update
      

    • Als nächstes müssen Sie die Firewall und SELinux konfigurieren. Hier hängt alles von der Umgebung ab, in der unser Host oder unsere Hosts arbeiten. Sie können entweder eine Firewall einrichten, wie in empfohlen Dokumentation, oder wenn Sie sich in einem vertrauenswürdigen Netzwerk befinden oder eine Firewall eines Drittanbieters verwenden, ändern Sie die Standardzone in „Vertrauenswürdig“ oder schalten Sie die Firewall aus:
      firewall-cmd --set-default-zone trusted
      
      firewall-cmd --reload

      Um die Firewall auszuschalten, können Sie den folgenden Befehl verwenden:

      systemctl disable --now firewalld
      

      SELinux muss deaktiviert oder auf den „permissiven“ Modus eingestellt werden:

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

    • Laden Sie die erforderlichen Kernel-Module und Pakete und konfigurieren Sie das automatische Laden des Moduls „br_netfilter“ beim Systemstart:
      modprobe overlay
      
      modprobe br_netfilter
      
      echo "br_netfilter" >> /etc/modules-load.d/br_netfilter.conf
      
      dnf -y install iproute-tc
      

    • Um die Paketweiterleitung zu aktivieren und den Verkehr korrekt zu verarbeiten, nehmen wir die entsprechenden Einstellungen vor:
      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
      

      Übernehmen Sie die vorgenommenen Einstellungen:

      sysctl --system

    • Stellen Sie die erforderliche Version ein ERSTELLE ES (Hauptversion ERSTELLE ES, wie bereits erwähnt, mit der erforderlichen Version identisch Kubernetes) seit der neuesten stabilen Version Kubernetes aktuell 1.18:
      export REQUIRED_VERSION=1.18
      

      Fügen Sie die erforderlichen Repositorys hinzu:

      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

    • Jetzt können wir installieren ERSTELLE ES:
      dnf -y install cri-o
      

      Beachten Sie die erste Nuance, die uns während des Installationsprozesses begegnet: Sie müssen die Konfiguration bearbeiten ERSTELLE ES bevor Sie den Dienst starten, da die benötigte Conmon-Komponente einen anderen Speicherort als den angegebenen hat:

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

      Jetzt können Sie den Daemon aktivieren und starten ERSTELLE ES:

      systemctl enable --now crio
      

      Sie können den Status des Daemons überprüfen:

      systemctl status crio
      

  2. Installation und Aktivierung Kubernetes.
    • Fügen Sie das erforderliche Repository hinzu:
      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
      

      Jetzt können wir installieren Kubernetes (Version 1.18, wie oben erwähnt):

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

    • Die zweite wichtige Nuance: Da wir den Daemon nicht verwenden Docker, aber verwenden Sie den Daemon ERSTELLE ES, vor dem Start und der Initialisierung Kubernetes Sie müssen die entsprechenden Einstellungen in der Konfigurationsdatei /var/lib/kubelet/config.yaml vornehmen, nachdem Sie das erforderliche Verzeichnis erstellt haben:
      mkdir /var/lib/kubelet
      
      cat <<EOF > /var/lib/kubelet/config.yaml
      apiVersion: kubelet.config.k8s.io/v1beta1
      kind: KubeletConfiguration
      cgroupDriver: systemd
      EOF

    • Der dritte wichtige Punkt, der uns bei der Installation begegnet: trotz der Tatsache, dass wir den verwendeten Treiber angegeben haben Kontrollgruppeund seine Konfiguration durch die übergebenen Argumente Kubelet veraltet ist (was direkt in der Dokumentation angegeben ist), müssen wir der Datei Argumente hinzufügen, sonst wird unser Cluster nicht initialisiert:
      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

    • Jetzt können wir den Daemon aktivieren Kubelet:
      sudo systemctl enable --now kubelet
      

      Zum Anpassen Steuerebene oder Arbeiter Knoten in wenigen Minuten, die Sie verwenden können dieses Skript.

  3. Es ist Zeit, unseren Cluster zu initialisieren.
    • Führen Sie den folgenden Befehl aus, um den Cluster zu initialisieren:
      kubeadm init --pod-network-cidr=10.244.0.0/16
      

      Notieren Sie sich unbedingt den Befehl zum Beitritt zum Cluster „kubeadm join ...“, der am Ende der Ausgabe angeboten wird, oder zumindest die angegebenen Token.

    • Installieren Sie das Plugin (CNI) für das Pod-Netzwerk. Ich empfehle die Verwendung Kattun. Möglicherweise beliebter Flanell hat Kompatibilitätsprobleme mit nftablesund Kattun - die einzige vom Projekt empfohlene und vollständig getestete CNI-Implementierung Kubernetes:
      kubectl --kubeconfig /etc/kubernetes/admin.conf apply -f https://docs.projectcalico.org/v3.15/manifests/calico.yaml 

    • Um einen Worker-Knoten mit unserem Cluster zu verbinden, müssen Sie ihn gemäß den Anweisungen 1 und 2 konfigurieren oder verwenden Skript, und führen Sie dann den Befehl über die Ausgabe „kubeadm init ...“ aus, die wir im vorherigen Schritt aufgezeichnet haben:
      kubeadm join $CONTROL_PLANE_ADDRESS:6443 --token $TOKEN 
          --discovery-token-ca-cert-hash $TOKEN_HASH

    • Überprüfen wir, ob unser Cluster initialisiert ist und funktioniert:
      kubectl --kubeconfig=/etc/kubernetes/admin.conf get pods -A
      

    Bereit! Sie können bereits Nutzlasten auf Ihrem K8s-Cluster hosten.

Was vor uns liegt

Ich hoffe, dass die obigen Anweisungen Ihnen geholfen haben, Zeit und Nerven zu sparen.
Der Ausgang der in der Branche ablaufenden Prozesse hängt oft davon ab, wie sie von der Masse der Endnutzer und Entwickler anderer Software in der jeweiligen Nische angenommen werden. Es ist nicht ganz klar, wohin die OCI-Initiativen in einigen Jahren führen werden, aber wir werden sie gerne verfolgen. Sie können Ihre Meinung jetzt in den Kommentaren teilen.

Bleib dran!

Dieser Artikel wurde dank der folgenden Quellen erstellt:



Source: habr.com

Kommentar hinzufügen