CRI-O como substituto de Docker como ambiente de execución para Kubernetes: configuración en CentOS 8

Ola! Chámome Sergey, son DevOps en Surf. O departamento de DevOps de Surf pretende non só establecer interacción entre especialistas e integrar procesos de traballo, senón tamén investigar e implementar activamente as tecnoloxías actuais tanto na súa propia infraestrutura como na do cliente.

A continuación falarei un pouco dos cambios na pila tecnolóxica dos contedores que atopamos ao estudar a distribución. CentOS 8 e sobre o que é CRI-O e como configurar rapidamente un ambiente executable para Kubernetes.

CRI-O como substituto de Docker como ambiente de execución para Kubernetes: configuración en CentOS 8

Por que Docker non está incluído en CentOS 8?

Despois de instalar as últimas versións principais rhel 8 ou CentOS 8 non se pode deixar de notar: estas distribucións e repositorios oficiais non conteñen a aplicación Estivador, que substitúen ideolóxica e funcionalmente os paquetes podman, Buildah (presente na distribución por defecto) e CRI-O. Isto débese á implementación práctica de estándares desenvolvidos, entre outras cousas, por Red Hat como parte do proxecto Open Container Initiative (OCI).

O obxectivo de OCI, que forma parte da Fundación Linux, é crear estándares industriais abertos para formatos de contedores e tempos de execución que resolvan varios problemas á vez. En primeiro lugar, non contradín a filosofía de Linux (por exemplo, na parte de que cada programa debería realizar unha acción e Estivador é unha especie de combinado todo en un). En segundo lugar, poderían eliminar todas as deficiencias existentes no software Estivador. En terceiro lugar, serían totalmente compatibles cos requisitos comerciais das principais plataformas comerciais para a implantación, xestión e servizo de aplicacións en contedores (por exemplo, Red Hat OpenShift).

Limitacións Estivador e as vantaxes do novo software xa foron descritas con certo detalle en Este artigo, e unha descrición detallada de toda a pila de software ofrecida dentro do proxecto OCI e as súas características arquitectónicas pódese atopar na documentación oficial e nos artigos da propia Red Hat (non é nada malo). artigo no blog de Red Hat) e en terceiros comentarios.

É importante ter en conta que funcionalidades teñen os compoñentes da pila proposta:

  • podman — interacción directa cos contedores e almacenamento de imaxes a través do proceso runC;
  • Buildah — montaxe e carga de imaxes ao rexistro;
  • CRI-O — un contorno executable para sistemas de orquestración de contedores (por exemplo, Kubernetes).

Creo que para comprender o esquema xeral de interacción entre os compoñentes da pila, é recomendable proporcionar aquí un diagrama de conexión Kubernetes c correrC e bibliotecas de baixo nivel usando CRI-O:

CRI-O como substituto de Docker como ambiente de execución para Kubernetes: configuración en CentOS 8

CRI-O и Kubernetes unirse ao mesmo ciclo de lanzamento e soporte (a matriz de compatibilidade é moi sinxela: versións principais Kubernetes и CRI-O coinciden), e isto, tendo en conta o foco na proba completa e completa do funcionamento desta pila por parte dos desenvolvedores, dános o dereito a esperar a máxima estabilidade alcanzable no funcionamento en calquera escenario de uso (a lixeireza relativa tamén é beneficiosa aquí). CRI-O en comparación con Estivador debido á limitación intencionada da funcionalidade).

Ao instalar Kubernetes "camino correcto" (segundo OCI, por suposto) usando CRI-O en CentOS 8 Atopamos algunhas dificultades menores que, con todo, superamos con éxito. Estarei encantado de compartir con vostede as instrucións de instalación e configuración, que en total levarán uns 10 minutos.

Como implementar Kubernetes en CentOS 8 usando o marco CRI-O

Requisitos previos: presenza de polo menos un host (2 núcleos, 4 GB de RAM, polo menos 15 GB de almacenamento) con CentOS 8 (recoméndase o perfil de instalación do "Servidor"), así como entradas para el no DNS local (como último recurso, podes facelo cunha entrada en /etc/hosts). E non esquezas desactivar o intercambio.

