CRI-O en remplacement de Docker comme runtime pour Kubernetes: configuration sur CentOS 8

salut! Je m'appelle Sergey, je suis DevOps chez Surf. Le département DevOps de Surf vise non seulement à établir une interaction entre les spécialistes et à intégrer les processus de travail, mais aussi à rechercher activement et à mettre en œuvre les technologies pertinentes à la fois dans sa propre infrastructure et dans l'infrastructure du client.



Ci-dessous, je parlerai un peu des changements dans la pile technologique des conteneurs que nous avons rencontrés lors de l'étude de la distribution CentOS 8 et de ce qu'est CRI-O et comment configurer rapidement un environnement exécutable pour Kubernetes avec lui .







Pourquoi Docker est absent de la distribution standard de CentOS 8



Après avoir installé les dernières versions majeures de RHEL 8 ou CentOS 8, on ne peut manquer de remarquer: ces distributions et référentiels officiels n'ont pas l'application Docker , qui remplace idéologiquement et fonctionnellement les packages Podman , Buildah (présents dans la distribution par défaut) et CRI-O . Cela est dû à la mise en œuvre pratique des normes développées, entre autres, par Red Hat dans le cadre de l'Open Container Initiative (OCI).



L'objectif d'OCI, qui fait partie de la Linux Foundation, est de créer des normes industrielles ouvertes pour les formats de conteneurs et les environnements d'exécution qui répondent à de multiples défis. Premièrement, ils ne contredisaient pas la philosophie de Linux (par exemple, dans la partie où chaque programme devrait effectuer une action, et Docker est une sorte de moissonneur tout-en-un). Deuxièmement, nous pourrions éliminer toutes les failles existantes dans le logiciel Docker . Troisièmement, ils seraient entièrement conformes aux exigences commerciales des principales plates-formes commerciales pour le déploiement, la gestion et le service d'applications conteneurisées (par exemple, Red Hat OpenShift).



Inconvénients de Dockeret les avantages du nouveau logiciel ont déjà été décrits en détail dans cet article , et une description détaillée de la façon dont l'ensemble de la pile logicielle offerte dans le projet OCI et de ses caractéristiques architecturales peut être trouvée dans la documentation officielle et les articles de Red Hat lui-même (un bon article dans le blog Red Hat) et dans les revues de tiers .



Il est important de noter les fonctionnalités des composants de la pile proposée:



  • Podman - interaction directe avec les conteneurs et le stockage d'images via le processus runC;
  • Buildah - création et chargement d'images dans le registre;
  • CRI-O est un framework exécutable pour les systèmes d'orchestration de conteneurs (tels que Kubernetes).


Je pense que pour comprendre le schéma général d'interaction entre les composants de la pile, il est conseillé de donner ici le schéma de communication de Kubernetes avec runC et les bibliothèques de bas niveau utilisant CRI-O :







CRI-O et Kubernetes adhèrent au même cycle de version et de support (la matrice de compatibilité est très simple: versions majeures Kubernetes et CRI-O sont les mêmes), et cela, compte tenu de l'accent mis sur les tests complets et complets du travail de cette pile par les développeurs, nous donne le droit d'attendre la stabilité maximale réalisable dans le travail dans tous les cas d'utilisation (ici, la légèreté relative de CRI-O est également bénéfique en comparaison deDocker en raison d'une limitation délibérée des fonctionnalités).



Lors de l'installation de Kubernetes de la «bonne manière» (selon OCI, bien sûr) en utilisant CRI-O sur CentOS 8, nous avons rencontré de petites difficultés, qui, cependant, ont été surmontées avec succès. Je serai heureux de partager avec vous les instructions d'installation et de configuration, qui prendront ensemble au maximum 10 minutes.



Comment déployer Kubernetes sur CentOS 8 à l'aide de CRI-O



Prérequis: au moins un hôte (2 cœurs, 4 Go de RAM, au moins 15 Go de disque) avec CentOS 8 installé (le profil d'installation "Serveur" est recommandé), ainsi qu'une entrée pour celui-ci dans le DNS local (en dernier recours, vous pouvez faire dans / etc / hosts). Et n'oubliez pas de désactiver le swap .



Nous effectuons toutes les opérations sur l'hôte en tant qu'utilisateur root, soyez prudent.



  1. Dans un premier temps, nous allons configurer le système d'exploitation, installer et configurer les dépendances préliminaires pour CRI-O.

    • Mettons à jour le système d'exploitation:



      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 .




J'espère que les instructions ci-dessus vous ont aidé à gagner du temps et des tracas.

Le résultat des processus en cours dans l'industrie dépend souvent de la manière dont ils sont acceptés par la majorité des utilisateurs finaux et des développeurs d'autres logiciels dans le créneau correspondant. On ne sait pas encore où mèneront les initiatives de l'OCI dans quelques années, mais nous serons heureux de suivre. Vous pouvez partager votre opinion dès maintenant dans les commentaires.



Restez à l'écoute!



Cet article provient des sources suivantes:






All Articles