Kubeadm: Kubeadm rusak di armv6l

Dibuat pada 23 Apr 2017  ·  21Komentar  ·  Sumber: kubernetes/kubeadm

Saya mencoba menginstal kubeadm di raspberry pi zero W saya, tetapi mendapatkan "Instruksi Ilegal"
Pada raspberry pi 3 (armv7) berfungsi dengan baik.

Komentar yang paling membantu

Apakah mungkin untuk membahas reintegrasi Dukungan armv6l. Saya menemukan banyak Postingan yang menunjukkan minat untuk menggunakan Kubernetes di Pi Zero dan Perangkat Pi armv6l lainnya. P Zero bagus untuk menghosting Layanan Mikro di Lingkungan Kubernetes atau Swarm Cluster. Docker Swarm bekerja dengan baik untuk saya. Jadi alangkah baiknya jika ada yang bisa mendaur ulang diskusi. Pi clusterhat adalah infrastruktur demo yang bagus.

Semua 21 komentar

Saya menghadapi masalah yang sama dengan kubeadm 1.6.1 pada Raspberry Pi Model B+, juga armv6.

$ kubelet --help
Illegal instruction

$ uname -a
Linux pi1 4.4.50-hypriotos+ #2 PREEMPT Sun Mar 19 14:44:01 UTC 2017 armv6l GNU/Linux

Saya menurunkan versi ke kubeadm 1.5.6 dan berhasil. 1.6.0 memberikan kesalahan yang sama seperti 1.6.1.

@clabu ya menurunkan versi ke 1.5.6 berfungsi tetapi tidak dapat bergabung dengan klaster 1.6+.

Pertama, terima kasih telah menggunakan Kubernetes di ARM :smile:!

Ini adalah masalah yang diketahui; itu dibahas di https://github.com/kubernetes/kubernetes/issues/38067 dan kami menjatuhkan dukungan armel (bagian mana dari RPi 1 yang digunakan saat kompilasi silang).

Pada dasarnya armhf (GOARM=7) tidak dapat berjalan di Pi 1, jadi kami menggunakan armel dengan GOARM=6 di -v1.5 untuk mendukung RPi 1. Namun, kami menggunakan semua armhf di v1.6, karenanya tidak berfungsi Pi 1.

