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

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

A continuación hablaré un poco sobre los cambios en la pila de tecnología para contenedores que encontramos al estudiar la distribución. 8 CentOS Y lo que es CRI-O y cómo configurar rápidamente un entorno ejecutable para Kubernetes.

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

¿Por qué Docker no está incluido en CentOS 8?

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

El objetivo de OCI, que forma parte de The Linux Foundation, es crear estándares industriales abiertos para formatos de contenedores y tiempos de ejecución que resuelvan varios problemas a la vez. En primer lugar, no contradecían la filosofía de Linux (por ejemplo, en la parte que cada programa debía realizar una acción, y Docker es una especie de cosechadora todo en uno). En segundo lugar, podrían eliminar todas las deficiencias existentes en el software. Docker. En tercer lugar, serían totalmente compatibles con los requisitos comerciales de las principales plataformas comerciales para implementar, administrar y servir aplicaciones en contenedores (por ejemplo, Red Hat OpenShift).

Limitaciones Docker y las ventajas del nuevo software ya se han descrito con cierto detalle en este artículo, y se puede encontrar una descripción detallada de toda la pila de software ofrecida dentro del proyecto OCI y sus características arquitectónicas en la documentación y artículos oficiales de Red Hat (no está mal). artículo en el blog de Red Hat) y en terceros opiniones.

Es importante señalar 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;
  • Construir — montaje y carga de imágenes al registro;
  • CRI-O — un entorno ejecutable para sistemas de orquestación de contenedores (por ejemplo, Kubernetes).

Creo que para comprender el esquema general de interacción entre los componentes de la pila, es recomendable proporcionar aquí un diagrama de conexión. Kubernetes c ejecutarC y bibliotecas de bajo nivel que utilizan CRI-O:

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

CRI-O и Kubernetes cumplir con el mismo ciclo de lanzamiento y soporte (la matriz de compatibilidad es muy simple: versiones principales Kubernetes и CRI-O coinciden), y esto, teniendo en cuenta el enfoque en las pruebas completas y exhaustivas del funcionamiento de esta pila por parte de los desarrolladores, nos da derecho a esperar la máxima estabilidad alcanzable en el funcionamiento en cualquier escenario de uso (la relativa ligereza también es beneficiosa aquí). CRI-O comparado con Docker debido a una limitación intencionada de la funcionalidad).

Al instalar Kubernetes "forma correcta" (según OCI, por supuesto) usando CRI-O en 8 CentOS Nos topamos con algunas dificultades menores que, sin embargo, logramos superar con éxito. Estaré encantado de compartir contigo las instrucciones de instalación y configuración, que en total tardarán unos 10 minutos.

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

