CRI-O com a reemplaçament de Docker com a entorn d'execució per a Kubernetes: configuració a CentOS 8

Hola! Em dic Sergey, sóc DevOps a Surf. El departament DevOps de Surf pretén no només establir la interacció entre especialistes i integrar processos de treball, sinó també investigar i implementar de manera activa les tecnologies actuals tant a la pròpia infraestructura com a la del client.

A continuació parlaré una mica dels canvis en la pila tecnològica dels contenidors que hem trobat mentre estudiàvem la distribució. CentOS 8 i sobre què és CRI-O i com configurar ràpidament un entorn executable per Kubernetes.

CRI-O com a reemplaçament de Docker com a entorn d'execució per a Kubernetes: configuració a CentOS 8

Per què Docker no està inclòs a CentOS 8?

Després d'instal·lar les darreres versions principals RHEL juliol o CentOS 8 no es pot deixar de notar: aquestes distribucions i repositoris oficials no contenen l'aplicació estibador, que ideològicament i funcionalment substitueixen els paquets Podman, Buildah (present a la distribució per defecte) i CRI-O. Això es deu a la implementació pràctica dels estàndards desenvolupats, entre altres coses, per Red Hat com a part del projecte Open Container Initiative (OCI).

L'objectiu d'OCI, que forma part de The Linux Foundation, és crear estàndards oberts de la indústria per a formats de contenidors i temps d'execució que resolguin diversos problemes alhora. En primer lloc, no contradiuen la filosofia de Linux (per exemple, en la part que cada programa hauria de realitzar una acció, i estibador és una espècie de combinació tot en un). En segon lloc, podrien eliminar totes les deficiències existents en el programari estibador. En tercer lloc, serien totalment compatibles amb els requisits empresarials de les principals plataformes comercials per desplegar, gestionar i servir aplicacions en contenidors (per exemple, Red Hat OpenShift).

Limitacions estibador i els avantatges del nou programari ja s'han descrit amb cert detall a aquest article, i una descripció detallada de tota la pila de programari que s'ofereix dins del projecte OCI i les seves característiques arquitectòniques es pot trobar a la documentació i articles oficials del mateix Red Hat (no és gens malament article al bloc de Red Hat) i a tercers comentaris.

És important tenir en compte quina funcionalitat tenen els components de la pila proposada:

  • Podman — interacció directa amb contenidors i emmagatzematge d'imatges mitjançant el procés runC;
  • Buildah — muntatge i càrrega d'imatges al registre;
  • CRI-O — un entorn executable per a sistemes d'orquestració de contenidors (per exemple, Kubernetes).

Crec que per entendre l'esquema general d'interacció entre els components de la pila, és recomanable proporcionar aquí un diagrama de connexió Kubernetes c córrerC i biblioteques de baix nivell utilitzant CRI-O:

CRI-O com a reemplaçament de Docker com a entorn d'execució per a Kubernetes: configuració a CentOS 8

CRI-O и Kubernetes Adherir-se al mateix cicle de llançament i suport (la matriu de compatibilitat és molt senzilla: versions principals Kubernetes и CRI-O coincideixen), i això, tenint en compte l'enfocament de les proves completes i exhaustives del funcionament d'aquesta pila per part dels desenvolupadors, ens dóna dret a esperar la màxima estabilitat possible en funcionament en qualsevol escenari d'ús (la lleugeresa relativa també és beneficiosa aquí). CRI-O en comparació amb estibador a causa de la limitació intencionada de la funcionalitat).

Quan instal·leu Kubernetes "manera correcta" (segons OCI, és clar) utilitzant CRI-O en CentOS 8 Ens hem trobat amb algunes dificultats menors que, però, hem superat amb èxit. Estaré encantat de compartir amb vosaltres les instruccions d'instal·lació i configuració, que en total trigaran uns 10 minuts.

Com implementar Kubernetes a CentOS 8 mitjançant el marc CRI-O

