CRI-O sebagai pengganti Docker sebagai lingkungan runtime untuk Kubernetes: diatur pada CentOS 8

Halo! Nama saya Sergey, saya DevOps di Surf. Departemen DevOps di Surf bertujuan tidak hanya untuk menjalin interaksi antar spesialis dan mengintegrasikan proses kerja, namun juga untuk secara aktif meneliti dan menerapkan teknologi terkini baik di infrastrukturnya sendiri maupun di infrastruktur pelanggan.

Di bawah ini saya akan berbicara sedikit tentang perubahan tumpukan teknologi untuk container yang kami temui saat mempelajari distribusinya 8 CentOS dan tentang apa itu CRI-O dan cara cepat menyiapkan lingkungan yang dapat dieksekusi Kubernetes.

CRI-O sebagai pengganti Docker sebagai lingkungan runtime untuk Kubernetes: diatur pada CentOS 8

Mengapa Docker tidak disertakan dalam CentOS 8?

Setelah menginstal rilis besar terbaru RHEL 8 ΠΈΠ»ΠΈ 8 CentOS orang pasti memperhatikan: distribusi dan repositori resmi ini tidak berisi aplikasi Buruh pelabuhan, yang secara ideologis dan fungsional menggantikan paket tukang pod, Membangunah (ada dalam distribusi secara default) dan CRI-O. Hal ini disebabkan oleh penerapan praktis standar yang dikembangkan, antara lain, oleh Red Hat sebagai bagian dari proyek Open Container Initiative (OCI).

Tujuan OCI, yang merupakan bagian dari The Linux Foundation, adalah untuk menciptakan standar industri terbuka untuk format container dan runtime yang memecahkan beberapa masalah sekaligus. Pertama, mereka tidak bertentangan dengan filosofi Linux (misalnya, setiap program harus melakukan satu tindakan, dan Buruh pelabuhan adalah sejenis gabungan all-in-one). Kedua, mereka dapat menghilangkan semua kekurangan yang ada pada perangkat lunak Buruh pelabuhan. Ketiga, mereka akan sepenuhnya kompatibel dengan kebutuhan bisnis platform komersial terkemuka untuk menerapkan, mengelola, dan melayani aplikasi dalam container (misalnya, Red Hat OpenShift).

Kekurangan: Buruh pelabuhan dan keunggulan perangkat lunak baru ini telah dijelaskan secara rinci di Artikel ini, dan penjelasan rinci tentang keseluruhan tumpukan perangkat lunak yang ditawarkan dalam proyek OCI dan fitur arsitekturalnya dapat ditemukan di dokumentasi resmi dan artikel dari Red Hat sendiri (tidak buruk artikel di blog Red Hat) dan di pihak ketiga ulasan.

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

  • tukang pod β€” interaksi langsung dengan container dan penyimpanan gambar melalui proses runC;
  • Membangunah β€” merakit dan mengunggah gambar ke registri;
  • CRI-O β€” lingkungan yang dapat dieksekusi untuk sistem orkestrasi container (misalnya, Kubernetes).

Saya pikir untuk memahami skema umum interaksi antara komponen tumpukan, disarankan untuk menyediakan diagram koneksi di sini Kubernetes c menjalankanC dan perpustakaan tingkat rendah menggunakan CRI-O:

CRI-O sebagai pengganti Docker sebagai lingkungan runtime untuk Kubernetes: diatur pada CentOS 8

CRI-O ΠΈ Kubernetes mematuhi siklus rilis dan dukungan yang sama (matriks kompatibilitasnya sangat sederhana: versi utama Kubernetes ΠΈ CRI-O bertepatan), dan ini, dengan mempertimbangkan fokus pada pengujian lengkap dan komprehensif pengoperasian tumpukan ini oleh pengembang, memberi kita hak untuk mengharapkan stabilitas maksimum yang dapat dicapai dalam pengoperasian dalam skenario penggunaan apa pun (relatif ringan juga bermanfaat di sini CRI-O dibandingkan dengan Buruh pelabuhan karena pembatasan fungsionalitas yang disengaja).

Saat memasang Kubernetes cara "benar" (menurut OCI, tentu saja) menggunakan CRI-O pada 8 CentOS Kami menemui beberapa kesulitan kecil, namun berhasil kami atasi. Saya akan dengan senang hati berbagi dengan Anda petunjuk instalasi dan konfigurasi, yang totalnya akan memakan waktu sekitar 10 menit.

Cara men-deploy Kubernetes di CentOS 8 menggunakan framework CRI-O

