CRI-O como reemplazo de Docker como tiempo de ejecución para Kubernetes: configuración en CentOS 8

¡Hola! Mi nombre es Sergey, soy DevOps en Surf. El departamento de DevOps de Surf tiene como objetivo no solo establecer interacción entre especialistas e integrar procesos de trabajo, sino también investigar e implementar activamente tecnologías relevantes tanto en su propia infraestructura como en la del cliente.



A continuación hablaré un poco sobre los cambios en la pila tecnológica para contenedores que conocimos al estudiar la distribución de CentOS 8 y qué es CRI-O y cómo configurar rápidamente un entorno ejecutable para Kubernetes con él .







Por qué falta Docker en la distribución estándar de CentOS 8



Después de instalar las últimas versiones principales de RHEL 8 o CentOS 8, no se puede dejar de notar: estas distribuciones y repositorios oficiales carecen de la aplicación Docker , que reemplaza ideológica y funcionalmente a los paquetes Podman , Buildah (presente en la distribución predeterminada) y CRI-O . Esto se debe a la implementación práctica de estándares desarrollados, entre otras cosas, por Red Hat como parte de la Open Container Initiative (OCI).



El objetivo de OCI, que forma parte de The Linux Foundation, es crear estándares industriales abiertos para formatos de contenedor y tiempos de ejecución que aborden múltiples desafíos. En primer lugar, no contradecían la filosofía de Linux (por ejemplo, en la parte de que cada programa debería realizar una acción y Docker es una especie de recolector todo en uno). En segundo lugar, podríamos eliminar todas las fallas existentes en el software Docker . En tercer lugar, cumplirían totalmente con los requisitos comerciales de las principales plataformas comerciales para implementar, administrar y servir aplicaciones en contenedores (por ejemplo, Red Hat OpenShift).



Desventajas de Dockery las ventajas del nuevo software ya se han descrito con cierto detalle en este artículo , y una descripción detallada de cómo la pila de software completa ofrecida dentro del proyecto OCI y sus características arquitectónicas se puede encontrar en la documentación oficial y los artículos de Red Hat (un buen artículo en el blog de Red Hat) y en revisiones de terceros .



Es importante tener en cuenta qué funcionalidad tienen los componentes de la pila propuesta:



  • Podman : interacción directa con contenedores y almacenamiento de imágenes a través del proceso runC;
  • Buildah : creación y carga de imágenes en el registro;
  • CRI-O es un marco ejecutable para sistemas de orquestación de contenedores (como Kubernetes).


Creo que para entender el esquema general de interacción entre los componentes de la pila, es recomendable dar aquí el diagrama de comunicación de Kubernetes con runC y bibliotecas de bajo nivel usando CRI-O :







CRI-O y Kubernetes se adhieren al mismo ciclo de lanzamiento y soporte (la matriz de compatibilidad es muy simple: versiones principales Kubernetes y CRI-O son lo mismo), y esto, teniendo en cuenta el enfoque en las pruebas completas y exhaustivas del trabajo de esta pila por parte de los desarrolladores, nos da derecho a esperar la máxima estabilidad alcanzable en el trabajo en cualquier caso de uso (aquí, la ligereza relativa de CRI-O también es beneficiosa en comparación desdeDocker debido a una limitación intencionada de la funcionalidad).



Al instalar Kubernetes de la manera "correcta" (según OCI, por supuesto) usando CRI-O en CentOS 8, nos encontramos con pequeñas dificultades que, sin embargo, se superaron con éxito. Estaré encantado de compartir con ustedes las instrucciones de instalación y configuración, que juntas tomarán como máximo 10 minutos.



Cómo implementar Kubernetes en CentOS 8 usando CRI-O



Requisitos previos: al menos un host (2 núcleos, 4 GB de RAM, al menos 15 GB de disco) con CentOS 8 instalado (se recomienda el perfil de instalación "Servidor"), así como una entrada para él en el DNS local (como último recurso, puede hacer en / etc / hosts). Y no olvide deshabilitar el intercambio .



Realizamos todas las operaciones en el host como usuario root, tenga cuidado.



  1. En el primer paso, configuraremos el SO, instalaremos y configuraremos las dependencias preliminares para CRI-O.

    • Actualicemos el sistema operativo:



      dnf -y update
      


    • SELinux. , . , , , :



      firewall-cmd --set-default-zone trusted
      
      firewall-cmd --reload


      :



      systemctl disable --now firewalld
      


      SELinux «permissive»:



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


    • , «br_netfilter» :



      modprobe overlay
      
      modprobe br_netfilter
      
      echo "br_netfilter" >> /etc/modules-load.d/br_netfilter.conf
      
      dnf -y install iproute-tc
      


    • :



      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
      


      :



      sysctl --system


    • CRI-O ( CRI-O, , Kubernetes), Kubernetes 1.18:



      export REQUIRED_VERSION=1.18
      


      :



      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


    • CRI-O:



      dnf -y install cri-o
      


      , : CRI-O , conmon :



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




      CRI-O:



      systemctl enable --now crio
      




      :



      systemctl status crio
      


  2. Kubernetes.

    • :



      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
      


      Kubernetes ( 1.18, ):



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


    • : Docker, CRI-O, Kubernetes /var/lib/kubelet/config.yaml, :



      mkdir /var/lib/kubelet
      
      cat <<EOF > /var/lib/kubelet/config.yaml
      apiVersion: kubelet.config.k8s.io/v1beta1
      kind: KubeletConfiguration
      cgroupDriver: systemd
      EOF


    • , : , cgroup, kubelet ( ), , :



      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


    • kubelet:



      sudo systemctl enable --now kubelet
      


      control-plane worker , .



  3. .

    • :



      kubeadm init --pod-network-cidr=10.244.0.0/16
      


      «kubeadm join ...», , , , .


    • (CNI) Pod network. Calico. , Flannel nftables, Calico — CNI, Kubernetes:



      kubectl --kubeconfig /etc/kubernetes/admin.conf apply -f https://docs.projectcalico.org/v3.15/manifests/calico.yaml 


    • worker 1 2, , «kubeadm init ...», :



      kubeadm join $CONTROL_PLANE_ADDRESS:6443 --token $TOKEN \
          --discovery-token-ca-cert-hash $TOKEN_HASH


    • , :



      kubectl --kubeconfig=/etc/kubernetes/admin.conf get pods -A
      


    ! K8s .




Espero que las instrucciones anteriores le hayan ayudado a ahorrar tiempo y molestias.

El resultado de los procesos que tienen lugar en la industria a menudo depende de cómo sean aceptados por la mayoría de los usuarios finales y desarrolladores de otro software en el nicho correspondiente. Aún no está claro a dónde conducirán las iniciativas de OCI en unos pocos años, pero estaremos encantados de seguir. Puedes compartir tu opinión ahora mismo en los comentarios.



¡Manténganse al tanto!



Este artículo proviene de las siguientes fuentes:






All Articles