Anatomi kluster Kubernetes rumah saya

Setahun yang lalu, saya menyadari bahwa saya ingin membuat kluster Kubernet saya sendiri. Saya seorang pengembang perangkat lunak. Biasanya saya menggunakan cluster lokal node tunggal atau menggunakan cluster multi-node jarak jauh untuk menguji proyek saya. Ketika bekerja dengan satu-node cluster, saya biasanya mengandalkan Minikube , walaupun ada solusi lain, seperti proyek Kind , yang dapat meniru keberadaan beberapa node dalam sebuah cluster. Dukungan untuk banyak node dapat muncul di Minikube.

Jadi, saya ingin memiliki kemampuan dari kedua lingkungan di atas. Itu - sehingga saya akan memiliki sebuah cluster yang terdiri dari beberapa node, dan agar bekerja dengan cluster ini tidak akan menyiratkan keterlambatan jaringan yang khas untuk berinteraksi dengan lingkungan yang jauh. Banyak tutorial hebat telah ditulis tentang membangun cluster multi-simpul Kubernetes menggunakan komputer papan tunggal . Banyak dari manual ini menggunakan Raspberry Pi sebagai SBC. Melihat ini, saya memutuskan untuk mengikuti jalan yang paling tidak resistan dan juga memilih komputer ini. Platform Raspberry Pi telah menempatkan dirinya sebagai solusi yang murah dan terjangkau.





Perlu dicatat bahwa pilihan platform ini menyediakan beberapa kompromi. Misalnya, Broadcom dan Yayasan Raspberry Pi tidak melisensikan ekstensi kriptografi ARMv8 (ini diperlukan untuk akselerasi perangkat keras dukungan AES). Solusi kontroversial lain adalah penggunaan kartu microSD dalam bentuk media penyimpanan standar dari mana sistem operasi dimuat.

Menganalisis pedoman yang ada untuk membuat cluster pada komputer papan tunggal, saya tidak menemukan satu pun yang menggambarkan solusi yang memenuhi persyaratan saya. Saya akan memulai cerita tentang cluster yang saya buat dengan mereka.

Persyaratan


  • Cluster harus ditutup dalam rumah yang terpisah, yang dapat dengan mudah dipindahkan, dibuka dan dipelihara, bekerja dengan modul sistem yang terpisah;
  • , . , , . , . , .
  • , .
  • , , , .

Di balik persyaratan ini, ada satu tujuan yang tidak jelas, yaitu bahwa saya membutuhkan anak perempuan saya yang berusia empat tahun untuk bekerja dengan kluster. Saya berharap bahwa dia akan menjadi semacam panduan belajar yang akan membantunya mengenal komputer, cangkang perintah, dan terminal.

Aksesoris


DetailSumber
Pico 5 Raspberry PI 5S Starter Kitpicocluster.com
Komputer Papan Tunggal: 2 Raspberry Pi 4B (4GB) 3 Raspberry Pi 3B +
5 kartu microSD 32GB kelas 10 / A1 raspberrypi.org
Kabel Ethernet: 2 0,25 juta kucing. 83 0,15 juta kucing. 7, S / FTP1attack.de
Kabel USB PortaPow 20AWG2 kabel USB-C3 kabel micro-USBportablepowersupplies.co.uk
Resmi Raspberry Pi 7 ″ Layar Sentuhraspberrypi.org
Catu daya Dehner Elektronik STD-12090 12V / DC 9A 108Wdehner.net
Konverter DC-Buck 12V ke 5V 15Adroking.com
Heschen 12V 25A SPST 2-Pin ON/OFFheschen.com
Noctua NF-A4x20 5V PWMnoctua.at
, (15A, 30V) 4 , MOSFET PSMN011-30YLCebay.com
2 M.2 NVMe USB 3.0, JMS58amazon.com
2 Samsung SSD 970 EVO Plus M.2 PCIe NVMe 500 Go
2 USB 3.0 ( , ) 6″/152mmusbfirewire.com
2 USB 3.0- Delock, Male-Female ( 270°)delock.com
Adafruit Raspberry Pi 24″/610mmadafruit.com
Adafruit (DSI CSI) Raspberry Pi adafruit.com
Wago 221wago.com
Lapp Unitronic 300mm/1200mm 2x0.14mm²lappgroup.com
Lemo FGG.0B.302.CLAD42 EGG.0B.302.CLLlemo.com
DuPont Female-Female

Kasing PicoCluster berukuran kecil dan sangat mudah digunakan. Dari starter kit yang saya pesan, saya hanya menggunakan sasis, termasuk kait dan rak, serta sakelar Gigabit Ethernet 8-port.