Requisitos previos: presencia de al menos un host (2 núcleos, 4 GB de RAM, al menos 15 GB de almacenamiento) con instalación 8 CentOS (se recomienda el perfil de instalación "Servidor"), así como entradas correspondientes en el DNS local (como último recurso, puede arreglárselas con una entrada en /etc/hosts). Y no lo olvides desactivar el intercambio.

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

  1. En el primer paso, configuraremos el sistema operativo, instalaremos y configuraremos las dependencias preliminares para CRI-O.
    • Actualicemos el sistema operativo:
      dnf -y update
      

    • A continuación, debe configurar el firewall y SELinux. Aquí todo depende del entorno en el que trabajará nuestro host o hosts. Puede configurar un firewall de acuerdo con las recomendaciones de documentaciónO, si está en una red confiable o utiliza un firewall de terceros, cambie la zona predeterminada a confiable o apague el firewall:
      firewall-cmd --set-default-zone trusted
      
      firewall-cmd --reload

      Para desactivar el firewall puede utilizar el siguiente comando:

      systemctl disable --now firewalld
      

      SELinux debe apagarse o cambiarse al modo "permisivo":

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

    • Cargue los módulos y paquetes del kernel necesarios, configure la carga automática del módulo “br_netfilter” al iniciar el sistema:
      modprobe overlay
      
      modprobe br_netfilter
      
      echo "br_netfilter" >> /etc/modules-load.d/br_netfilter.conf
      
      dnf -y install iproute-tc
      

    • Para activar el reenvío de paquetes y el correcto procesamiento del tráfico realizaremos las configuraciones adecuadas:
      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 los ajustes realizados:

      sysctl --system

    • establecer la versión requerida CRI-O (versión mayor CRI-O, como ya se mencionó, coincida con la versión requerida Kubernetes), desde la última versión estable Kubernetes actualmente 1.18:
      export REQUIRED_VERSION=1.18
      

      agregue los repositorios necesarios:

      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

    • ahora podemos instalar CRI-O:
      dnf -y install cri-o
      

      Presta atención al primer matiz que encontramos durante el proceso de instalación: es necesario editar la configuración CRI-O antes de iniciar el servicio, ya que el componente común requerido tiene una ubicación diferente a la especificada:

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

      Ahora puedes activar e iniciar el demonio. CRI-O:

      systemctl enable --now crio
      

      Puedes comprobar el estado del demonio:

      systemctl status crio
      

  2. Instalación y activación Kubernetes.
    • Agreguemos el repositorio requerido:
      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
      

      Ahora podemos instalar Kubernetes (versión 1.18, como se mencionó anteriormente):

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

    • El segundo matiz importante: ya que no utilizamos un demonio Docker, pero usamos el demonio CRI-O, antes del lanzamiento y la inicialización Kubernetes debe realizar los ajustes apropiados en el archivo de configuración /var/lib/kubelet/config.yaml, habiendo creado primero el directorio deseado:
      mkdir /var/lib/kubelet
      
      cat <<EOF > /var/lib/kubelet/config.yaml
      apiVersion: kubelet.config.k8s.io/v1beta1
      kind: KubeletConfiguration
      cgroupDriver: systemd
      EOF

    • El tercer punto importante con el que nos encontramos durante la instalación: a pesar de que hayamos indicado el controlador utilizado cgrupo, y su configuración a través de los argumentos pasados kubelet está desactualizado (como se indica explícitamente en la documentación), debemos agregar argumentos al archivo; de lo contrario, nuestro clúster no se 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

    • Ahora podemos activar el demonio. kubelet:
      sudo systemctl enable --now kubelet
      

      Personalizar plano de control o obrero nodos en minutos, puedes usar con este guión.

  3. Es hora de inicializar nuestro clúster.
    • Para inicializar el clúster, ejecute el comando:
      kubeadm init --pod-network-cidr=10.244.0.0/16
      

      Asegúrese de escribir el comando para unirse al clúster “kubeadm join…”, que se le solicita usar al final del resultado, o al menos los tokens especificados.

    • Instalemos el complemento (CNI) para la red Pod. recomiendo usar Calicó. Posiblemente más popular Franela tiene problemas de compatibilidad con mesas de juegoy Calicó - la única implementación de CNI recomendada y completamente probada por el proyecto Kubernetes:
      kubectl --kubeconfig /etc/kubernetes/admin.conf apply -f https://docs.projectcalico.org/v3.15/manifests/calico.yaml 

    • Para conectar un nodo trabajador a nuestro clúster, debe configurarlo de acuerdo con las instrucciones 1 y 2, o usar guión, luego ejecute el comando desde la salida “kubeadm init...” que anotamos en el paso anterior:
      kubeadm join $CONTROL_PLANE_ADDRESS:6443 --token $TOKEN 
          --discovery-token-ca-cert-hash $TOKEN_HASH

    • Comprobemos que nuestro clúster esté inicializado y haya comenzado a funcionar:
      kubectl --kubeconfig=/etc/kubernetes/admin.conf get pods -A
      

    ¡Listo! Ya puede alojar cargas útiles en su clúster K8.

Lo que nos espera por delante

Espero que las instrucciones anteriores le hayan ayudado a ahorrar tiempo y nervios.
El resultado de los procesos que ocurren en la industria a menudo depende de cómo sean aceptados por la mayor parte de los usuarios finales y desarrolladores de otro software en el nicho correspondiente. Todavía no está del todo claro a qué conducirán las iniciativas de la OCI dentro de unos años, pero lo estaremos observando con mucho gusto. Puedes compartir tu opinión ahora mismo en los comentarios.

¡Manténganse al tanto!

Este artículo apareció gracias a las siguientes fuentes:



Fuente: habr.com

Añadir un comentario