CRI-O en remplacement de Docker comme environnement d'exécution pour Kubernetes : configuration sur CentOS 8

Bonjour! 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 également à rechercher et à mettre en œuvre activement les technologies actuelles tant dans sa propre infrastructure que dans celle 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. 8 CentOS et qu'est-ce que CRÉEZ-LE et comment configurer rapidement un environnement exécutable pour Kubernetes.

CRI-O en remplacement de Docker comme environnement d'exécution pour Kubernetes : configuration sur CentOS 8

Pourquoi Docker n’est-il pas inclus dans CentOS 8 ?

Après avoir installé les dernières versions majeures RHEL 8 ou 8 CentOS on ne peut s'empêcher de le remarquer : ces distributions et dépôts officiels ne contiennent pas l'application Docker, qui remplacent idéologiquement et fonctionnellement les packages Podman, Construire (présent dans la distribution par défaut) et CRÉEZ-LE. Cela est dû à la mise en œuvre pratique des standards développés, entre autres, par Red Hat dans le cadre du projet 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ésolvent plusieurs problèmes à la fois. Premièrement, ils ne contredisaient pas la philosophie de Linux (par exemple, dans la partie selon laquelle chaque programme doit effectuer une action, et Docker est une sorte de moissonneuse-batteuse tout-en-un). Deuxièmement, ils pourraient éliminer toutes les lacunes existantes du logiciel Docker. Troisièmement, ils seraient entièrement compatibles avec les exigences commerciales des principales plates-formes commerciales de déploiement, de gestion et de service d'applications conteneurisées (par exemple, Red Hat OpenShift).

Limites Docker et les avantages du nouveau logiciel ont déjà été décrits en détail dans cet article, et une description détaillée de l'ensemble de la pile logicielle proposée dans le projet OCI et de ses fonctionnalités architecturales peut être trouvée dans la documentation officielle et les articles de Red Hat lui-même (pas mal article sur le blog Red Hat) et dans des sites tiers Commentaires.

Il est important de noter quelles sont 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 ;
  • Construire — assemblage et téléchargement d'images dans le registre ;
  • CRÉEZ-LE — un environnement exécutable pour les systèmes d'orchestration de conteneurs (par exemple, Kubernetes).

Je pense que pour comprendre le schéma général d'interaction entre les composants de la stack, il convient de fournir ici un schéma de connexion Kubernetes c exécuterC et bibliothèques de bas niveau utilisant CRÉEZ-LE:

CRI-O en remplacement de Docker comme environnement d'exécution pour Kubernetes : configuration sur CentOS 8

CRÉEZ-LE и Kubernetes adhérer au même cycle de release et de support (la matrice de compatibilité est très simple : versions majeures Kubernetes и CRÉEZ-LE coïncident), et ceci, compte tenu de l'accent mis sur les tests complets et complets du fonctionnement de cette pile par les développeurs, nous donne le droit d'attendre la stabilité de fonctionnement maximale réalisable dans tous les scénarios d'utilisation (la légèreté relative est également bénéfique ici CRÉEZ-LE par rapport à Docker en raison d'une limitation délibérée des fonctionnalités).

При установке Kubernetes manière "dans le bon sens" (selon OCI, bien sûr) en utilisant CRÉEZ-LE sur 8 CentOS Nous avons rencontré quelques difficultés mineures, que nous avons néanmoins réussi à surmonter. Je me ferai un plaisir de partager avec vous les instructions d'installation et de configuration, qui prendront au total environ 10 minutes.

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