Sekarang saya mengerti bahwa akan lebih baik jika PicoCluster menjual versi kitnya tanpa komponen listrik. Alternatif lain untuk kit ini adalah pengembangan kandangnya sendiri. Ini, bagaimanapun, akan membutuhkan lebih banyak waktu. Saya harus membuat gambar vektor, saya harus menggunakan layanan pemotongan laser di perusahaan yang menawarkan lembaran akrilik, idealnya lembaran dengan lapisan yang menghilangkan pelepasan muatan listrik statis.

Selama bekerja, saya menemukan peringatan tentang tegangan yang tidak memadaidan menemukan bahwa masalah itu disebabkan oleh kabel micro-USB yang menyertai kasus ini. Selain itu, bersama dengan kasingnya ada konverter DC-DC 12V ke 5V, 30W, yang saya ganti dengan yang lebih kuat. Saya melakukan ini karena alasan yang akan saya bahas di bawah pada bagian tentang menyalakan sistem.

Pada saat saya mulai mengerjakan proyek ini, saya tidak berencana untuk menggunakan papan Raspberry Pi 4 yang dirilis pada 2019. Ini menjelaskan bahwa saya masih memiliki tiga papan Raspberry Pi 3 yang bertindak sebagai simpul kerja. Saya menukar dua papan lain seperti untuk Raspberry Pi 4. Mereka digunakan untuk node yang membutuhkan lebih banyak sumber daya. Ini adalah simpul utama dan simpul yang berfungsi, yang antara lain digunakan untuk membuat cadangan data.

Tak lama setelah rilis Raspberry Pi 4, PicoCluster meluncurkan sasis baru yang dirancang khusus untuk papan tersebut. Ini termasuk catu daya yang kuat, dua kipas dan saklar daya. Benar, case ini lebih besar dari milik saya, dan para penggemar pasti akan menjadi lebih keras daripada Noctua NF-A4x20. Kecepatan putaran kipas ini dapat dikontrol menggunakan modulasi lebar-pulsa (PWM), dengan mempertimbangkan hasil pengukuran suhu yang dilakukan pada papan.

Perlu dicatat bahwa Broadcom BCM2837 SoC (Raspberry Pi 3) dan BCM2711 SoC BCM2711 (Raspberry Pi 4) memiliki pengatur waktu perangkat keras yang mampu menghasilkan sinyal PWM. Sebagai hasilnya, sangat mudah untuk mengeluarkan sinyal input kontroldiharapkan oleh Noctua NF-A4x20 PWM tanpa membebani prosesor. Selain itu, kipas hampir tidak terdengar ketika berjalan pada setengah kecepatan yang didukungnya (sekitar 2500 rpm). Ini, ternyata, cukup untuk mempertahankan suhu sistem di bawah 45 ° C / 113 ° F di bawah beban normal.

Enklosur baru mencakup catu daya terintegrasi. Lagi pula, dia lebih mahal daripada yang saya pilih. Semua fitur dari case ini adalah alasan bahwa saya akan memilih kit Pico 5S bahkan jika saya membeli case sekarang. Lebih banyak upaya harus dimasukkan ke dalam mengingatnya, tetapi apa yang ternyata pada akhirnya tampak lebih baik daripada apa yang akan terjadi, jika saya memilih bangunan yang berbeda. Secara umum, itu sepadan dengan usaha dan waktu.

Majelis


▍ Panel depan



Panel

depan Panel depan memiliki celah untuk mengakses kartu microSD. Ini nyaman, bahkan mengingat fakta bahwa saya berencana untuk mengatur boot sistem menggunakan booting penyimpanan massal USB . Saya berencana melakukan ini setelah Raspberry Pi 4 sepenuhnya mendukung mode boot ini. Lubang juga membantu mengatur sirkulasi udara di perumahan. Dalam hal ini, dua drive SSD berada tepat di depan kipas, yang membantu menjaga suhu pengoperasian optimal.

Indikator aktivitas dan daya papan terlihat jelas, yang memungkinkan Anda untuk menilai keadaan cluster secara sekilas. Indikator aktivitas sakelar Ethernet juga terlihat.


Panel atas kasing tanpa layar

Layar dapat dengan mudah dipindahkan untuk mendekatkannya ke keyboard, atau untuk menyediakan akses ke panel atas saat membuka kasing.

▍ Panel kiri



Panel kiri