Requisits previs: presència d'almenys un host (2 nuclis, 4 GB de RAM, almenys 15 GB d'emmagatzematge) amb instal·lat CentOS 8 (Es recomana el perfil d'instal·lació del "Servidor"), així com les seves entrades al DNS local (com a últim recurs, podeu fer-ho amb una entrada a /etc/hosts). I no t'oblidis desactivar l'intercanvi.

Realitzem totes les operacions a l'amfitrió com a usuari root, aneu amb compte.

  1. En el primer pas, configurarem el sistema operatiu, instal·larem i configurarem dependències preliminars per a CRI-O.
    • Actualitzem el sistema operatiu:
      dnf -y update
      

    • A continuació, heu de configurar el tallafoc i SELinux. Aquí tot depèn de l'entorn en què treballaran el nostre amfitrió o amfitrions. Podeu configurar un tallafoc segons les recomanacions de documentació, o, si esteu en una xarxa de confiança o utilitzeu un tallafoc de tercers, canvieu la zona predeterminada a de confiança o desactiveu el tallafoc:
      firewall-cmd --set-default-zone trusted
      
      firewall-cmd --reload

      Per desactivar el tallafoc, podeu utilitzar l'ordre següent:

      systemctl disable --now firewalld
      

      SELinux s'ha d'apagar o canviar al mode "permissiu":

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

    • Carregueu els mòduls i paquets del nucli necessaris, configureu la càrrega automàtica del mòdul "br_netfilter" a l'inici del sistema:
      modprobe overlay
      
      modprobe br_netfilter
      
      echo "br_netfilter" >> /etc/modules-load.d/br_netfilter.conf
      
      dnf -y install iproute-tc
      

    • Per activar el reenviament de paquets i corregir el processament del trànsit, farem la configuració adequada:
      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
      

      aplicar la configuració realitzada:

      sysctl --system

    • establiu la versió requerida CRI-O (Versió principal CRI-O, com ja s'ha esmentat, coincideix amb la versió requerida Kubernetes), des de la darrera versió estable Kubernetes actualment 1.18:
      export REQUIRED_VERSION=1.18
      

      afegir els repositoris necessaris:

      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

    • ara podem instal·lar CRI-O:
      dnf -y install cri-o
      

      Fixeu-vos en el primer matís que trobem durant el procés d'instal·lació: cal editar la configuració CRI-O abans d'iniciar el servei, ja que el component comú requerit té una ubicació diferent de l'especificada:

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

      Ara podeu activar i iniciar el dimoni CRI-O:

      systemctl enable --now crio
      

      Podeu comprovar l'estat del dimoni:

      systemctl status crio
      

  2. Instal·lació i activació Kubernetes.
    • Afegim el repositori necessari:
      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
      

      Ara podem instal·lar Kubernetes (versió 1.18, com s'ha esmentat anteriorment):

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

    • El segon matís important: ja que no fem servir un dimoni estibador, però fem servir el dimoni CRI-O, abans del llançament i la inicialització Kubernetes heu de fer la configuració adequada al fitxer de configuració /var/lib/kubelet/config.yaml, havent creat primer el directori desitjat:
      mkdir /var/lib/kubelet
      
      cat <<EOF > /var/lib/kubelet/config.yaml
      apiVersion: kubelet.config.k8s.io/v1beta1
      kind: KubeletConfiguration
      cgroupDriver: systemd
      EOF

    • El tercer punt important que ens trobem durant la instal·lació: malgrat que hem indicat el controlador utilitzat cgroup, i la seva configuració mitjançant els arguments passats kubelet està obsolet (com s'indica explícitament a la documentació), hem d'afegir arguments al fitxer, en cas contrari el nostre clúster no s'inicializarà:
      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

    • Ara podem activar el dimoni kubelet:
      sudo systemctl enable --now kubelet
      

      Per personalitzar pla de control o obrer nodes en minuts, podeu utilitzar amb aquest guió.

  3. És hora d'inicialitzar el nostre clúster.
    • Per inicialitzar el clúster, executeu l'ordre:
      kubeadm init --pod-network-cidr=10.244.0.0/16
      

      Assegureu-vos d'escriure l'ordre per unir-se al clúster "kubeadm join...", que se us demana que utilitzeu al final de la sortida, o almenys els testimonis especificats.

    • Instal·lem el connector (CNI) per a la xarxa Pod. Recomano utilitzar Calic. Possiblement més popular Flanel té problemes de compatibilitat amb nftablesi sí Calic - l'única implementació CNI recomanada i totalment provada pel projecte Kubernetes:
      kubectl --kubeconfig /etc/kubernetes/admin.conf apply -f https://docs.projectcalico.org/v3.15/manifests/calico.yaml 

    • Per connectar un node de treball al nostre clúster, cal configurar-lo segons les instruccions 1 i 2, o utilitzar-lo guió, a continuació, executeu l'ordre des de la sortida "kubeadm init..." que vam escriure al pas anterior:
      kubeadm join $CONTROL_PLANE_ADDRESS:6443 --token $TOKEN 
          --discovery-token-ca-cert-hash $TOKEN_HASH

    • Comprovem que el nostre clúster està inicialitzat i comença a funcionar:
      kubectl --kubeconfig=/etc/kubernetes/admin.conf get pods -A
      

    A punt! Ja podeu allotjar càrregues útils al vostre clúster K8s.

El que ens espera per davant

Espero que les instruccions anteriors us hagin ajudat a estalviar temps i nervis.
El resultat dels processos que es produeixen a la indústria sovint depèn de com són acceptats per la majoria dels usuaris finals i desenvolupadors d'altres programaris en el nínxol corresponent. Encara no està del tot clar a què comportaran les iniciatives de l'OCI d'aquí a uns anys, però ho veurem amb molt de gust. Pots compartir la teva opinió ara mateix als comentaris.

Estiguin atents!

Aquest article va aparèixer gràcies a les fonts següents:



Font: www.habr.com

Afegeix comentari