Prérequis : présence d'au moins un hôte (2 cœurs, 4 Go de RAM, espace de stockage d'au moins 15 Go) avec installé 8 CentOS (le profil d'installation « Serveur » est recommandé), ainsi que ses entrées dans le DNS local (en dernier recours, vous pouvez vous en sortir avec une entrée dans /etc/hosts). Et n'oublie pas désactiver l'échange.

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

  1. Dans la première étape, 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
      

    • Ensuite, vous devez configurer le pare-feu et SELinux. Ici tout dépend de l'environnement dans lequel notre ou nos hôtes vont travailler. Vous pouvez soit mettre en place un pare-feu selon les recommandations de documentation, ou, si vous êtes sur un réseau approuvé ou utilisez un pare-feu tiers, modifiez la zone par défaut en approuvé ou désactivez le pare-feu :
      firewall-cmd --set-default-zone trusted
      
      firewall-cmd --reload

      Pour désactiver le pare-feu, vous pouvez utiliser la commande suivante :

      systemctl disable --now firewalld
      

      SELinux doit être désactivé ou basculé en mode « permissif » :

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

    • Chargez les modules et packages noyau nécessaires, configurez le chargement automatique du module « br_netfilter » au démarrage du système :
      modprobe overlay
      
      modprobe br_netfilter
      
      echo "br_netfilter" >> /etc/modules-load.d/br_netfilter.conf
      
      dnf -y install iproute-tc
      

    • Pour activer le transfert de paquets et corriger le traitement du trafic, nous effectuerons les réglages appropriés :
      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
      

      appliquer les réglages effectués :

      sysctl --system

    • définir la version requise CRÉEZ-LE (version majeure CRÉEZ-LE, comme déjà mentionné, correspond à la version requise Kubernetes), depuis la dernière version stable Kubernetes actuellement 1.18 :
      export REQUIRED_VERSION=1.18
      

      ajoutez les référentiels nécessaires :

      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

    • maintenant nous pouvons installer CRÉEZ-LE:
      dnf -y install cri-o
      

      Faites attention à la première nuance que nous rencontrons lors du processus d'installation : vous devez modifier la configuration CRÉEZ-LE avant de démarrer le service, car le composant commun requis a un emplacement différent de celui spécifié :

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

      Vous pouvez maintenant activer et démarrer le démon CRÉEZ-LE:

      systemctl enable --now crio
      

      Vous pouvez vérifier l'état du démon :

      systemctl status crio
      

  2. Installation et activation Kubernetes.
    • Ajoutons le référentiel requis :
      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
      

      Maintenant nous pouvons installer Kubernetes (version 1.18, comme mentionné ci-dessus) :

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

    • La deuxième nuance importante : puisque nous n'utilisons pas de démon Docker, mais nous utilisons le démon CRÉEZ-LE, avant le lancement et l'initialisation Kubernetes vous devez effectuer les réglages appropriés dans le fichier de configuration /var/lib/kubelet/config.yaml, après avoir créé au préalable le répertoire souhaité :
      mkdir /var/lib/kubelet
      
      cat <<EOF > /var/lib/kubelet/config.yaml
      apiVersion: kubelet.config.k8s.io/v1beta1
      kind: KubeletConfiguration
      cgroupDriver: systemd
      EOF

    • Le troisième point important que l'on rencontre lors de l'installation : malgré le fait que nous ayons indiqué le driver utilisé groupe de contrôle, et sa configuration à travers les arguments passés Kubelet est obsolète (comme cela est explicitement indiqué dans la documentation), nous devons ajouter des arguments au fichier, sinon notre cluster ne sera pas initialisé :
      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

    • Maintenant nous pouvons activer le démon Kubelet:
      sudo systemctl enable --now kubelet
      

      Customiser avion de contrôle ou travailleur nœuds en quelques minutes, vous pouvez utiliser avec ce script.

  3. Il est temps d'initialiser notre cluster.
    • Pour initialiser le cluster, exécutez la commande :
      kubeadm init --pod-network-cidr=10.244.0.0/16
      

      Assurez-vous de noter la commande pour rejoindre le cluster « kubeadm join… », que vous êtes invité à utiliser à la fin de la sortie, ou au moins les jetons spécifiés.

    • Installons le plugin (CNI) pour le réseau Pod. Je recommande d'utiliser Calicot. Peut-être plus populaire Flanelle a des problèmes de compatibilité avec nftables, oui et oui Calicot - la seule implémentation CNI recommandée et entièrement testée par le projet Kubernetes:
      kubectl --kubeconfig /etc/kubernetes/admin.conf apply -f https://docs.projectcalico.org/v3.15/manifests/calico.yaml 

    • Pour connecter un nœud de travail à notre cluster, vous devez le configurer selon les instructions 1 et 2, ou utiliser scénario, puis exécutez la commande à partir de la sortie « kubeadm init... » que nous avons notée à l'étape précédente :
      kubeadm join $CONTROL_PLANE_ADDRESS:6443 --token $TOKEN 
          --discovery-token-ca-cert-hash $TOKEN_HASH

    • Vérifions que notre cluster est initialisé et a commencé à fonctionner :
      kubectl --kubeconfig=/etc/kubernetes/admin.conf get pods -A
      

    Prêt! Vous pouvez déjà héberger des charges utiles sur votre cluster K8s.

Ce qui nous attend

J'espère que les instructions ci-dessus vous ont permis d'économiser du temps et des nerfs.
Le résultat des processus qui se déroulent 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 exactement à quoi aboutiront les initiatives de l’OCI dans quelques années, mais nous les observerons avec plaisir. Vous pouvez partager votre opinion dès maintenant dans les commentaires.

Bientôt disponible!

Cet article est paru grâce aux sources suivantes :



Source: habr.com

Ajouter un commentaire