Hapus armel dan gunakan gambar armhf sebagai gantinya dan gunakan GOARM=7 alih-alih GOARM=6
Motivasi:

  • Satu-satunya board GOARM=6 yang didukung Go di go1.8 adalah Raspberry Pi 1 yang terlalu lambat untuk menjalankan versi Kubernetes yang lebih baru.
  • Peningkatan kinerja kecil saat menggunakan GOARM=7
  • Gambar armel (http://hub.docker.com/u/armel) tidak diperbarui sesering gambar armhf (http://hub.docker.com/u/armhf).

Misalnya, https://hub.docker.com/r/armel/debian/ telah diperbarui 8 bulan lalu yang sangat buruk dari sudut pandang keamanan, vs https://hub.docker.com/r/armhf/debian/ yang diperbarui 3 hari yang lalu.

Juga, dengan sakelar armhf, kami dapat menggunakan https://hub.docker.com/r/armhf/alpine , yang sangat bagus.

Semoga membantu, tapi maaf karena tidak dapat mendukung RPi 1 lagi.

Jika Anda ingin membantu mendokumentasikannya/menyebarkan berita, silakan lakukan atau datang dengan saran

Saya mengalami masalah yang sama pada Pi Zero

Linux p1 4.9.59+ #1047 Sun Oct 29 11:47:10 GMT 2017 armv6l GNU/Linux

Apakah mungkin untuk membahas reintegrasi Dukungan armv6l. Saya menemukan banyak Postingan yang menunjukkan minat untuk menggunakan Kubernetes di Pi Zero dan Perangkat Pi armv6l lainnya. P Zero bagus untuk menghosting Layanan Mikro di Lingkungan Kubernetes atau Swarm Cluster. Docker Swarm bekerja dengan baik untuk saya. Jadi alangkah baiknya jika ada yang bisa mendaur ulang diskusi. Pi clusterhat adalah infrastruktur demo yang bagus.

Melihat build docker.io saat ini untuk pi zero,
Pergi versi: go1.9.3
dan versi buruh pelabuhan: 18.02.0-ce

Tampaknya menggunakan versi terbaru dari go.

Saya setuju bahwa tidak ada cukup ram untuk menggunakan k8s di dalamnya dalam mode mandiri, tetapi karena itu menjadi budak pada master yang lebih besar, itu harus memiliki sumber daya yang cukup untuk melakukan beberapa hal yang berguna masih.

Adakah yang tahu apakah mungkin hanya membangun dari sumber untuk menggunakan nol pi saya sebagai simpul k8s?

Misalnya, https://hub.docker.com/r/armel/debian/ telah diperbarui 8 bulan lalu yang sangat buruk dari sudut pandang keamanan, vs https://hub.docker.com/r/armhf/debian/ yang diperbarui 3 hari yang lalu.

Ini tidak benar hari ini karena gambar resmi pada arsitektur yang berbeda diperbarui secara bersamaan. Misalnya https://hub.docker.com/r/arm32v5/debian/ , https://hub.docker.com/r/arm32v7/debian/ dan https://hub.docker.com/r/amd64/ debian/ semuanya diperbarui 9 hari yang lalu.

Juga, dengan sakelar armhf, kami dapat menggunakan https://hub.docker.com/r/armhf/alpine , yang sangat bagus.

https://hub.docker.com/r/arm32v6/alpine/ berjalan dengan baik di Pi Zero.

Saya harap Anda akan mempertimbangkannya kembali. Menghentikan Pi Zero dari menjalankan k8s terbaru sangat mengecewakan.

@luxas

+1. beberapa kebingungan telah terjadi karena hub diatur ulang dan repo yang lebih lama masih ada. Yang lebih baru tampaknya sering mendapatkan pembaruan.

Hai @juliancheal ,

Saya masih di tengah-tengah membangun k8s di ClusterHAT, tapi saya bisa mengkompilasi dan membangun binari untuk Pi Zero.

Pada dasarnya, saya telah mengikuti di bawah ini dengan beberapa modifikasi:
https://povilasv.me/raspberrypi-kubelet/

Saya bekerja di wsl:
Linux DESKTOP-6GRDDIN 4.4.0-17134-Microsoft #48-Microsoft Jum Apr 27 18:06:00 PST 2018 x86_64 x86_64 x86_64 GNU/Linux

1 instal gcc-arm-linux-gnueabi alih-alih gcc-arm-linux-gnueabihf

sudo apt-get install gcc-arm-linux-gnueabi <- ubah

2 sebelum membangun untuk linux/arm, buat dua modifikasi pada set_platform_envs() di hack/lib/golang.sh

* tambahkan GOARMekspor GOOS=${platform%/ }ekspor GOARCH=${platform## /}ekspor GOARM=5 <- tambahkan* ganti CC
kasus "${platform}" di
"linux/lengan")
ekspor CGO_ENABLED=1
ekspor CC=arm-linux-gnueabi-gcc <-ubah
;;

GOARM harus 5. Jika Anda menentukan 6, Anda akan mendapatkan kesalahan tautan selama pembuatan. (Yang tidak bisa saya selesaikan.)

@shinichi-hashitani Ini berfungsi untuk Pi Zero saya! Terima kasih!

Saya juga menyelesaikan masalah Anda pada kesalahan tautan. Untuk Pi Zero, setel GOARM=6 dan pertahankan gcc-arm-linux-gnueabihf. Namun untuk Pi 1 Anda harus mengatur GOARM=5 dan menggunakan gcc-arm-linux-gnueabi sebagai gantinya.

@shinichi-hashitani ini luar biasa! Saya akan mencobanya terima kasih!

@shinichi-hashitani Apakah Anda menggunakan make all KUBE_BUILD_PLATFORMS=linux/arm untuk membuatnya? Dan jika Anda menggunakan kubeadm untuk menyiapkan cluster, bagaimana Anda melakukannya? Apakah Anda menyalin kubelet , skrip init yang disebutkan povilasv, kubeadm , dan kubectl ? Apa itu bekerja?

@dbwest Ya, saya menggunakan make all untuk membangun binari. Perintah persis yang saya gunakan adalah:

make all WHAT=cmd/kube-proxy KUBE_VERBOSE=5 KUBE_BUILD_PLATFORMS=linux/arm
make all WHAT=cmd/kubelet KUBE_VERBOSE=5 KUBE_BUILD_PLATFORMS=linux/arm
make all WHAT=cmd/kubectl KUBE_VERBOSE=5 KUBE_BUILD_PLATFORMS=linux/arm

Saya membutuhkan binari untuk node, jadi hanya tiga binari yang dibutuhkan.

Saya tidak menggunakan kubeadm. Saya mengikuti "Kubernetes the Hard Way" dari Kelsey Hightower. Seperti yang dijelaskan di sini , Anda hanya perlu meletakkan binari tersebut di lokasi yang sesuai.

@shinichi-hashitani ada yang tahu versi kubernet apa yang Anda buat?

Saya belum beruntung mendapatkan ini untuk membangun lengan v6 (berharap untuk berjalan pada pi nol w).

Pada versi >= 1.12.0 saya mendapatkan sesuatu seperti ini...

vendor/github.com/google/cadvisor/accelerators/nvidia.go:30:2: build constraints exclude all Go files in /private/var/folders/hn/gt2l8vq56vx9slvwry43xmz40000gn/T/tmp.A83ZihlF/_output/local/go/src/k8s.io/kubernetes/vendor/github.com/mindprince/gonvml
!!! [0511 07:36:41] Call tree:
!!! [0511 07:36:41]  1: /private/var/folders/hn/gt2l8vq56vx9slvwry43xmz40000gn/T/tmp.A83ZihlF/hack/lib/golang.sh:601 kube::golang::build_some_binaries(...)
!!! [0511 07:36:41]  2: /private/var/folders/hn/gt2l8vq56vx9slvwry43xmz40000gn/T/tmp.A83ZihlF/hack/lib/golang.sh:736 kube::golang::build_binaries_for_platform(...)
!!! [0511 07:36:41]  3: hack/make-rules/build.sh:27 kube::golang::build_binaries(...)
!!! Error in /private/var/folders/hn/gt2l8vq56vx9slvwry43xmz40000gn/T/tmp.A83ZihlF/hack/lib/golang.sh:561
  Error in /private/var/folders/hn/gt2l8vq56vx9slvwry43xmz40000gn/T/tmp.A83ZihlF/hack/lib/golang.sh:561. 'go install "${build_args[@]}" "$@"' exited with status 1

Dan dari >= 1.10.0 & < 1.12.0 ( 1.10.0 adalah yang paling awal saya coba sejauh ini), saya mendapatkan sesuatu seperti ini...

F0511 07:39:30.480641   26683 openapi.go:116] Failed loading boilerplate: open /private/var/folders/hn/gt2l8vq56vx9slvwry43xmz40000gn/T/tmp.A83ZihlF/_output/local/go/src/k8s.io/gengo/boilerplate/boilerplate.go.txt: no such file or directory
!!! Error in ./hack/run-in-gopath.sh:33
  Error in ./hack/run-in-gopath.sh:33. '"${@}"' exited with status 255
