CRI-O sebagai pengganti Docker sebagai runtime untuk Kubernetes: penyetelan di CentOS 8

Halo! Nama saya Sergey, saya DevOps di Surf. Departemen DevOps di Surf bertujuan tidak hanya untuk membangun interaksi antara spesialis dan mengintegrasikan proses kerja, tetapi juga untuk secara aktif meneliti dan menerapkan teknologi yang relevan baik di infrastrukturnya sendiri maupun di infrastruktur pelanggan.



Di bawah ini saya akan berbicara sedikit tentang perubahan dalam tumpukan teknologi untuk kontainer yang kami temui ketika mempelajari distribusi CentOS 8 dan apa itu CRI-O dan cara cepat mengatur lingkungan yang dapat dieksekusi untuk Kubernetes dengannya .







Mengapa Docker hilang dari distribusi CentOS 8 standar



Setelah menginstal rilis mayor terbaru dari RHEL 8 atau CentOS 8, orang tidak dapat mengabaikannya : distribusi dan repositori resmi ini tidak memiliki aplikasi Docker , yang secara ideologis dan fungsional menggantikan Podman , paket Buildah (hadir dalam distribusi default) dan CRI-O . Hal ini disebabkan penerapan praktis dari standar yang dikembangkan, antara lain oleh Red Hat sebagai bagian dari Open Container Initiative (OCI).



Sasaran OCI, yang merupakan bagian dari The Linux Foundation, adalah menciptakan standar industri terbuka untuk format kontainer dan runtime yang mengatasi berbagai tantangan. Pertama, mereka tidak bertentangan dengan filosofi Linux (misalnya, di bagian bahwa setiap program harus melakukan satu tindakan, dan Docker adalah sejenis pemanen all-in-one). Kedua, kita bisa menghilangkan semua kekurangan yang ada pada software Docker . Ketiga, mereka akan sepenuhnya sesuai dengan persyaratan bisnis dari platform komersial terkemuka untuk menyebarkan, mengelola dan melayani aplikasi dalam kontainer (misalnya, Red Hat OpenShift).



Kekurangan Dockerdan kelebihan perangkat lunak baru telah dijelaskan secara mendetail di artikel ini , dan penjelasan mendetail tentang bagaimana keseluruhan tumpukan perangkat lunak yang ditawarkan dalam proyek OCI dan fitur arsitekturalnya dapat ditemukan di dokumentasi resmi dan artikel dari kedua Red Hat itu sendiri ( artikel bagus di blog Red Hat) dan di ulasan pihak ketiga .



Penting untuk diperhatikan fungsionalitas apa yang dimiliki komponen tumpukan yang diusulkan:



  • Podman - interaksi langsung dengan container dan penyimpanan image melalui proses runC;
  • Buildah - membangun dan memuat gambar ke dalam registri;
  • CRI-O adalah framework yang dapat dieksekusi untuk sistem orkestrasi container (seperti Kubernetes).


Saya pikir untuk memahami skema umum interaksi antara komponen stack, disarankan untuk menyajikan di sini diagram komunikasi Kubernetes dengan runC dan library tingkat rendah menggunakan CRI-O :







CRI-O dan Kubernetes mematuhi siklus rilis dan dukungan yang sama (matriks kompatibilitasnya sangat sederhana: versi mayor Kubernetes dan CRI-O adalah sama), dan ini, dengan mempertimbangkan fokus pada pengujian penuh dan komprehensif dari pekerjaan tumpukan ini oleh pengembang, memberi kami hak untuk mengharapkan stabilitas maksimum yang dapat dicapai dalam pekerjaan di bawah semua kasus penggunaan (di sini, bobot relatif CRI-O juga bermanfaat sebagai perbandingan dariDocker karena keterbatasan fungsionalitas yang disengaja).



Saat menginstal Kubernetes dengan cara yang "benar" (menurut OCI, tentunya) menggunakan CRI-O di CentOS 8, kami mengalami sedikit kesulitan, yang bagaimanapun, berhasil diatasi. Saya akan dengan senang hati berbagi dengan Anda petunjuk pemasangan dan konfigurasi, yang bersama-sama akan memakan waktu paling lama 10 menit.



Cara menerapkan Kubernetes di CentOS 8 menggunakan CRI-O



Prasyarat: setidaknya satu host (2 core, 4 GB RAM, minimal 15 GB drive) dengan CentOS 8 terpasang (disarankan untuk menggunakan profil penginstalan "Server"), serta memasukkannya ke DNS lokal (sebagai upaya terakhir, Anda dapat melakukannya di / etc / hosts). Dan jangan lupa nonaktifkan swap .



Kami melakukan semua operasi pada host sebagai pengguna root, berhati-hatilah.



  1. Pada langkah pertama, kita akan mengkonfigurasi OS, menginstal dan mengkonfigurasi dependensi awal untuk CRI-O.

    • Mari perbarui OS:



      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 .




Semoga instruksi di atas membantu menghemat waktu dan kerumitan Anda.

Hasil dari proses yang terjadi di industri sering kali bergantung pada bagaimana proses tersebut diterima oleh sebagian besar pengguna akhir dan pengembang perangkat lunak lain di ceruk yang sesuai. Belum jelas ke mana arah inisiatif OCI dalam beberapa tahun ini, tetapi kami akan dengan senang hati mengikutinya. Anda dapat membagikan pendapat Anda sekarang di komentar.



Tetap disini!



Artikel ini berasal dari sumber berikut:



  • Bagian tentang runtime Container dalam dokumentasi Kubernetes
  • Halaman proyek CRI-O di Internet
  • Posting blog Red Hat: yang ini , yang ini, dan lebih banyak lagi



All Articles