Pada panel kiri kasing adalah port GPIO papan. Salah satu kabel menghubungkan unit utama dengan kipas - untuk pengaturan kontrol PWM untuk kecepatan putarannya. Kabel lain menghubungkan simpul utama ke modul papan sirkuit, yang digunakan untuk menghidupkan dan mematikan simpul kerja. Empat kabel menghubungkan masing-masing simpul yang berfungsi ke simpul utama. Ini menggunakan pin GPIO dengan tingkat aktif tinggi ketika dimatikan. Ini memungkinkan simpul utama untuk mematikan daya dari simpul yang bekerja dengan aman setelah urutan tindakan yang dilakukan pada akhir operasinya selesai.


Modul yang digunakan untuk menghubungkan kipas ke simpul utama

Di sudut kiri atas terdapat modul kecil yang dirancang untuk menghubungkan konektor kipas Noctua 4-pin ke simpul utama Raspberry Pi. Konektor GPIO yang sesuai, berkat dukungan perangkat keras untuk menghasilkan sinyal PWM, dikonfigurasikan untuk mengontrol kecepatan kipas. Kecepatan dipilih berdasarkan analisis suhu papan, informasi tentang yang dikumpulkan secara teratur menggunakan SSH. Unit utama, selain itu, untuk tujuan pemantauan, membaca kecepatan kipas.

▍ panel belakang



Panel Belakang Panel

belakang sasis menyembunyikan kabel. Fakta bahwa segala sesuatu tampak seperti itu dapat dianggap sebagai konsekuensi dari pendekatan yang licik terhadap organisasi modular proyek saya. Sulit menemukan kabel yang berkualitas. Terutama - kabel USB 3.0 pendek dengan colokan melengkung. Kabel - ini adalah kelompok elemen bergerak terbesar di sistem saya, mereka harus memenuhi karakteristik mekanik dan listrik tertentu. Mereka ternyata menjadi sumber masalah utama.

Saya punya ide untuk menggunakan kabel spiral tunggal untuk menggantinya dengan kabel pita DSI, dengan layar yang terhubung ke sistem. Kemudian kabel spiral akan menghubungkan layar ke cluster dan memasok daya ke sana. Tetapi saya tidak dapat menemukan konektor DSI yang cocok. Saya menahan diri dari usaha ini dan fakta bahwa saya tidak tertarik dengan prospek menyolder 17 kabel berukuran 0,14mm². Saya menggunakan extender kabel DSI dan menerapkan kabel power micro-USB spiral 2-kawat. Ini memberi saya kemampuan untuk dengan mudah bergerak dan mematikan layar tanpa membuka kasing.


Upaya yang gagal untuk mengatur kabel

Berikut adalah upaya yang gagal untuk menggunakan sistem untuk mengatur masuknya kabel ke dalam penutup yang dirancang untuk kabel ekspansi USB 3.0. Meskipun banyak upaya untuk merutekan kabel dengan benar, saya secara sistematis mengalami kesalahan I / O selama transfer data. Mereka mungkin disebabkan oleh fakta bahwa mereka terlalu panjang ketika meletakkan kabel, atau oleh fakta bahwa ini mengganggu koneksi kabel yang andal ke konektor.

▍ Panel kanan



Panel kanan

Di sisi kanan kasing Anda dapat melihat sakelar Ethernet 8-port.

Desain sistem


▍ Makanan



Kasus dengan panel depan terbuka

saya harus memutuskan catu daya mana yang akan digunakan. Secara khusus, tentang apa daya dalam watt itu harus mendukung untuk memenuhi kebutuhan cluster. Ini adalah sedikit pertanyaan tentang apa yang terjadi sebelumnya - ayam atau telur, karena pengukuran tidak dapat dilakukan sebelum daya diterapkan ke cluster.

Untuk mendapatkan perkiraan perkiraan daya, saya beralih ke dokumentasi resmi , yang berisi beberapa informasi tentang kekuatan Raspberry Pi, serta spesifikasi komponen lainnya. Ini memberi saya angka perkiraan berikut berdasarkan konsumsi energi rata-rata.


Tetapi apa yang terjadi setelah memperhitungkan nilai maksimum konsumsi energi dari dokumentasi.


Ini jauh lebih tinggi daripada daya yang disediakan oleh catu daya yang saya dapat temukan yang menghasilkan 5V, karena komponen "daya rendah" memerlukan arus 10A. Ini mengesampingkan opsi menggunakan catu daya 5V tunggal. Pada saat yang sama, catu daya 12V sangat umum, yang dapat memberikan tingkat daya yang diperlukan. Akibatnya, saya memilih catu daya Dehner Elektronik STD-12090 12V / DC 9A 108W dan menghubungkannya dengan konverter DC / DC 12V ke 5V 75W.