Call stack:
  1: ./hack/run-in-gopath.sh:33 main(...)
Exiting with status 1
make[1]: *** [pkg/generated/openapi/zz_generated.openapi.go] Error 1
make: *** [generated_files] Error 2

EDIT: Nevermind ... sepertinya jika saya membangun di mesin linux itu berfungsi. Saya mencoba melakukannya dari mac saya

@ammmze ,

Tidak begitu yakin apa yang menyebabkan masalah di pihak Anda, tetapi di bawah ini adalah detailnya di pihak saya:
Kubernetes - 1.10.2
Pergi - 19,4
Saya menggunakan WSL (Mungkin Ubuntu 16.x) untuk mengkompilasi silang binari tersebut.

Sekali lagi, saya mengikuti di bawah ini dengan beberapa modifikasi:
https://povilasv.me/raspberrypi-kubelet/
Anda dapat merujuk ke ini untuk mengonfirmasi langkah-langkah yang harus dilalui.

Saya telah menyiapkan catatan dan langkah-langkah tepat yang saya ikuti, tetapi maaf itu hanya tersedia dalam bahasa Jepang:
https://qiita.com/ShinHashitani/items/ea9ffdefce8ca5786da6

Adakah gerakan untuk menambahkan dukungan armel belakang untuk pi zero? Saya memiliki beberapa peletakan dan ingin membuat kluster berbiaya rendah/daya untuk tujuan demo

