Membuat klaster Kubernetes di Fedora

Bradley G Smith, Versi F37,F38,F39,F40,rawhide Last review: 2024-07-24

Halaman ini membahas sumber perangkat lunak pihak ketiga yang tidak secara resmi berafiliasi atau didukung oleh Proyek Fedora. Gunakan sumber-sumber ini dengan pertimbangan Anda sendiri. Fedora merekomendasikan penggunaan perangkat lunak bebas dan sumber terbuka serta menghindari perangkat lunak yang terikat oleh paten.

Membuat klaster Kubernetes dengan kubeadm

Di bawah ini adalah panduan untuk membuat klaster Kubernetes yang berfungsi di satu mesin Fedora yang cocok untuk lingkungan pembelajaran dan eksplorasi. Panduan ini tidak dimaksudkan untuk membuat lingkungan produksi.

Panduan di bawah ini secara umum mengikuti dan banyak mengacu pada panduan Membuat klaster dengan kubeadm yang dibuat oleh tim Kubernetes.

Fedora 41 memiliki rpm Kubernetes dengan versi tertentu maupun tanpa versi (v1.29). Kubernetes 1.29 tidak lagi didukung oleh komunitas Kubernetes.

  1. Perbarui sistem dengan DNF. Lakukan reboot jika diperlukan, meskipun reboot dapat ditunda hingga setelah langkah berikutnya.

    sudo dnf update
  2. Nonaktifkan swap. Proses instalasi kubeadm akan menghasilkan peringatan jika swap terdeteksi (lihat tiket ini untuk detailnya). Untuk lingkungan belajar dan laboratorium, menonaktifkan swap bisa menjadi pilihan termudah. Swap dapat dibiarkan aktif jika diinginkan dan kubeadm dikonfigurasi agar tidak berhenti saat mendeteksi swap. Sistem Fedora modern menggunakan zram secara bawaan. Lakukan reboot setelah menonaktifkan swap.

    sudo systemctl stop swap-create@zram0
    sudo dnf remove zram-generator-defaults
    sudo reboot now
  3. SELinux. Sebagian besar panduan instalasi Kubernetes di Fedora menyarankan agar SELinux dinonaktifkan. Kubernetes tetap dapat berfungsi dengan baik saat SELinux diaktifkan dan banyak container juga akan berjalan sebagaimana mestinya. Jika muncul masalah, menonaktifkan SELinux bisa menjadi salah satu opsi untuk dicoba. Lihat panduan Quick Doc SELinux tentang mengubah status SELinux untuk informasi lebih lanjut.

  4. Nonaktifkan firewall. Kubeadm akan menampilkan peringatan instalasi jika firewall sedang berjalan. Menonaktifkan firewall menghilangkan salah satu sumber kompleksitas di lingkungan pembelajaran. Sistem Fedora modern menggunakan firewalld.

    sudo systemctl disable --now firewalld

    Lihat bagian Aturan Firewall dalam artikel Roman Gherta Kubernetes dengan CRI-O di Fedora 39 untuk cara yang tepat mengonfigurasi firewall Fedora agar dapat bekerja dengan Kubernetes.

    Daftar terkini port dan protokol yang digunakan oleh klaster Kubernetes dapat ditemukan di https://kubernetes.io/docs/reference/networking/ports-and-protocols/.

  5. Instal iptables dan iproute-tc. Paket-paket ini sudah termasuk dalam rpm Kubernetes versi terbaru.

    sudo dnf install iptables iproute-tc
  6. Konfigurasikan penerusan IPv4 dan filter jembatan. Bagian di bawah ini disalin dari https://kubernetes.io/docs/setup/production-environment/container-runtimes/.

    sudo cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
    overlay
    br_netfilter
    EOF
  7. Muat modul overlay dan filter jembatan.

    sudo modprobe overlay
    sudo modprobe br_netfilter
  8. Tambahkan parameter sysctl yang diperlukan dan buat agar tetap tersimpan.

    # sysctl params required by setup, params persist across reboots
    sudo cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
    net.bridge.bridge-nf-call-iptables  = 1
    net.bridge.bridge-nf-call-ip6tables = 1
    net.ipv4.ip_forward                 = 1
    EOF
  9. Terapkan parameter sysctl tanpa melakukan reboot.

    sudo sysctl --system
  10. Verifikasi bahwa modul br_filter dan overlay telah dimuat.

    lsmod | grep br_netfilter
    lsmod | grep overlay
  11. Verifikasi bahwa variabel sistem net.bridge.bridge-nf-call-iptables, net.bridge.bridge-nf-call-ip6tables, dan net.ipv4.ip_forward disetel ke 1 dalam konfigurasi sysctl Anda dengan menjalankan perintah berikut:

    sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables net.ipv4.ip_forward
  12. Instal container runtime. Dalam contoh ini digunakan CRI-O. Containerd juga bisa menjadi pilihan. Catatan: Jika menggunakan CRI-O, pastikan versi mayor:minor dari cri-o sama dengan versi Kubernetes (yang akan diinstal di bawah). Rpm CRI-O memiliki versi yang mengikuti versi Kubernetes. Instal versi CRI-O yang sesuai dengan versi Kubernetes yang dituju.

    sudo dnf install cri-o1.31 containernetworking-plugins
  13. Periksa versi Kubernetes yang tersedia. Jika tidak yakin dengan versi Kubernetes apa saja yang saat ini tersedia di Fedora 41 atau lebih baru, perintah berikut dapat membantu. Dalam contoh di bawah, rpm versi Kubernetes 1.29, 1.30, 1.31, dan 1.32 tersedia di Fedora 41. Informasi terkini mengenai rilis yang didukung dan tanggal akhir siklus hidupnya dapat ditemukan di halaman Riwayat Rilis yang dikelola oleh tim Kubernetes.

    sudo dnf list kubernetes1.??

    Keluaran akan terlihat seperti ini:

    > sudo dnf list kubernetes1.??
    Updating and loading repositories:
    Repositories loaded.
    Available packages
    kubernetes1.29.x86_64 1.29.11-2.fc41 updates
    kubernetes1.30.x86_64 1.30.7-1.fc41  updates
    kubernetes1.31.x86_64 1.31.3-1.fc41  updates
    kubernetes1.32.x86_64 1.32.0-1.fc41  updates
  14. Instal Kubernetes. Dalam contoh ini, ketiga aplikasi Kubernetes (kubectl, kubelet, dan kubeadm) diinstal pada satu mesin node tunggal. Silakan lihat catatan di atas mengenai paket yang direkomendasikan untuk node control plane atau worker jika klaster akan memiliki kedua jenis mesin tersebut.

    sudo dnf install kubernetes1.31 kubernetes1.31-kubeadm kubernetes1.31-client
  15. Mulai dan aktifkan cri-o.

    sudo systemctl enable --now crio
  16. Tarik image container sistem yang diperlukan untuk Kubernetes. Langkah ini sepenuhnya opsional. Perintah kubeadm init

    sudo kubeadm config images pull
  17. Mulai dan aktifkan kubelet. Kubelet akan masuk ke mode crash loop hingga klaster diinisialisasi pada langkah berikutnya.

    sudo systemctl enable --now kubelet
  18. Inisialisasi klaster.

    sudo kubeadm init --pod-network-cidr=10.244.0.0/16
  19. kubeadm akan menampilkan keluaran di terminal yang menunjukkan langkah-langkah inisialisasi. Jika berhasil, keluaran berikut akan muncul. Pada tahap ini, klaster sudah berjalan di mesin tunggal ini. Setelah kubeadm selesai, Anda akan melihat:

    Kubernetes control-plane Anda telah berhasil diinisialisasi!
    
    Untuk mulai menggunakan klaster Anda, jalankan perintah berikut sebagai pengguna biasa:
    
      mkdir -p $HOME/.kube
      sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
      sudo chown $(id -u):$(id -g) $HOME/.kube/config
    
    Sebagai alternatif, jika Anda adalah pengguna root, jalankan perintah berikut:
    
      export KUBECONFIG=/etc/kubernetes/admin.conf
  20. Langkah-langkah di atas memungkinkan pengguna non-root untuk menggunakan kubectl, alat baris perintah Kubernetes. Jalankan perintah-perintah tersebut sekarang.

    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config
  21. Izinkan mesin control plane juga menjalankan pod untuk aplikasi. Jika tidak, dibutuhkan lebih dari satu mesin dalam klaster.

    kubectl taint nodes --all node-role.kubernetes.io/control-plane-
  22. Instal flannel ke dalam klaster untuk menyediakan jaringan antar node. Ada banyak solusi jaringan lain selain flannel. Flannel sederhana dan cocok untuk panduan ini.

    kubectl apply -f https://github.com/coreos/flannel/raw/master/Documentation/kube-flannel.yml
  23. Tampilkan daftar pod yang sedang berjalan di klaster. Semua pod seharusnya menunjukkan status Running. Status CrashLoopBackOff mungkin muncul untuk pod coredns. Hal ini umum terjadi saat menginstal Kubernetes di mesin virtual karena layanan DNS dalam klaster mungkin tidak memilih jaringan yang tepat. Gunakan mesin pencari favorit Anda untuk menemukan kemungkinan solusinya. Lihat juga bagian pemecahan masalah di bawah untuk dua solusi yang memungkinkan.

    kubectl get pods --all-namespaces

