CRI-O sebagai pengganti Docker sebagai persekitaran masa jalan untuk Kubernetes: persediaan pada CentOS 8

hello! Nama saya Sergey, saya DevOps di Surf. Jabatan DevOps di Surf bertujuan bukan sahaja untuk mewujudkan interaksi antara pakar dan menyepadukan proses kerja, tetapi juga untuk menyelidik dan melaksanakan teknologi semasa secara aktif dalam infrastrukturnya sendiri dan dalam infrastruktur pelanggan.

Di bawah saya akan bercakap sedikit tentang perubahan dalam tindanan teknologi untuk bekas yang kami temui semasa mengkaji pengedaran CentOS 8 dan tentang apa itu CRI-O dan cara cepat menyediakan persekitaran boleh laku untuk Kubernetes.

CRI-O sebagai pengganti Docker sebagai persekitaran masa jalan untuk Kubernetes: persediaan pada CentOS 8

Mengapa Docker tidak disertakan dalam CentOS 8?

Selepas memasang keluaran utama terkini RHEL 8 atau CentOS 8 seseorang tidak boleh tidak perasan: pengedaran dan repositori rasmi ini tidak mengandungi aplikasi buruh pelabuhan, yang menggantikan pakej secara ideologi dan berfungsi podman, Buildah (hadir dalam pengedaran secara lalai) dan CRI-O. Ini disebabkan oleh pelaksanaan praktikal standard yang dibangunkan, antara lain, oleh Red Hat sebagai sebahagian daripada projek Inisiatif Kontena Terbuka (OCI).

Matlamat OCI, yang merupakan sebahagian daripada Yayasan Linux, adalah untuk mencipta piawaian industri terbuka untuk format kontena dan masa jalan yang menyelesaikan beberapa masalah sekaligus. Pertama, mereka tidak bercanggah dengan falsafah Linux (contohnya, dalam bahagian bahawa setiap program harus melakukan satu tindakan, dan buruh pelabuhan adalah sejenis gabungan semua-dalam-satu). Kedua, mereka boleh menghapuskan semua kekurangan yang ada dalam perisian buruh pelabuhan. Ketiga, mereka akan serasi sepenuhnya dengan keperluan perniagaan platform komersial terkemuka untuk mengatur, mengurus dan menyediakan aplikasi kontena (contohnya, Red Hat OpenShift).

Kecacatan buruh pelabuhan dan kelebihan perisian baharu telah pun diterangkan secara terperinci dalam artikel ini, dan penerangan terperinci tentang keseluruhan timbunan perisian yang ditawarkan dalam projek OCI dan ciri seni binanya boleh didapati dalam dokumentasi rasmi dan artikel daripada Red Hat itu sendiri (tidak buruk artikel dalam blog Red Hat) dan dalam pihak ketiga ulasan.

Adalah penting untuk ambil perhatian apakah kefungsian komponen timbunan yang dicadangkan:

  • podman β€” interaksi langsung dengan bekas dan storan imej melalui proses runC;
  • Buildah β€” memasang dan memuat naik imej ke pendaftaran;
  • CRI-O β€” persekitaran boleh laku untuk sistem orkestrasi kontena (contohnya, Kubernetes).

Saya berpendapat bahawa untuk memahami skema umum interaksi antara komponen timbunan, adalah dinasihatkan untuk menyediakan gambar rajah sambungan di sini Kubernetes c lariC dan perpustakaan peringkat rendah menggunakan CRI-O:

CRI-O sebagai pengganti Docker sebagai persekitaran masa jalan untuk Kubernetes: persediaan pada CentOS 8

CRI-O ΠΈ Kubernetes mematuhi kitaran keluaran dan sokongan yang sama (matriks keserasian adalah sangat mudah: versi utama Kubernetes ΠΈ CRI-O bertepatan), dan ini, dengan mengambil kira tumpuan pada ujian lengkap dan komprehensif operasi timbunan ini oleh pembangun, memberikan kita hak untuk mengharapkan kestabilan maksimum yang boleh dicapai dalam operasi di bawah sebarang senario penggunaan (ringan relatif juga bermanfaat di sini CRI-O berbanding dengan buruh pelabuhan disebabkan oleh pengehadan fungsi yang bertujuan).

Apabila memasang Kubernetes "cara yang betul" (mengikut OCI, sudah tentu) menggunakan CRI-O pada CentOS 8 Kami menghadapi beberapa kesulitan kecil, yang bagaimanapun, kami berjaya mengatasinya. Saya berbesar hati untuk berkongsi dengan anda arahan pemasangan dan konfigurasi, yang secara keseluruhannya akan mengambil masa kira-kira 10 minit.

Bagaimana untuk menggunakan Kubernetes pada CentOS 8 menggunakan rangka kerja CRI-O

Prasyarat: kehadiran sekurang-kurangnya satu hos (2 teras, 4 GB RAM, sekurang-kurangnya 15 GB storan) dengan dipasang CentOS 8 (profil pemasangan "Pelayan" disyorkan), serta entri untuknya dalam DNS tempatan (sebagai pilihan terakhir, anda boleh bertahan dengan entri dalam /etc/hosts). Dan jangan lupa lumpuhkan pertukaran.