Di sini saya punya pilihan lain, yang terdiri dari menggunakan lima konverter yang kurang kuat - satu untuk setiap papan Raspberry Pi, tetapi ini akan sangat menyulitkan desain cluster.


Patch board Papan patch

4-pin berdasarkan MOSFET PSMN011-30YLC dipasang di bagian bawah sasis. Ini digunakan untuk mengaktifkan dan menonaktifkan simpul kerja. Ini diberi label 15A, 30V, sehingga dapat mengatasi dengan baik bahkan dengan beban yang dibuat oleh empat Raspberry Pi.

Saya mengukur rata-rata dan daya maksimum yang dikonsumsi oleh cluster. Hasil pengukuran kira-kira konsisten dengan perkiraan perhitungan yang saya buat sebelumnya. Perbedaan antara nilai yang diharapkan dan nilai sebenarnya dapat dijelaskan oleh fitur konfigurasi sistem dan fitur tes. Secara khusus, saya mematikan Wi-Fi dan Bluetooth pada Raspberry Pi saya, mereka juga berfungsi tanpa menampilkan gambar pada monitor. Ini mungkin menjelaskan fakta bahwa pada kenyataannya nilai-nilai itu ternyata kurang.

Ternyata, catu daya 108W jauh lebih kuat daripada apa yang dibutuhkan untuk cluster. Namun, fakta bahwa saya hanya memiliki catu daya seperti itu berarti saya dapat memperluas kemampuan sistem. Misalnya, ganti Raspberry Pi 3 dengan Raspberry Pi 4.

▍ Penyimpanan data


Salah satu fitur bagus baru dari Raspberry Pi 4 adalah kehadiran di papan dua port USB 3.0 yang terhubung ke BCM2711 SoC menggunakan koneksi PCIe yang sangat cepat. Berkat ini, orang dapat berharap untuk mencapai kecepatan data yang sangat tinggi. Saya memutuskan bahwa saya menggunakan port USB 3.0 ini untuk menghubungkan SSD menggunakan M.2 NVMe ke USB 3.0 adapter. Namun, ternyata, sangat sulit untuk menemukan adapter seperti itu. Saya dengan naif menyarankan bahwa adaptor apa pun akan bekerja untuk saya. Sebagai hasilnya, saya membeli adaptor seperti pertama tanpa memeriksa kompatibilitasnya dengan Raspberry Pi 4.

Saya, untungnya, menemukan iniPanduan unduhan Raspberry Pi 4 dan kemudian membeli adaptor Shinestar M.2 NVMe yang disarankan untuk USB 3.0. Ukurannya hampir sama dengan M.2 NVMe 2280 (lebar 22 mm dan panjang 80 mm), yang sangat bagus untuk kasing Pico 5S. Saya menggunakan adaptor untuk menghubungkan Samsung SSD 970 EVO Plus M.2 PCIe NVMe 500 Go ke Raspberry Pi.


M.2 NVMe adapter to USB 3.0

Setelah saya menginstal dan mengkonfigurasi semuanya, saya memutuskan untuk dengan cepat menguji drive dan mencari tahu kecepatan transfer data. Untuk melakukan ini, saya menyalin file besar dari SSD ke laptop saya menggunakanscp:

$ scp pi@master:<source> <destination>
100% 1181MB 39.0MB/s 00:30


Hasil 39 Mb / s mengecewakan saya. Angka-angka ini jauh dari yang dibutuhkan untuk memuat switch Ethernet Gigabit sepenuhnya. Saya mulai mencari kemungkinan kemacetan dalam sistem, dan menyadari bahwa selama transfer file salah satu inti prosesor selalu 100% dimuat. Setelah saya mengetahui bahwa prosesor tersebut adalah hambatan dalam transfer data, saya segera mengetahui bahwa Raspberry Pi 4 tidak memiliki dukungan perangkat keras AES, karena Broadcom dan Yayasan Raspberry Pi tidak memberi lisensi ekstensi kriptografi ARMv8. Menariknya, prosesor adalah hambatan dari sistem pada Raspberry Pi 4, sedangkan hambatan dari Raspberry Pi 3 adalah USB 2.0 dan antarmuka jaringan.

Pengujian baru menggunakan netcat, dalam kondisi yang sama, memberikan hasil yang jauh lebih baik pada 104 Mb / s:

$ nc -l 6000 |dd bs=1m of=<destination> & ssh pi@master "dd bs=1M if=<source> | nc -q 0 $(hostname -I | awk '{print $1}') 6000"
[1] 71300 71301
1181+1 records in
1181+1 records out
1238558304 bytes (1.2 GB, 1.2 GiB) copied, 11.8632 s, 104 MB/s
0+740624 records in
0+740624 records out
1238558304 bytes transferred in 14.212518 secs (87145593 bytes/sec)
[1]  + 71300 done       nc -l 6000 |
       71301 done       dd bs=1m of=<destination>