Adakah gerakan untuk menambahkan dukungan armel belakang untuk pi zero? Saya memiliki beberapa peletakan dan ingin membuat kluster berbiaya rendah/daya untuk tujuan demo

hai, seperti yang Anda lihat dalam diskusi di atas, inti Kubernetes menjatuhkan dukungan untuk armv6l.
jadi saya tidak berpikir ada kemungkinan dukungan ini akan ditambahkan kembali.

jika Anda ingin menggunakan k8s / kubeadm pada armv6l Anda harus mengkompilasi ulang semuanya (termasuk gambar CNI).

Saya hanya ingin mengatakan bahwa saya telah berhasil mengkompilasi K8s 1.18.3 dari sumber dengan mengompilasinya dalam gambar golang:1.13-alpine docker, yang merupakan gambar multi-lengkungan dan menyertakan armv6. (Saya memiliki Docker yang dikonfigurasi untuk menggunakan QEMU untuk emulasi dan dapat menjalankan wadah untuk arsitektur lain.)

Dengan hanya mengkloning repo git, dan mengikuti proses make 4 langkah di halaman readme (yaitu, buat saja semua WHAT=cmd/component), semua komponen k8s kecuali kubelet dikompilasi secara statis dan dijalankan sebagai executable mandiri di pi zero saya, tanpa ketergantungan. (Dan jika golang-alpine berhenti bekerja, saya bisa mem-bootstrap Arch Linux ARM dari awal, yang seharusnya berfungsi dengan baik untuk kompilasi.)

Satu-satunya masalah adalah kompilasi kubelet masih terhubung secara dinamis ke perpustakaan sistem glibc, dan saya belum menemukan cara untuk memperbaikinya. Saya bukan programmer go, dan tidak ada flag kompilasi yang saya tambahkan untuk go atau untuk gcc yang tampaknya membuat perbedaan. (Kubelet memiliki beberapa kode C, karena perlu gcc untuk dikompilasi.) Saya kira kasus terburuk saya dapat mem-bootstrap gambar buruh pelabuhan untuk setiap jenis OS yang saya jalankan, sehingga tautan dinamis glibc akan berfungsi, tetapi saya tidak mau lakukan itu.

Debian masih secara resmi mendukung armel dan memiliki paket dengan versi kubelet yang terhubung secara statis, jadi solusi peretasan saya saat ini adalah dengan hanya menggunakan biner statis mereka dari dalam paket armel deb.

Terakhir, Anda harus membuat repositori Anda sendiri dengan gambar yang memiliki binari ini (serta versi lainnya), dan konfigurasikan kubeadm untuk menariknya. Dan bahkan lebih menyenangkan, meskipun Docker berjalan di arm6, itu salah menarik gambar arm7 (bug yang diketahui selama lebih dari 3 tahun), jadi Anda perlu mengubah gambar arm7 untuk hanya menjalankan versi armel, atau membuat arm6 dan arm7 di gambar yang sama dan hanya memiliki titik masuk menjadi skrip shell yang menentukan pada saat runtime apakah akan meluncurkan program arm6 atau arm7. Node non-master hanya perlu menjalankan kubelet dan kube-proxy, jadi itu mungkin satu-satunya gambar yang perlu Anda lakukan. (Peretasan lain yang saya baca tentang orang-orang yang menggunakan adalah menarik gambar yang benar dan kemudian menandai ulang secara lokal menjadi gambar apa pun yang ingin kubeadm tarik, jadi itu hanya akan menggunakan versi lokal.)

