CRI-O in sostituzione di Docker come ambiente di runtime per Kubernetes: configurazione su CentOS 8

Ciao! Mi chiamo Sergey, sono DevOps di Surf. Il dipartimento DevOps di Surf mira non solo a stabilire l'interazione tra specialisti e integrare i flussi di lavoro, ma anche a ricercare attivamente e implementare tecnologie pertinenti sia nella propria infrastruttura che nell'infrastruttura del cliente.

Di seguito parlerò un po 'dei cambiamenti nello stack tecnologico per i container che abbiamo incontrato studiando la distribuzione. 8 CentOS e cos'è CREALO e come impostare rapidamente un ambiente eseguibile con esso per kubernetes.

CRI-O in sostituzione di Docker come ambiente di runtime per Kubernetes: configurazione su CentOS 8

Perché Docker manca nella distribuzione standard di CentOS 8

Dopo aver installato le ultime versioni principali RHEL 8 o 8 CentOS da non trascurare: queste distribuzioni e repository ufficiali mancano dell'applicazione docker, che sostituiscono ideologicamente e funzionalmente i pacchetti Podman, Costruisci (presente nella distribuzione di default) e CREALO. Ciò è dovuto all'implementazione pratica degli standard sviluppati, tra l'altro, da Red Hat nell'ambito del progetto Open Container Initiative (OCI).

L'obiettivo di OCI, che fa parte di The Linux Foundation, è quello di creare standard di settore aperti per formati container e ambienti eseguibili che risolvano diversi problemi contemporaneamente. In primo luogo, non contraddicevano la filosofia di Linux (ad esempio, in quella parte in cui ogni programma deve eseguire un'azione, e docker è una sorta di mietitrebbia all-in-one). In secondo luogo, potremmo eliminare tutte le carenze esistenti nel software docker. In terzo luogo, sarebbero pienamente compatibili con i requisiti aziendali proposti dalle principali piattaforme commerciali per l'implementazione, la gestione e la manutenzione di applicazioni containerizzate (ad esempio, Red Hat OpenShift).

Limitazioni docker e i vantaggi del nuovo software sono già stati descritti in dettaglio in questo articolo, e una descrizione dettagliata di come l'intero stack software offerto come parte del progetto OCI e le sue caratteristiche architettoniche possono essere trovate nella documentazione ufficiale e negli articoli sia della stessa Red Hat (ottimo articolo nel blog di Red Hat) e in terze parti recensioni.

È importante notare quale funzionalità hanno i componenti dello stack proposto:

  • Podman - interazione diretta con i contenitori e memorizzazione delle immagini attraverso il processo runC;
  • Costruisci - assemblaggio e caricamento in anagrafica delle immagini;
  • CREALO - ambiente di runtime per i sistemi di orchestrazione dei container (ad esempio, Kubernetes).

Ritengo che per comprendere lo schema generale di interazione tra i componenti dello stack sia opportuno riportare qui uno schema di collegamento kubernetes c correreC e librerie di basso livello che utilizzano CREALO:

CRI-O in sostituzione di Docker come ambiente di runtime per Kubernetes: configurazione su CentOS 8

CREALO и kubernetes seguono lo stesso ciclo di release e supporto (la matrice di compatibilità è molto semplice: major release kubernetes и CREALO coincidono), e questo, tenendo conto dell'attenzione al test completo e completo del lavoro di questo stack da parte degli sviluppatori, ci dà il diritto di aspettarci la massima stabilità ottenibile nel lavoro in qualsiasi scenario di utilizzo (anche la relativa leggerezza è vantaggiosa qui). CREALO rispetto a docker a causa di una limitazione intenzionale della funzionalità).

Durante l'installazione kubernetes modo "giusto" modo (secondo l'OCI, ovviamente) usando CREALO su 8 CentOS Ci siamo imbattuti in alcune piccole difficoltà, che tuttavia abbiamo superato con successo. Sarò lieto di condividere con voi le istruzioni di installazione e configurazione, che in totale richiederanno al massimo 10 minuti.

Come distribuire Kubernetes su CentOS 8 utilizzando l'ambiente CRI-O

Prerequisiti: disporre di almeno un host (2 core, 4 GB di RAM, almeno 15 GB di spazio di archiviazione) con 8 CentOS (profilo di installazione consigliato "Server"), nonché voci per esso nel DNS locale (in casi estremi, puoi cavartela con una voce in /etc/hosts). E non dimenticare disabilitare lo scambio.