Pada tahap ini, terdapat satu mesin dalam klaster yang menjalankan control plane dan siap digunakan sebagai node.

Peningkatan versi klaster Kubernetes memerlukan perhatian dan perencanaan. Lihat Meningkatkan klaster kubeadm untuk informasi lebih lanjut.

Plugin DNF Versionlock berguna untuk mencegah pembaruan tak terencana pada rpm Kubernetes. Terkadang, versi Kubernetes di rilis Fedora mencapai akhir masa dukungannya dan versi baru ditambahkan ke repositori. Atau, peningkatan versi Fedora pada mesin klaster juga akan menyebabkan perbedaan versi Kubernetes. Setelah DNF Versionlock terinstal, perintah berikut akan menahan rpm Kubernetes dan rpm cri-o pada versi mayor:minor 1.31 tetapi tetap mengizinkan pembaruan patch.

sudo dnf versionlock add kubernetes*-1.31.* cri-o-1.31.*

Pemecahan masalah CrashLoopBackOff

Tim CoreDNS menyediakan panduan untuk memecahkan masalah loop di klaster Kubernetes dengan beberapa opsi yang dapat membantu menyelesaikan masalah tersebut.

Opsi “cepat dan sederhana”, seperti yang dijelaskan oleh tim CoreDNS, adalah dengan mengedit configmap CoreDNS menggunakan kubectl. Dalam configmap, ganti forward . /etc/resolv.conf dengan alamat IP server DNS untuk jaringan Anda. Jika server DNS memiliki alamat IP 192.168.110.201, maka hasilnya akan menjadi forward . 192.168.110.201. Untuk mengedit configmap CoreDNS, gunakan perintah berikut:

kubectl edit configmap coredns -n kube-system

kubectl akan membuka editor sesuai dengan yang digunakan pada Fedora Anda. Secara default Fedora menggunakan nano yang dapat dengan mudah diubah.

Opsi lain adalah menonaktifkan sistem stub resolving systemd-resolved pada mesin yang menjalankan klaster dengan menggunakan kode di bawah ini. Terima kasih kepada @jasonbrooks (https://pagure.io/user/jasonbrooks) atas tinjauan dan sarannya.

sudo mkdir -p /etc/systemd/resolved.conf.d/
sudo cat <<EOF | sudo tee /etc/systemd/resolved.conf.d/stub-listener.conf
[Resolve]
DNSStubListener=no
EOF