Saya sebenarnya hanya menggunakan kemungkinan untuk mengatur k8s "dengan cara yang sulit", tetapi saya bermaksud untuk tetap membuat gambar Docker yang sesuai yang dapat menjadi pengganti drop-in sehingga kubeadm akan bekerja dengannya. Jika dan ketika saya bisa mendapatkan kubelet untuk mengkompilasi secara statis dengan benar, saya akan mengotomatiskan proses menjadi Dockerfile dan menempelkan gambar di Docker Hub. Gambar-gambar itu akan memiliki arsitektur sebanyak yang saya bisa gunakan, jadi idealnya, kita bisa menggunakan kubeadm pada cluster multi-arsitektur. Misalnya amd64, arm64, arm6, dan arm7. Saya memperkirakan bahwa Docker dan K8 produksi penuh pada Pi Zero (sebagai node pekerja) masih menyisakan setidaknya 50mb-100mb ram tersisa untuk menjalankan gambar kecil. Dan jika saya mengupas kernel, saya mungkin bisa membebaskan 30 atau 40 MB lagi. Tapi itu jauh di masa depan. Jika saya bisa mendapatkan satu halaman statis yang dilayani oleh wadah nginx yang dikelola oleh K8 di Pi Zero saya, saya menyebutnya sebagai kemenangan untuk saat ini.


Sunting dari 7 Agustus: Saya telah berhasil membuat semuanya berfungsi, dan saat ini memiliki kluster K8 yang terdiri dari arm6, arm7, arm8, dan amd64. Saya akan menulis proses saya dalam waktu dekat di sini, tetapi untuk saat ini, hal yang penting adalah melakukan instalasi kubeadm pada perangkat arm6 sebagai node pekerja, Anda memerlukan binari untuk kubeadm dan kubelet, dan hanya dua kontainer, wadah jeda, dan wadah kube-proxy. Anda dapat membangun binari secara asli dengan buildx jika Anda memiliki QEMU, dan cukup ubah Dockerfile saya. (Saat ini, Dockerfile tidak benar-benar bekerja sepenuhnya -- build kube-controller-manager terus membeku. Tetapi Anda dapat membangun kubelet, kubeadm, pause, kube-proxy, dan plugin CNI.)

Atau, Anda dapat menarik binari statis dari direktori /usr/bin di paket Arch yang saya buat untuk kubeadm dan kubelet . Saya telah menginstal Arch Linux ARM pada saya Pi Nol, dan plugin CNI dipasang di sistem saya dengan paket, tapi Anda dapat membangun mereka dengan Dockerfile saya (atau menarik mereka dari Arch Linux ARM paket ) dan kemudian menempatkan binari CNI di direktori "/opt/cni/bin/" di sistem Anda. Jika Anda memiliki binari CNI di folder itu, dan telah menginstal kubelet dan siap sebagai layanan , maka Anda dapat menjalankan kubeadm di perangkat dan itu akan berfungsi dengan baik. Satu-satunya persyaratan adalah Anda memerlukan kube-proxy dan pause container yang benar yang sudah tersedia untuk mesin container Anda.

Di Pi Zeroes saya, saya telah menginstal Docker stok, dan saya menggunakan binari yang saya buat dari file Docker, dikombinasikan dengan analisis wadah K8s resmi untuk membangun wadah arm6 yang kompatibel untuk kube-proxy dan pause . Menentukan versi Kubernetes sebagai v1.18.6 pada kubeadm, diperlukan penandaan ulang container tersebut masing-masing sebagai "k8s.gcr.io/kube-proxy:v1.18.6" dan "k8s.gcr.io/pause:3.2", tetapi jika wadah sudah ada dan ditandai dengan benar di sistem Anda, maka kubeadm akan berhasil tanpa keluhan.