Setelah berurusan dengan drive SSD pertama, saya menghubungkan drive yang sama kedua ke board Raspberry Pi 4. Saya akan menggunakan drive ini untuk membuat cadangan drive pertama menggunakan sesuatu seperti Restic .

Selain itu, saya berencana untuk menggunakan SSD untuk mengatur boot menggunakan booting penyimpanan massal USB segera setelah Raspberry Pi 4 sepenuhnya mendukung metode boot ini. Dibandingkan dengan mengunduh dari microSD, menjanjikan kecepatan yang lebih tinggi dan tingkat kinerja yang lebih stabil.

Perangkat lunak


Saya seorang programmer, jadi saya pikir akan lebih mudah bagi saya untuk berurusan dengan bagian perangkat lunak cluster daripada dengan pertanyaan lain. Hasil dari pekerjaan luar biasa pada k3 yang dilakukan oleh tim Rancher pasti membantu saya di sini . Saya tidak akan masuk ke detail khusus tentang pengaturan cluster Kubernetes pada Raspberry Pi menggunakan k3s di sini. Bagi mereka yang tertarik, saya dapat merekomendasikan merujuk pada panduan ini . Berikut adalah poin utama untuk mengkonfigurasi yang ingin saya bahas.

Untuk memulai, pada setiap node, aktifkan cgroups:

$ sudo sed -i '$ s/$/ cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory/' /boot/cmdline.txt
$ sudo reboot

Kemudian instal k3 pada node utama:

$ curl -sfL https://get.k3s.io | sh -s - --write-kubeconfig-mode 644
#   
$ sudo systemctl status k3s

Sekarang kita mendapatkan token yang mengesahkan koneksi node kerja ke node utama:

$ sudo cat /var/lib/rancher/k3s/server/node-token

Berikutnya - instal k3 pada setiap node yang berfungsi:

$ curl -sfL https://get.k3s.io | K3S_URL="https://<MASTER_IP>:6443" K3S_TOKEN="<NODE_TOKEN>" sh -
#   
$ sudo systemctl status k3s-agent

Jika Anda berencana untuk menggunakan registri internal gambar kontainer, yang diinstal secara default, Anda mungkin perlu mengkonfigurasinya dengan cara khusus, melakukan ini untuk memungkinkan containerdgambar diambil dari itu:

$ sudo sh -c 'REGISTRY=$(kubectl get svc -n kube-system registry -o jsonpath={.spec.clusterIP}); \
cat <<EOT >> /etc/rancher/k3s/registries.yaml
mirrors:
  "$REGISTRY":
    endpoint:
      - "http://$REGISTRY"
EOT'
$ sudo service k3s restart

Rencana masa depan


Dalam materi ini, saya tidak mengungkapkan beberapa topik penting yang layak untuk dianalisis secara mendalam. Misalnya, berikut ini:

  • Manajemen daya perangkat lunak node kerja dan penskalaan klaster otomatis .
  • Memasang kipas PWM dan menyesuaikan kecepatannya dengan mempertimbangkan indikator suhu sistem.
  • Instal Pi-Hole di Kubernetes menggunakan MetalLB .

Mungkin saya akan menulis lebih banyak tentang ini.

Selain itu, saya berencana untuk terus bekerja pada cluster dengan melakukan hal berikut:


Saya yakin bahwa ketika saya berbicara tentang pengalaman saya dalam membuat cluster rumah Kubernetes, saya banyak lupa. Saya seorang programmer dan terbiasa dengan pemecahan tugas-tugas besar yang agak heterogen menjadi kasus yang lebih kecil. Pengalaman telah menunjukkan bahwa perangkat keras jauh lebih toleran daripada perangkat lunak ketika datang ke pekerjaan trial and error.

Secara umum, semakin saya tahu, kekaguman yang lebih besar pada saya disebabkan oleh teknologi perangkat keras dan perangkat lunak modern. Ini mengejutkan saya bagaimana kecerdikan seseorang mampu menggabungkan fenomena listrik dan bahasa pemrograman, menjadikannya sesuatu yang dapat dianggap sebagai contoh bagaimana kesadaran mengendalikan masalah.

Pembaca yang budiman! Sudahkah Anda mencoba melakukan sesuatu yang mirip dengan yang dijelaskan oleh penulis artikel ini?


All Articles