Kami melakukan semua operasi pada hos sebagai pengguna akar, berhati-hati.

  1. Dalam langkah pertama, kami akan mengkonfigurasi OS, memasang dan mengkonfigurasi kebergantungan awal untuk CRI-O.
    • Mari kemas kini OS:
      dnf -y update
      

    • Seterusnya anda perlu mengkonfigurasi firewall dan SELinux. Di sini segala-galanya bergantung pada persekitaran di mana hos atau hos kami akan berfungsi. Anda boleh sama ada menyediakan tembok api mengikut pengesyoran daripada dokumentasi, atau, jika anda berada di rangkaian yang dipercayai atau menggunakan tembok api pihak ketiga, tukar zon lalai kepada dipercayai atau matikan tembok api:
      firewall-cmd --set-default-zone trusted
      
      firewall-cmd --reload

      Untuk mematikan firewall anda boleh menggunakan arahan berikut:

      systemctl disable --now firewalld
      

      SELinux perlu dimatikan atau ditukar kepada mod "permisif":

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

    • Muatkan modul dan pakej kernel yang diperlukan, konfigurasikan pemuatan automatik modul "br_netfilter" pada permulaan sistem:
      modprobe overlay
      
      modprobe br_netfilter
      
      echo "br_netfilter" >> /etc/modules-load.d/br_netfilter.conf
      
      dnf -y install iproute-tc
      

    • Untuk mengaktifkan penghantaran paket dan pemprosesan trafik yang betul, kami akan membuat tetapan yang sesuai:
      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
      

      gunakan tetapan yang dibuat:

      sysctl --system

    • tetapkan versi yang diperlukan CRI-O (versi utama CRI-O, seperti yang telah disebutkan, padankan versi yang diperlukan Kubernetes), sejak versi stabil terkini Kubernetes pada masa ini 1.18:
      export REQUIRED_VERSION=1.18
      

      tambah repositori yang diperlukan:

      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

    • sekarang kita boleh pasang CRI-O:
      dnf -y install cri-o
      

      Beri perhatian kepada nuansa pertama yang kami hadapi semasa proses pemasangan: anda perlu mengedit konfigurasi CRI-O sebelum memulakan perkhidmatan, kerana komponen conmon yang diperlukan mempunyai lokasi yang berbeza daripada yang ditentukan:

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

      Kini anda boleh mengaktifkan dan memulakan daemon CRI-O:

      systemctl enable --now crio
      

      Anda boleh menyemak status daemon:

      systemctl status crio
      

  2. Pemasangan dan pengaktifan Kubernetes.
    • Mari tambahkan repositori yang diperlukan:
      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
      

      Sekarang kita boleh pasang Kubernetes (versi 1.18, seperti yang dinyatakan di atas):

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

    • Nuansa penting kedua: kerana kami tidak menggunakan daemon buruh pelabuhan, tetapi kami menggunakan daemon CRI-O, sebelum pelancaran dan permulaan Kubernetes anda perlu membuat tetapan yang sesuai dalam fail konfigurasi /var/lib/kubelet/config.yaml, setelah mencipta direktori yang dikehendaki terlebih dahulu:
      mkdir /var/lib/kubelet
      
      cat <<EOF > /var/lib/kubelet/config.yaml
      apiVersion: kubelet.config.k8s.io/v1beta1
      kind: KubeletConfiguration
      cgroupDriver: systemd
      EOF

    • Perkara penting ketiga yang kami hadapi semasa pemasangan: walaupun pada hakikatnya kami telah menunjukkan pemandu yang digunakan cgroup, dan konfigurasinya melalui hujah yang diluluskan cubelet sudah lapuk (seperti yang dinyatakan secara eksplisit dalam dokumentasi), kami perlu menambah argumen pada fail, jika tidak, kluster kami tidak akan dimulakan:
      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

    • Sekarang kita boleh mengaktifkan daemon cubelet:
      sudo systemctl enable --now kubelet
      

      Untuk menyesuaikan pesawat kawalan atau pekerja nod dalam beberapa minit, anda boleh gunakan dengan skrip ini.

  3. Sudah tiba masanya untuk memulakan kluster kami.
    • Untuk memulakan kluster, jalankan arahan:
      kubeadm init --pod-network-cidr=10.244.0.0/16
      

      Pastikan anda menulis arahan untuk menyertai kluster "kubeadm join ...", yang anda diminta untuk menggunakan pada akhir output, atau sekurang-kurangnya token yang ditentukan.

    • Mari pasang pemalam (CNI) untuk rangkaian Pod. Saya mengesyorkan menggunakan Calico. Mungkin lebih popular Flanel mempunyai masalah keserasian dengan nftablesdan ya Calico - satu-satunya pelaksanaan CNI yang disyorkan dan diuji sepenuhnya oleh projek Kubernetes:
      kubectl --kubeconfig /etc/kubernetes/admin.conf apply -f https://docs.projectcalico.org/v3.15/manifests/calico.yaml 

    • Untuk menyambungkan nod pekerja ke kluster kami, anda perlu mengkonfigurasinya mengikut arahan 1 dan 2, atau gunakan skrip, kemudian jalankan arahan daripada output "kubeadm init..." yang kami tulis dalam langkah sebelumnya:
      kubeadm join $CONTROL_PLANE_ADDRESS:6443 --token $TOKEN 
          --discovery-token-ca-cert-hash $TOKEN_HASH

    • Mari semak sama ada kluster kami dimulakan dan mula berfungsi:
      kubectl --kubeconfig=/etc/kubernetes/admin.conf get pods -A
      

    sedia! Anda sudah boleh mengehoskan muatan pada kelompok K8 anda.

Apa yang menanti kita di hadapan

Saya harap arahan di atas membantu menjimatkan masa dan kegusaran anda.
Hasil proses yang berlaku dalam industri selalunya bergantung pada cara ia diterima oleh sebahagian besar pengguna akhir dan pembangun perisian lain dalam niche yang sepadan. Masih belum jelas sepenuhnya apakah inisiatif OCI akan membawa kepada dalam beberapa tahun, tetapi kami akan menonton dengan gembira. Anda boleh berkongsi pendapat anda sekarang dalam komen.

Tinggal!

Artikel ini muncul berkat sumber berikut:



Sumber: www.habr.com

Tambah komen