Prasyarat: kehadiran setidaknya satu host (2 core, RAM 4 GB, penyimpanan minimal 15 GB) dengan terpasang 8 CentOS (disarankan profil instalasi "Server"), serta entri untuk itu di DNS lokal (sebagai upaya terakhir, Anda dapat menggunakan entri di /etc/hosts). Dan jangan lupa nonaktifkan pertukaran.

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

  1. Pada langkah pertama, kita akan mengkonfigurasi OS, menginstal dan mengkonfigurasi dependensi awal untuk CRI-O.
    • Mari perbarui OS:
      dnf -y update
      

    • Selanjutnya Anda perlu mengkonfigurasi firewall dan SELinux. Di sini semuanya tergantung pada lingkungan di mana host atau host kita akan bekerja. Anda dapat mengatur firewall sesuai dengan rekomendasi dari dokumentasi, atau, jika Anda berada di jaringan tepercaya atau menggunakan firewall pihak ketiga, ubah zona default menjadi tepercaya atau matikan firewall:
      firewall-cmd --set-default-zone trusted
      
      firewall-cmd --reload

      Untuk mematikan firewall Anda dapat menggunakan perintah berikut:

      systemctl disable --now firewalld
      

      SELinux perlu dimatikan atau dialihkan ke mode β€œpermisif”:

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

    • Muat modul dan paket kernel yang diperlukan, konfigurasikan pemuatan otomatis modul β€œbr_netfilter” saat startup sistem:
      modprobe overlay
      
      modprobe br_netfilter
      
      echo "br_netfilter" >> /etc/modules-load.d/br_netfilter.conf
      
      dnf -y install iproute-tc
      

    • Untuk mengaktifkan penerusan paket dan memperbaiki pemrosesan lalu lintas, kami akan membuat pengaturan 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
      

      terapkan pengaturan yang dibuat:

      sysctl --system

    • atur versi yang diperlukan CRI-O (versi utama CRI-O, sebagaimana telah disebutkan, cocok dengan versi yang diperlukan Kubernetes), sejak versi stabil terbaru Kubernetes saat ini 1.18:
      export REQUIRED_VERSION=1.18
      

      tambahkan 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 dapat menginstal CRI-O:
      dnf -y install cri-o
      

      Perhatikan nuansa pertama yang kita temui selama proses instalasi: Anda perlu mengedit konfigurasi CRI-O sebelum memulai layanan, karena komponen conmon yang diperlukan memiliki lokasi yang berbeda dari yang ditentukan:

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

      Sekarang Anda dapat mengaktifkan dan memulai daemon CRI-O:

      systemctl enable --now crio
      

      Anda dapat memeriksa status daemon:

      systemctl status crio
      

  2. Instalasi dan aktivasi 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 dapat menginstal Kubernetes (versi 1.18, seperti disebutkan di atas):

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

    • Nuansa penting kedua: karena kita tidak menggunakan daemon Buruh pelabuhan, tapi kami menggunakan daemon CRI-O, sebelum peluncuran dan inisialisasi Kubernetes Anda perlu membuat pengaturan yang sesuai di file konfigurasi /var/lib/kubelet/config.yaml, setelah terlebih dahulu membuat direktori yang diinginkan:
      mkdir /var/lib/kubelet
      
      cat <<EOF > /var/lib/kubelet/config.yaml
      apiVersion: kubelet.config.k8s.io/v1beta1
      kind: KubeletConfiguration
      cgroupDriver: systemd
      EOF

    • Poin penting ketiga yang kami temui selama instalasi: meskipun kami telah menunjukkan driver yang digunakan grup c, dan konfigurasinya melalui argumen yang disampaikan kubus sudah usang (seperti yang dinyatakan secara eksplisit dalam dokumentasi), kita perlu menambahkan argumen ke file tersebut, jika tidak, cluster kita tidak akan diinisialisasi:
      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 dapat mengaktifkan daemonnya kubus:
      sudo systemctl enable --now kubelet
      

      Untuk menyesuaikan bidang kendali ΠΈΠ»ΠΈ pekerja node dalam hitungan menit, Anda dapat menggunakan dengan skrip ini.

  3. Saatnya menginisialisasi cluster kita.
    • Untuk menginisialisasi cluster, jalankan perintah:
      kubeadm init --pod-network-cidr=10.244.0.0/16
      

      Pastikan untuk menuliskan perintah untuk bergabung dengan cluster β€œkubeadm join…”, yang akan diminta untuk Anda gunakan di akhir output, atau setidaknya token yang ditentukan.

    • Mari kita instal plugin (CNI) untuk jaringan Pod. Saya sarankan menggunakan Belacu. Mungkin lebih populer Flanel memiliki masalah kompatibilitas dengan nftables, ya dan Belacu - satu-satunya penerapan CNI yang direkomendasikan dan diuji sepenuhnya oleh proyek Kubernetes:
      kubectl --kubeconfig /etc/kubernetes/admin.conf apply -f https://docs.projectcalico.org/v3.15/manifests/calico.yaml 

    • Untuk menghubungkan node pekerja ke cluster kami, Anda perlu mengkonfigurasinya sesuai dengan instruksi 1 dan 2, atau gunakan naskah, lalu jalankan perintah dari output β€œkubeadm init…” yang telah kita tulis di langkah sebelumnya:
      kubeadm join $CONTROL_PLANE_ADDRESS:6443 --token $TOKEN 
          --discovery-token-ca-cert-hash $TOKEN_HASH

    • Mari kita periksa apakah cluster kita telah diinisialisasi dan mulai bekerja:
      kubectl --kubeconfig=/etc/kubernetes/admin.conf get pods -A
      

    Siap! Anda sudah dapat menghosting payload di kluster K8s Anda.

Apa yang menanti kita di depan

Saya harap petunjuk di atas membantu menghemat waktu dan kegelisahan 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 apa yang akan dihasilkan oleh inisiatif OCI dalam beberapa tahun ke depan, namun kami akan menyaksikannya dengan senang hati. Anda dapat membagikan pendapat Anda sekarang di komentar.

Tetap disini!

Artikel ini muncul berkat sumber-sumber berikut:



Sumber: www.habr.com

Tambah komentar