Το CRI-O ως αντικατάσταση του Docker ως περιβάλλον χρόνου εκτέλεσης για το Kubernetes: εγκατάσταση στο CentOS 8

Γειά σου! Το όνομά μου είναι Sergey, είμαι DevOps στο Surf. Το τμήμα DevOps στο Surf στοχεύει όχι μόνο στην καθιέρωση αλληλεπίδρασης μεταξύ ειδικών και την ενοποίηση διαδικασιών εργασίας, αλλά και στην ενεργό έρευνα και εφαρμογή των σύγχρονων τεχνολογιών τόσο στη δική του υποδομή όσο και στην υποδομή του πελάτη.

Παρακάτω θα μιλήσω λίγο για τις αλλαγές στη στοίβα τεχνολογίας για κοντέινερ που συναντήσαμε κατά τη μελέτη της διανομής 8 CentOS και για το τι είναι CRI-O και πώς να ρυθμίσετε γρήγορα ένα εκτελέσιμο περιβάλλον για Kubernetes.

Το CRI-O ως αντικατάσταση του Docker ως περιβάλλον χρόνου εκτέλεσης για το Kubernetes: εγκατάσταση στο CentOS 8

Γιατί το Docker δεν περιλαμβάνεται στο CentOS 8;

Μετά την εγκατάσταση των πιο πρόσφατων μεγάλων εκδόσεων RHEL 8 ή 8 CentOS κανείς δεν μπορεί παρά να παρατηρήσει: αυτές οι διανομές και τα επίσημα αποθετήρια δεν περιέχουν την εφαρμογή Λιμενεργάτης, που αντικαθιστούν ιδεολογικά και λειτουργικά πακέτα Πόντμαν, Buildah (παρούσα στη διανομή από προεπιλογή) και CRI-O. Αυτό οφείλεται στην πρακτική εφαρμογή των προτύπων που αναπτύχθηκαν, μεταξύ άλλων, από την Red Hat στο πλαίσιο του έργου Open Container Initiative (OCI).

Ο στόχος του OCI, το οποίο αποτελεί μέρος του The Linux Foundation, είναι να δημιουργήσει ανοιχτά βιομηχανικά πρότυπα για μορφές κοντέινερ και χρόνους εκτέλεσης που λύνουν πολλά προβλήματα ταυτόχρονα. Πρώτον, δεν έρχονται σε αντίθεση με τη φιλοσοφία του Linux (για παράδειγμα, στο κομμάτι ότι κάθε πρόγραμμα πρέπει να εκτελεί μια ενέργεια, και Λιμενεργάτης είναι ένα είδος συνδυασμού όλα σε ένα). Δεύτερον, θα μπορούσαν να εξαλείψουν όλες τις υπάρχουσες ελλείψεις στο λογισμικό Λιμενεργάτης. Τρίτον, θα ήταν πλήρως συμβατά με τις επιχειρηματικές απαιτήσεις κορυφαίων εμπορικών πλατφορμών για την ανάπτυξη, διαχείριση και εξυπηρέτηση εφαρμογών με εμπορευματοκιβώτια (για παράδειγμα, Red Hat OpenShift).

Περιορισμοί Λιμενεργάτης και τα πλεονεκτήματα του νέου λογισμικού έχουν ήδη περιγραφεί λεπτομερώς στο Αυτό το άρθρο, και μια λεπτομερής περιγραφή ολόκληρης της στοίβας λογισμικού που προσφέρεται στο έργο OCI και των αρχιτεκτονικών χαρακτηριστικών του μπορείτε να βρείτε στην επίσημη τεκμηρίωση και άρθρα από την ίδια την Red Hat (καθόλου άσχημα άρθρο στο Red Hat blog) και σε τρίτους κριτικές.

Είναι σημαντικό να σημειωθεί ποια λειτουργικότητα έχουν τα στοιχεία της προτεινόμενης στοίβας:

  • Πόντμαν — άμεση αλληλεπίδραση με κοντέινερ και αποθήκευση εικόνων μέσω της διαδικασίας runC.
  • Buildah — συναρμολόγηση και αποστολή εικόνων στο μητρώο·
  • CRI-O — ένα εκτελέσιμο περιβάλλον για συστήματα ενορχήστρωσης κοντέινερ (για παράδειγμα, Kubernetes).

Νομίζω ότι για να κατανοήσουμε το γενικό σχήμα αλληλεπίδρασης μεταξύ των στοιχείων της στοίβας, είναι σκόπιμο να παρέχουμε ένα διάγραμμα σύνδεσης εδώ Kubernetes c runC και βιβλιοθήκες χαμηλού επιπέδου που χρησιμοποιούν CRI-O:

Το CRI-O ως αντικατάσταση του Docker ως περιβάλλον χρόνου εκτέλεσης για το Kubernetes: εγκατάσταση στο CentOS 8

CRI-O и Kubernetes ακολουθήστε τον ίδιο κύκλο έκδοσης και υποστήριξης (η μήτρα συμβατότητας είναι πολύ απλή: κύριες εκδόσεις Kubernetes и CRI-O συμπίπτουν), και αυτό, λαμβάνοντας υπόψη την εστίαση στην πλήρη και ολοκληρωμένη δοκιμή της λειτουργίας αυτής της στοίβας από προγραμματιστές, μας δίνει το δικαίωμα να περιμένουμε τη μέγιστη δυνατή σταθερότητα στη λειτουργία σε οποιαδήποτε σενάρια χρήσης (η σχετική ελαφρότητα είναι επίσης ευεργετική εδώ CRI-O σε σύγκριση με Λιμενεργάτης λόγω σκόπιμου περιορισμού της λειτουργικότητας).