Satu-satunya masalah lainnya adalah jaringan overlay yang berfungsi. Saya tidak ingin melalui lebih banyak kompilasi, jadi saya menggunakan Flannel, yang varian "lengan" bekerja pada arm6 dan arm7. Anda dapat menginstalnya dengan file yaml defautl mereka . Namun, Anda harus menambahkan env var untuk semua bagian yang disebut FLANNEL_MTU dan menyetelnya ke 1430 atau lebih rendah. Defaultnya, 1500, menyebabkan beberapa masalah dengan metrics-server. Selain itu, saya menggabungkan semua gambar Flanel menjadi satu gambar

Dengan instalasi K8s "penuh" ini menggunakan kubeadm dan Docker CE, Pi Zero saya menganggur sekitar 55% penggunaan CPU, dan memiliki sekitar 160MB memori gratis. Jika kita berasumsi saya ingin meninggalkan setidaknya 25% untuk kapasitas burst, itu masih menyisakan sekitar 20%, yang setara dengan 200 mili. (Pi Zero memiliki CPU 1GHz inti tunggal.) Untuk memberikan ruang gerak ekstra, saya membulatkan dan mengatur permintaan dan batas wadah saya menjadi 120m, dan RAM menjadi 100MB. Sejauh ini, semuanya bekerja dengan baik. Satu-satunya masalah adalah panas, karena nol saya semua dijejalkan dalam wadah lucu yang dapat ditumpuk yang tidak memiliki banyak ruang udara.

(Dan tentu saja, simpul manajer bukanlah Pi Zero, ini adalah Pi 4.)


Sunting dari 1 Desember 2020: Ini akan menjadi pembaruan terakhir saya. Sebenarnya, tidak banyak yang bisa ditambahkan. Kubeadm memiliki file konfigurasi yaml, seperti halnya semua komponen k8s lainnya, tidak ada yang terdokumentasi dengan baik... tetapi Anda dapat mengatasinya jika Anda mencobanya.

Salah satu opsi kubeadm adalah menggunakan registri khusus untuk gambar Anda, sehingga Anda dapat membuat gambar multi-lengkungan dan mendorongnya ke registri pribadi dan kemudian menggunakannya untuk pengaturan Anda daripada peretasan hanya dengan menandai ulang gambar di buruh pelabuhan. Inilah yang telah saya lakukan untuk menyingkirkan buruh pelabuhan dan hanya menggunakan containerd lurus.

Saya masih belum menemukan cara untuk mendapatkan komponen bidang kontrol yang dikompilasi untuk arm6. Baik QEMU maupun perangkat asli tidak mengizinkan ram lebih dari 1 GB, yang tidak cukup bagi Go untuk mengompilasi sebagian besar bidang kontrol. Saya sadar bahwa Go secara teoritis dapat mengkompilasi untuk arsitektur lain, jadi saya harus dapat mengkompilasi arm6 pada mesin amd64 saya, menggunakan semua ram-nya. Tetapi untuk kehidupan saya, saya tidak bisa membuatnya berfungsi, jadi saya dibiarkan mengkompilasi hal-hal secara asli di QEMU atau di perangkat itu sendiri. Yang berarti tidak ada komponen pesawat kendali arm6.

Tapi itu satu-satunya cegukan. Kompilasi Kubelet dan kubeadm, dan wadah jeda dan wadah proksi kube juga dapat dibangun dengan buildx. Jadi masih cukup mudah untuk membuat komponen node pekerja bekerja untuk arm6. Jika Anda membuat cluster dengan pi zero, pasti membaca file konfigurasi kubelet untuk men-tweaknya untuk penggunaan sumber daya. (Atau, Anda tahu, gunakan k3s atau distro ringan lainnya daripada k8s stok penuh.)

Saya memiliki binari untuk model raspberry lama yang diterbitkan di sini https://github.com/aojea/kubernetes-raspi-binary
Mereka dibuat dengan pekerjaan tindakan github, jadi jangan ragu untuk menggunakannya kembali

Apakah halaman ini membantu?
0 / 5 - 0 peringkat