Realizamos todas as operacións no host como usuario root, teña coidado.

  1. No primeiro paso, configuraremos o SO, instalaremos e configuraremos dependencias preliminares para CRI-O.
    • Actualicemos o sistema operativo:
      dnf -y update
      

    • A continuación cómpre configurar o firewall e SELinux. Aquí todo depende do ambiente no que traballarán o noso anfitrión ou anfitrións. Podes configurar un firewall segundo as recomendacións de documentación, ou, se estás nunha rede de confianza ou utilizas un firewall de terceiros, cambia a zona predeterminada a de confianza ou desactiva o firewall:
      firewall-cmd --set-default-zone trusted
      
      firewall-cmd --reload

      Para desactivar o firewall pode usar o seguinte comando:

      systemctl disable --now firewalld
      

      SELinux debe estar desactivado ou cambiado ao modo "permisivo":

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

    • Cargue os módulos e paquetes do núcleo necesarios, configure a carga automática do módulo "br_netfilter" ao iniciar o sistema:
      modprobe overlay
      
      modprobe br_netfilter
      
      echo "br_netfilter" >> /etc/modules-load.d/br_netfilter.conf
      
      dnf -y install iproute-tc
      

    • Para activar o reenvío de paquetes e corrixir o procesamento do tráfico, faremos a configuración adecuada:
      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 a configuración realizada:

      sysctl --system

    • establecer a versión requirida CRI-O (versión principal CRI-O, como xa se mencionou, coincide coa versión requirida Kubernetes), desde a última versión estable Kubernetes actualmente 1.18:
      export REQUIRED_VERSION=1.18
      

      engade os 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

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

      Preste atención ao primeiro matiz que atopamos durante o proceso de instalación: cómpre editar a configuración CRI-O antes de iniciar o servizo, xa que o compoñente común necesario ten unha localización diferente á especificada:

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

      Agora podes activar e iniciar o daemon CRI-O:

      systemctl enable --now crio
      

      Podes comprobar o estado do daemon:

      systemctl status crio
      

  2. Instalación e activación Kubernetes.
    • Engadimos o repositorio necesario:
      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
      

      Agora podemos instalar Kubernetes (versión 1.18, como se mencionou anteriormente):

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

    • O segundo matiz importante: xa que non usamos un daemon Estivador, pero usamos o daemon CRI-O, antes do lanzamento e inicialización Kubernetes cómpre facer as opcións adecuadas no ficheiro de configuración /var/lib/kubelet/config.yaml, tendo primeiro creado o directorio desexado:
      mkdir /var/lib/kubelet
      
      cat <<EOF > /var/lib/kubelet/config.yaml
      apiVersion: kubelet.config.k8s.io/v1beta1
      kind: KubeletConfiguration
      cgroupDriver: systemd
      EOF

    • O terceiro punto importante que atopamos durante a instalación: a pesar de que indicamos o controlador utilizado cgroup, e a súa configuración a través dos argumentos pasados cubeta está desactualizado (como se indica explícitamente na documentación), necesitamos engadir argumentos ao ficheiro, se non, o noso clúster non 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

    • Agora podemos activar o daemon cubeta:
      sudo systemctl enable --now kubelet
      

      Para personalizar plano de control ou traballador nodos en minutos, podes usar con este guión.

  3. É hora de inicializar o noso clúster.
    • Para inicializar o clúster, execute o comando:
      kubeadm init --pod-network-cidr=10.244.0.0/16
      

      Asegúrate de anotar o comando para unirte ao clúster "kubeadm join...", que se lle pide que use ao final da saída, ou polo menos os tokens especificados.

    • Imos instalar o complemento (CNI) para a rede Pod. Recomendo usar chita. Posiblemente máis popular Flanela ten problemas de compatibilidade con nftables, si e chita - a única implementación CNI recomendada e totalmente probada polo proxecto Kubernetes:
      kubectl --kubeconfig /etc/kubernetes/admin.conf apply -f https://docs.projectcalico.org/v3.15/manifests/calico.yaml 

    • Para conectar un nodo traballador ao noso clúster, cómpre configuralo segundo as instrucións 1 e 2, ou utilizalo guión, a continuación, execute o comando desde a saída "kubeadm init..." que anotamos no paso anterior:
      kubeadm join $CONTROL_PLANE_ADDRESS:6443 --token $TOKEN 
          --discovery-token-ca-cert-hash $TOKEN_HASH

    • Comprobamos que o noso clúster está inicializado e comezou a funcionar:
      kubectl --kubeconfig=/etc/kubernetes/admin.conf get pods -A
      

    Listo! Xa podes aloxar cargas útiles no teu clúster K8s.

O que nos espera por diante

Espero que as instrucións anteriores che axuden a aforrar tempo e nervios.
O resultado dos procesos que ocorren na industria a miúdo depende de como sexan aceptados pola maioría dos usuarios finais e desenvolvedores doutro software no nicho correspondente. Aínda non está do todo claro a que levarán as iniciativas da OCI nuns anos, pero estaremos vendo con pracer. Podes compartir a túa opinión agora mesmo nos comentarios.

Sexa atento!

Este artigo apareceu grazas ás seguintes fontes:



Fonte: www.habr.com

Engadir un comentario