Κατά την εγκατάσταση Kubernetes "σωστός τρόπος" τρόπος (σύμφωνα με την OCI, φυσικά) χρησιμοποιώντας CRI-O επί 8 CentOS Συναντήσαμε κάποιες μικρές δυσκολίες, τις οποίες όμως ξεπεράσαμε με επιτυχία. Θα χαρώ να μοιραστώ μαζί σας οδηγίες εγκατάστασης και διαμόρφωσης, οι οποίες συνολικά θα διαρκέσουν περίπου 10 λεπτά.

Πώς να αναπτύξετε το Kubernetes στο CentOS 8 χρησιμοποιώντας το πλαίσιο CRI-O

Προϋποθέσεις: παρουσία τουλάχιστον ενός κεντρικού υπολογιστή (2 πυρήνες, 4 GB RAM, τουλάχιστον 15 GB αποθήκευσης) με εγκατεστημένο 8 CentOS (συνιστάται το προφίλ εγκατάστασης «Διακομιστής»), καθώς και καταχωρίσεις για αυτό στο τοπικό DNS (ως έσχατη λύση, μπορείτε να τα βγάλετε πέρα ​​με μια καταχώρηση στο /etc/hosts). Και μην ξεχνάτε απενεργοποιήστε την εναλλαγή.

Εκτελούμε όλες τις λειτουργίες στον κεντρικό υπολογιστή ως χρήστης root, να είστε προσεκτικοί.

  1. Στο πρώτο βήμα, θα διαμορφώσουμε το λειτουργικό σύστημα, θα εγκαταστήσουμε και θα διαμορφώσουμε τις προκαταρκτικές εξαρτήσεις για το CRI-O.
    • Ας ενημερώσουμε το λειτουργικό σύστημα:
      dnf -y update
      

    • Στη συνέχεια, πρέπει να διαμορφώσετε το τείχος προστασίας και το SELinux. Εδώ όλα εξαρτώνται από το περιβάλλον στο οποίο θα εργαστούν ο οικοδεσπότης ή οι οικοδεσπότες μας. Μπορείτε είτε να ρυθμίσετε ένα τείχος προστασίας σύμφωνα με τις συστάσεις από τεκμηρίωση, ή, εάν βρίσκεστε σε αξιόπιστο δίκτυο ή χρησιμοποιείτε τείχος προστασίας τρίτου μέρους, αλλάξτε την προεπιλεγμένη ζώνη σε αξιόπιστη ή απενεργοποιήστε το τείχος προστασίας:
      firewall-cmd --set-default-zone trusted
      
      firewall-cmd --reload

      Για να απενεργοποιήσετε το τείχος προστασίας μπορείτε να χρησιμοποιήσετε την ακόλουθη εντολή:

      systemctl disable --now firewalld
      

      Το SELinux πρέπει να απενεργοποιηθεί ή να τεθεί σε λειτουργία "επιτρεπόμενης":

      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 πριν από την έναρξη της υπηρεσίας, καθώς το απαιτούμενο συστατικό κοινό έχει διαφορετική θέση από την καθορισμένη:

      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

    • Η δεύτερη σημαντική απόχρωση: αφού δεν χρησιμοποιούμε δαίμονα Λιμενεργάτης, αλλά χρησιμοποιούμε τον δαίμονα 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
      

      Για προσαρμογή αεροπλάνο ελέγχου ή εργάτης κόμβους μέσα σε λίγα λεπτά, μπορείτε να χρησιμοποιήσετε με αυτό το σενάριο.

  3. Ήρθε η ώρα να αρχικοποιήσουμε το σύμπλεγμα μας.
    • Για να αρχικοποιήσετε το σύμπλεγμα, εκτελέστε την εντολή:
      kubeadm init --pod-network-cidr=10.244.0.0/16
      

      Φροντίστε να σημειώσετε την εντολή για να ενώσετε το σύμπλεγμα "kubeadm join…", το οποίο σας ζητείται να χρησιμοποιήσετε στο τέλος της εξόδου, ή τουλάχιστον τα καθορισμένα διακριτικά.

    • Ας εγκαταστήσουμε την προσθήκη (CNI) για το δίκτυο Pod. Συνιστώ τη χρήση τσίτι. Ίσως πιο δημοφιλής Φανέλα έχει προβλήματα συμβατότητας με nftables, και τσίτι - η μόνη εφαρμογή CNI που συνιστάται και έχει δοκιμαστεί πλήρως από το έργο Kubernetes:
      kubectl --kubeconfig /etc/kubernetes/admin.conf apply -f https://docs.projectcalico.org/v3.15/manifests/calico.yaml 

    • Για να συνδέσετε έναν κόμβο εργασίας στο σύμπλεγμα μας, πρέπει να τον διαμορφώσετε σύμφωνα με τις οδηγίες 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 σας.

Τι μας περιμένει μπροστά

Ελπίζω ότι οι παραπάνω οδηγίες σας βοήθησαν να εξοικονομήσετε χρόνο και νεύρα.
Το αποτέλεσμα των διαδικασιών που λαμβάνουν χώρα στον κλάδο εξαρτάται συχνά από το πώς γίνονται αποδεκτές από το μεγαλύτερο μέρος των τελικών χρηστών και προγραμματιστών άλλου λογισμικού στην αντίστοιχη θέση. Δεν είναι ακόμη απολύτως σαφές σε τι θα οδηγήσουν οι πρωτοβουλίες του OCI σε λίγα χρόνια, αλλά θα παρακολουθούμε με χαρά. Μπορείτε να μοιραστείτε τη γνώμη σας αυτή τη στιγμή στα σχόλια.

Μείνετε συντονισμένοι!

Αυτό το άρθρο εμφανίστηκε χάρη στις ακόλουθες πηγές:



Πηγή: www.habr.com

Προσθέστε ένα σχόλιο