Eseguiamo tutte le operazioni sull'host per conto dell'utente root, fai attenzione.

  1. Nella prima fase, imposteremo il sistema operativo, installeremo e configureremo le dipendenze preliminari per CRI-O.
    • Aggiorna sistema operativo:
      dnf -y update
      

    • Successivamente, è necessario configurare il firewall e SELinux. Qui tutto dipende dall'ambiente in cui lavoreranno il nostro host o gli host. Puoi impostare un firewall come consigliato in documentazione, oppure se ti trovi su una rete attendibile o utilizzi un firewall di terze parti, cambia la zona predefinita in attendibile o disattiva il firewall:
      firewall-cmd --set-default-zone trusted
      
      firewall-cmd --reload

      Per disattivare il firewall, puoi utilizzare il seguente comando:

      systemctl disable --now firewalld
      

      SELinux deve essere disabilitato o impostato in modalità "permissiva":

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

    • caricare i moduli e i pacchetti del kernel necessari, configurare il caricamento automatico del modulo "br_netfilter" all'avvio del sistema:
      modprobe overlay
      
      modprobe br_netfilter
      
      echo "br_netfilter" >> /etc/modules-load.d/br_netfilter.conf
      
      dnf -y install iproute-tc
      

    • Per attivare l'inoltro dei pacchetti ed elaborare correttamente il traffico, effettueremo le impostazioni appropriate:
      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
      

      applicare le impostazioni effettuate:

      sysctl --system

    • impostare la versione richiesta CREALO (versione principale CREALO, come già accennato, sono le stesse della versione richiesta kubernetes) dall'ultima versione stabile kubernetes attualmente 1.18:
      export REQUIRED_VERSION=1.18
      

      aggiungere i repository necessari:

      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

    • ora possiamo installare CREALO:
      dnf -y install cri-o
      

      Presta attenzione alla prima sfumatura che incontriamo durante il processo di installazione: devi modificare la configurazione CREALO prima di avviare il servizio, poiché il componente conmon richiesto ha una posizione diversa da quella specificata:

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

      Ora puoi attivare e avviare il demone CREALO:

      systemctl enable --now crio
      

      Puoi controllare lo stato del demone:

      systemctl status crio
      

  2. Installazione e attivazione kubernetes.
    • Aggiungi il repository richiesto:
      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
      

      Ora possiamo installare kubernetes (versione 1.18, come menzionato sopra):

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

    • La seconda sfumatura importante: poiché non utilizziamo il demone docker, ma usa il demone CREALO, prima dell'avvio e dell'inizializzazione kubernetes è necessario effettuare le impostazioni appropriate nel file di configurazione /var/lib/kubelet/config.yaml, dopo aver creato la directory necessaria:
      mkdir /var/lib/kubelet
      
      cat <<EOF > /var/lib/kubelet/config.yaml
      apiVersion: kubelet.config.k8s.io/v1beta1
      kind: KubeletConfiguration
      cgroupDriver: systemd
      EOF

    • Il terzo punto importante che incontriamo durante l'installazione: nonostante abbiamo indicato il driver utilizzato cgruppo, e la sua configurazione attraverso gli argomenti passati cubetto obsoleto (che è indicato direttamente nella documentazione), dobbiamo aggiungere argomenti al file, altrimenti il ​​nostro cluster non verrà inizializzato:
      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

    • Ora possiamo attivare il demone cubetto:
      sudo systemctl enable --now kubelet
      

      Personalizzare piano di controllo o lavoratore nodi in pochi minuti, puoi usare questa sceneggiatura.

  3. È ora di inizializzare il nostro cluster.
    • Per inizializzare il cluster, eseguire il comando:
      kubeadm init --pod-network-cidr=10.244.0.0/16
      

      Assicurati di annotare il comando per unirti al cluster "kubeadm join ...", che viene offerto alla fine dell'output, o almeno i token specificati.

    • Installa il plugin (CNI) per la rete Pod. Consiglio di usare Calico. Forse più popolare Flanella ha problemi di compatibilità con nftablese Calico - l'unica implementazione CNI raccomandata e completamente testata dal progetto kubernetes:
      kubectl --kubeconfig /etc/kubernetes/admin.conf apply -f https://docs.projectcalico.org/v3.15/manifests/calico.yaml 

    • Per connettere un nodo di lavoro al nostro cluster, devi configurarlo secondo le istruzioni 1 e 2 oppure utilizzare copione, quindi eseguire il comando dall'output "kubeadm init ..." che abbiamo registrato nel passaggio precedente:
      kubeadm join $CONTROL_PLANE_ADDRESS:6443 --token $TOKEN 
          --discovery-token-ca-cert-hash $TOKEN_HASH

    • Controlliamo che il nostro cluster sia inizializzato e abbia iniziato a funzionare:
      kubectl --kubeconfig=/etc/kubernetes/admin.conf get pods -A
      

    Pronto! Puoi già ospitare payload sul tuo cluster K8s.

Cosa ci aspetta

Spero che le istruzioni di cui sopra ti abbiano aiutato a risparmiare tempo e nervi.
L'esito dei processi che si svolgono nel settore dipende spesso da come vengono accettati dalla massa principale di utenti finali e sviluppatori di altri software nella relativa nicchia. Non è del tutto chiaro dove porteranno le iniziative OCI tra qualche anno, ma saremo felici di seguirlo. Puoi condividere la tua opinione in questo momento nei commenti.

Rimanete sintonizzati!

Questo articolo è stato creato grazie alle seguenti fonti:



Fonte: habr.com

Aggiungi un commento