Kubeadm: Kubeadm auf armv6l . gebrochen

Erstellt am 23. Apr. 2017  ·  21Kommentare  ·  Quelle: kubernetes/kubeadm

Ich habe versucht, kubeadm auf meinem Raspberry Pi Zero W zu installieren, bekomme aber eine "Illegal Instruction"
Auf einem Raspberry Pi 3 (armv7) funktioniert es einwandfrei.

Hilfreichster Kommentar

Ist es möglich, über eine Wiedereingliederung des armv6l Supports zu diskutieren. Ich habe viele Beiträge gefunden, die das Interesse an der Verwendung von Kubernetes auf Pi Zero und anderen armv6l-Pi-Geräten zeigen. P Zero eignet sich gut zum Hosten von Micro Services in Kubernetes- oder Swarm-Cluster-Umgebungen. Docker Swarm funktioniert bei mir gut. Es wäre also schön, wenn jemand die Diskussion aufbereiten könnte. Pi clusterhat ist eigentlich eine schöne Demo-Infrastruktur.

Alle 21 Kommentare

Ich habe das gleiche Problem mit kubeadm 1.6.1 auf einem Raspberry Pi Model B+, auch 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

Ich habe ein Downgrade auf kubeadm 1.5.6 gemacht und es funktioniert. 1.6.0 gibt den gleichen Fehler wie 1.6.1 aus.

@clabu ja, ein Downgrade auf 1.5.6 funktioniert, kann aber keinem Cluster ab 1.6 beitreten.

Zunächst einmal vielen Dank für die Verwendung von Kubernetes auf ARM :smile:!

Dies ist ein bekanntes Problem; es wurde in https://github.com/kubernetes/kubernetes/issues/38067 besprochen und wir haben die armel-Unterstützung eingestellt (welcher Teil von RPi 1 beim Cross-Compiling verwendet wird).

Grundsätzlich kann armhf (GOARM=7) nicht auf dem Pi 1 laufen, also haben wir armel mit GOARM=6 in -v1.5 verwendet, um RPi 1 zu unterstützen. Wir haben jedoch alle armhf in v1.6 verwendet, daher funktioniert es nicht der Pi1.

Lege armel ab und verwende stattdessen armhf-Images und verwende GOARM=7 statt GOARM=6
Motivation:

  • Das einzige GOARM=6-Board, das Go in go1.8 unterstützt, ist der Raspberry Pi 1, der einfach zu langsam ist, um neuere Kubernetes-Versionen auszuführen.
  • Kleine Leistungsverbesserungen bei Verwendung von GOARM=7
  • Die armel (http://hub.docker.com/u/armel) Images werden nicht so oft aktualisiert wie die armhf (http://hub.docker.com/u/armhf) Images.

Zum Beispiel wurde https://hub.docker.com/r/armel/debian/ vor 8 Monaten aktualisiert, was aus Sicherheitsgründen wirklich schlecht ist, im Vergleich zu https://hub.docker.com/r/armhf/debian/ die vor 3 Tagen aktualisiert wurde.

Außerdem konnten wir mit dem armhf-Switch https://hub.docker.com/r/armhf/alpine verwenden , was großartig ist.

Hoffe, es hilft, aber sorry, dass ich das RPi 1 nicht mehr unterstützen kann.

Wenn Sie bei der Dokumentation/Verbreitung helfen möchten, tun Sie dies bitte oder kommen Sie mit Vorschlägen

Ich habe das gleiche Problem auf einem Pi Zero

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

Ist es möglich, über eine Wiedereingliederung des armv6l Supports zu diskutieren. Ich habe viele Beiträge gefunden, die das Interesse an der Verwendung von Kubernetes auf Pi Zero und anderen armv6l-Pi-Geräten zeigen. P Zero eignet sich gut zum Hosten von Micro Services in Kubernetes- oder Swarm-Cluster-Umgebungen. Docker Swarm funktioniert bei mir gut. Es wäre also schön, wenn jemand die Diskussion aufbereiten könnte. Pi clusterhat ist eigentlich eine schöne Demo-Infrastruktur.

Betrachtet man den aktuellen docker.io-Build für den pi zero,
Go-Version: go1.9.3
und Docker-Version: 18.02.0-ce

Es scheint eine aktuelle Version von go zu verwenden.

Ich stimme zu, dass es nicht genug RAM gibt, um K8s im Standalone-Modus zu verwenden, aber da es ein Slave auf einem größeren Master ist, sollte es genügend Ressourcen haben, um noch einige nützliche Dinge zu tun.

Weiß jemand, ob es möglich ist, nur aus der Quelle zu bauen, um meine Pi-Nullen als k8s-Knoten zu verwenden?

Zum Beispiel wurde https://hub.docker.com/r/armel/debian/ vor 8 Monaten aktualisiert, was aus Sicherheitsgründen wirklich schlecht ist, im Vergleich zu https://hub.docker.com/r/armhf/debian/ die vor 3 Tagen aktualisiert wurde.

Dies ist heute nicht der Fall, da offizielle Bilder auf verschiedenen Architekturen gleichzeitig aktualisiert werden. Zum Beispiel https://hub.docker.com/r/arm32v5/debian/ , https://hub.docker.com/r/arm32v7/debian/ und https://hub.docker.com/r/amd64/ debian/ wurden alle vor 9 Tagen aktualisiert.

Außerdem konnten wir mit dem armhf-Switch https://hub.docker.com/r/armhf/alpine verwenden , was großartig ist.

https://hub.docker.com/r/arm32v6/alpine/ läuft gut auf Pi Zero.

Ich hoffe, dass Sie es noch einmal überdenken. Es ist so enttäuschend, Pi Zero daran zu hindern, die neuesten k8s auszuführen.

@luxas

+1. einige Verwirrung ist aufgetreten, da der Hub neu angeordnet wurde und die älteren Repos noch vorhanden sind. Die neueren scheinen regelmäßig aktualisiert zu werden.

Hallo @juliancheal ,

Ich bin immer noch dabei, k8s auf ClusterHAT zu erstellen, aber ich konnte Binärdateien für Pi Zero kompilieren und erstellen.

Grundsätzlich habe ich das Folgende mit einigen Modifikationen befolgt:
https://povilasv.me/raspberrypi-kubelet/

Ich habe an wsl gearbeitet:
Linux DESKTOP-6GRDDIN 4.4.0-17134-Microsoft #48-Microsoft Fr 27 Apr 18:06:00 PST 2018 x86_64 x86_64 x86_64 GNU/Linux

1 installiere gcc-arm-linux-gnueabi anstelle von gcc-arm-linux-gnueabihf

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

2 Bevor Sie für Linux/arm bauen, nehmen Sie zwei Änderungen an set_platform_envs() in hack/lib/golang.sh vor

* GOARM . hinzufügenexportiere GOOS=${platform%/ }exportiere GOARCH=${platform## /}export GOARM=5 <- hinzufügen* CC ändern
Fall "${plattform}" in
"linux/arm")
CGO_ENABLED=1 exportieren
export CC=arm-linux-gnueabi-gcc <-change
;;

GOARM muss 5 sein. Wenn Sie 6 angeben, erhalten Sie während des Builds einen Linker-Fehler. (Was ich nicht lösen konnte.)

@shinichi-hashitani Es funktioniert für meinen Pi Zero! Vielen Dank!

Außerdem habe ich Ihr Problem mit einem Linkerfehler gelöst. Setzen Sie für Pi Zero GOARM=6 und behalten Sie gcc-arm-linux-gnueabihf bei. Für Pi 1 müssen Sie jedoch GOARM = 5 setzen und stattdessen gcc-arm-linux-gnueabi verwenden.

@shinichi-hashitani das ist großartig! Ich werde es ausprobieren danke!

@shinichi-hashitani Hast du make all KUBE_BUILD_PLATFORMS=linux/arm , um es zu bauen? Und wenn Sie kubeadm , um Ihren Cluster einzurichten, wie haben Sie das gemacht? Haben Sie kubelet , das erwähnte Init-Skript povilasv, kubeadm und kubectl kopiert? Hat es funktioniert?

@dbwest Ja, ich habe make all verwendet, um Binärdateien zu erstellen. Die genauen Befehle, die ich verwendet habe, waren:

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

Ich brauchte Binärdateien für Knoten, also wurden nur diese drei Binärdateien benötigt.

Ich habe kubeadm nicht verwendet. Ich habe Kelsey Hightowers "Kubernetes the Hard Way" verfolgt. Wie hier beschrieben, müssen Sie diese Binärdateien nur an einem geeigneten Ort ablegen.

@shinichi-hashitani hast du eine ahnung welche version von kubernetes du erstellt hast?

Ich hatte kein Glück, dies für Arm v6 zu bauen (in der Hoffnung, auf einem pi zero w zu laufen).

Bei den Versionen >= 1.12.0 bekomme ich so etwas...

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

Und von >= 1.10.0 & < 1.12.0 ( 1.10.0 war das früheste, was ich bisher versucht habe), bekomme ich so etwas...

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

BEARBEITEN: Egal ... sieht so aus, als würde es funktionieren, wenn ich auf einem Linux-Rechner baue. Ich habe versucht, es von meinem Mac aus zu tun

@ammmze ,

Ich bin mir nicht ganz sicher, was auf Ihrer Seite Probleme verursacht, aber unten sind die Details auf meiner Seite:
Kubernetes - 1.10.2
Los - 19.4
Ich habe WSL (wahrscheinlich Ubuntu 16.x) zum Cross-Kompilieren dieser Binärdateien verwendet.

Auch hier habe ich das Folgende mit einigen Modifikationen befolgt:
https://povilasv.me/raspberrypi-kubelet/
Sie können sich darauf beziehen, um die zu durchlaufenden Schritte zu bestätigen.

Ich habe meine Notiz und die genauen Schritte vorbereitet, die ich befolgt habe, aber das ist leider nur auf Japanisch verfügbar:
https://qiita.com/ShinHashitani/items/ea9ffdefce8ca5786da6

Irgendeine Bewegung zum Hinzufügen von Rückenarmunterstützung für Pi Zeros? Ich habe einige herumliegen und würde gerne einen kostengünstigen / stromsparenden Cluster für Demozwecke erstellen

Irgendeine Bewegung zum Hinzufügen von Rückenarmunterstützung für Pi Zeros? Ich habe einige herumliegen und würde gerne einen kostengünstigen / stromsparenden Cluster für Demozwecke erstellen

Hallo, wie Sie in der obigen Diskussion sehen können, hat Core Kubernetes die Unterstützung für armv6l eingestellt.
Daher glaube ich nicht, dass diese Unterstützung wieder hinzugefügt wird.

Wenn Sie k8s / kubeadm auf armv6l verwenden möchten, müssen Sie alles (einschließlich CNI-Images) neu kompilieren.

Ich melde mich nur, um zu sagen, dass ich K8s 1.18.3 erfolgreich aus dem Quellcode kompiliert habe, indem ich es in das golang:1.13-alpine Docker-Image kompiliert habe, das ein Multi-Arch-Image ist und ein armv6 enthält. (Ich habe Docker so konfiguriert, dass es QEMU für die Emulation verwendet und Container für andere Architekturen ausführen kann.)

Durch einfaches Klonen des Git-Repo und Befolgen des 4-Schritte-Make-Prozesses auf der Readme-Seite (dh erstelle einfach alles WHAT=cmd/component), wurden alle k8s-Komponenten außer Kubelet statisch kompiliert und als eigenständige ausführbare Dateien auf meinem Pi Zero ausgeführt. ohne Abhängigkeiten. (Und wenn golang-alpine nicht mehr funktioniert, kann ich Arch Linux ARM einfach von Grund auf neu booten, was zum Kompilieren gut funktionieren sollte.)

Das einzige Problem ist, dass das Kompilieren von Kubelet immer noch dynamisch mit der System-glibc-Bibliothek verknüpft ist, und ich habe noch nicht herausgefunden, wie man das beheben kann. Ich bin kein Go-Programmierer, und keines der Kompilierungs-Flags, die ich für go oder für gcc hinzugefügt habe, schien einen Unterschied zu machen. (Kubelet hat vermutlich etwas C-Code, weil es zum Kompilieren gcc benötigt.) Ich denke, im schlimmsten Fall kann ich ein Docker-Image für jede Art von Betriebssystem booten, das ich betreibe, also funktionieren die dynamischen Glibc-Links, aber ich möchte nicht TU das.

Debian unterstützt immer noch offiziell armel und hat Pakete mit einer statisch gelinkten Kubelet-Version.

Schließlich müssen Sie Ihr eigenes Repository mit Bildern erstellen, die diese Binärdateien (sowie die anderen Versionen) enthalten, und kubeadm so konfigurieren, dass diese abgerufen werden. Und noch mehr Spaß, obwohl Docker auf arm6 läuft, zieht es fälschlicherweise arm7-Images (ein seit über 3 Jahren bekannter Fehler), sodass Sie entweder das arm7-Image ändern müssen, um nur die armel-Version auszuführen, oder sowohl arm6 als auch arm7 im gleiches Bild und haben nur den Einstiegspunkt ein Shell-Skript, das zur Laufzeit bestimmt, ob das arm6- oder das arm7-Programm gestartet werden soll. Nicht-Master-Knoten müssen nur kubelet und kube-proxy ausführen, daher sind dies wahrscheinlich die einzigen Images, für die Sie dies tun müssen. (Ein weiterer Hack, den ich über Leute gelesen habe, ist, das richtige Image zu ziehen und es dann lokal neu zu taggen, um das Image zu sein, das kubeadm abrufen möchte, sodass nur die lokale Version verwendet wird.)

Ich verwende eigentlich nur ansible, um k8s "auf die harte Tour" einzurichten, aber ich beabsichtige, weiterhin konforme Docker-Images zu erstellen, die als Drop-In-Ersatz dienen können, damit kubeadm mit ihnen funktioniert. Wenn ich kubelet dazu bringen kann, statisch korrekt zu kompilieren, werde ich den Prozess in ein Dockerfile automatisieren und die Images auf Docker Hub kleben. Diese Images werden so viele Architekturen haben, wie ich verwenden kann, sodass wir kubeadm idealerweise in einem Cluster mit mehreren Architekturen verwenden können. ZB amd64, arm64, arm6 und arm7. Ich schätze, dass Docker und K8s in voller Produktion auf Pi Zeros (als Worker-Knoten) noch mindestens 50 MB-100 MB RAM für die Ausführung kleiner Images übrig lassen. Und wenn ich den Kernel entferne, kann ich wahrscheinlich weitere 30 oder 40 MB freigeben. Aber das ist weit in der Zukunft. Wenn ich auf meinem Pi Zero eine einzelne statische Seite von einem von K8s verwalteten nginx-Container bedienen kann, nenne ich das vorerst einen Gewinn.


Edit vom 7. August: Ich habe es geschafft, alles zum Laufen zu bringen, und habe derzeit einen K8s-Cluster, der aus arm6, arm7, arm8 und amd64 besteht. Ich werde hier bald einen Bericht über meinen Prozess machen, aber im Moment ist das Wichtigste, eine kubeadm-Installation auf einem arm6-Gerät als Worker-Knoten durchzuführen. Sie benötigen Binärdateien für kubeadm und kubelet und nur zwei Container. den Pause-Container und den kube-proxy-Container. Sie können die Binärdateien nativ mit buildx erstellen, wenn Sie QEMU haben, und einfach meine Dockerfile ändern. (Im Moment funktioniert dieses Dockerfile nicht wirklich vollständig - der kube-controller-manager Build friert ständig ein. Aber Sie können kubelet, kubeadm, pause, kube-proxy und die CNI-Plugins erstellen.)

Alternativ können Sie die statischen Binärdateien aus dem Verzeichnis /usr/bin in den Arch-Paketen ziehen, die ich für kubelet erstellt habe . Ich habe Arch Linux ARM auf meinem Pi Zero installiert, und so wurden die CNI-Plugins durch ein Paket in meinem System installiert, aber Sie können sie mit meinem Dockerfile erstellen (oder sie aus dem Arch Linux ARM- Paket ziehen ) und dann die CNI-Binärdateien platzieren das Verzeichnis "/opt/cni/bin/" auf Ihrem System. Wenn Sie diese CNI-Binärdateien in diesem Ordner haben und kubelet installiert und als Dienst bereit ist, können Sie kubeadm einfach auf dem Gerät ausführen und es sollte gut funktionieren. Die einzige Voraussetzung ist, dass Sie die richtigen kube-proxy- und pause-Container benötigen, die bereits für Ihre Container-Engine verfügbar sind.

Auf meinem Pi Zeroes habe ich Docker installiert und die Binärdateien, die ich aus der Docker-Datei erstellt habe, in Kombination mit der Analyse der offiziellen K8s-Container verwendet, um einen kompatiblen arm6-Container für kube-proxy und pause zu erstellen . Die Angabe der Kubernetes-Version als v1.18.6 auf kubeadm erforderte das erneute Taggen dieser Container als "k8s.gcr.io/kube-proxy:v1.18.6" bzw. "k8s.gcr.io/pause:3.2". Container bereits auf Ihrem System vorhanden und korrekt getaggt sind, dann wird kubeadm ohne Beanstandung erfolgreich sein.

Das einzige andere Problem ist ein funktionierendes Overlay-Netzwerk. Ich wollte nicht noch mehr Kompilationshölle durchmachen, also habe ich Flannel verwendet, dessen "arm"-Variante auf arm6 und arm7 funktioniert. Sie können es mit ihrer standardmäßigen yaml-Datei installieren. Sie sollten jedoch für alle Abschnitte eine env var mit dem Namen FLANNEL_MTU hinzufügen und auf 1430 oder niedriger setzen. Der Standardwert 1500 verursacht einige Probleme mit dem metrics-server. Außerdem habe ich alle Bilder von Flannel zu einem Multi-Arch-Bild kombiniert, wenn Sie das verwenden möchten. Auf diese Weise können Sie das tun, was ich getan habe, und die standardmäßige yaml-Installationsdatei auf nur einen Abschnitt reduzieren.

Bei dieser "vollen" K8s-Installation mit kubeadm und Docker CE laufen meine Pi Zeroes bei etwa 55% CPU-Auslastung im Leerlauf und haben etwa 160 MB freien Speicher. Wenn wir davon ausgehen, dass ich mindestens 25 % für die Burst-Kapazität belassen möchte, bleiben immer noch etwa 20 % übrig, was 200 Millise entspricht. (Pi Zero hat eine 1-GHz-Single-Core-CPU.) Um etwas mehr Spielraum zu haben, habe ich abgerundet und meine Containeranforderung und -grenze auf 120 m und den RAM auf 100 MB gesetzt. Bisher funktioniert alles prima. Das einzige Problem ist Hitze, da meine Nullen alle in einem niedlichen stapelbaren Gehäuse zusammengepfercht sind, das nicht viel Luftraum hat.

(Und natürlich ist der Managerknoten kein Pi Zero, sondern ein Pi 4.)


Edit vom 1.12.2020: Dies wird mein letztes Update sein. Tatsächlich gibt es nicht viel hinzuzufügen. Kubeadm hat eine yaml-Konfigurationsdatei, ebenso wie alle anderen k8s-Komponenten, von denen keine allzu gut dokumentiert ist ... aber Sie können sich durchwühlen, wenn Sie es versuchen.

Eine der kubeadm-Optionen besteht darin, eine benutzerdefinierte Registrierung für Ihre Images zu verwenden, sodass Sie ein Multi-Arch-Image erstellen und in eine private Registrierung verschieben und diese dann für Ihr Setup verwenden können, anstatt einfach ein Image im Docker neu zu taggen. Dies habe ich getan, um Docker loszuwerden und einfach nur containerd zu verwenden.

Ich habe immer noch nicht herausgefunden, wie man die Komponenten der Steuerungsebene für arm6 kompiliert. Sowohl QEMU als auch native Geräte erlauben nicht mehr als 1 GB RAM, was für Go nicht ausreicht, um den größten Teil der Steuerungsebene zu kompilieren. Mir ist bewusst, dass Go theoretisch für andere Architekturen kompilieren kann, daher sollte ich arm6 auf meinem amd64-Rechner mit dem gesamten RAM kompilieren können. Aber für mein Leben kann ich das nicht zum Laufen bringen, also überlasse ich es, Dinge nativ in QEMU oder auf den Geräten selbst zu kompilieren. Das bedeutet, dass keine Komponenten der arm6-Steuerungsebene vorhanden sind.

Aber das ist der einzige Schluckauf. Kubelet und kubeadm kompilieren, und der Pause-Container und kube-proxy-Container können ebenfalls mit buildx erstellt werden. Es ist also immer noch einfach, die Worker-Knoten-Komponenten für arm6 zum Laufen zu bringen. Wenn Sie jedoch einen Cluster mit Pi-Nullen erstellen, lesen Sie auf jeden Fall die Kubelet-Konfigurationsdatei, um sie für die Ressourcennutzung zu optimieren. (Oder, wissen Sie, verwenden Sie k3s oder eine andere leichte Distribution anstelle von vollwertigen k8s.)

Ich habe Binärdateien für alte Himbeermodelle hier veröffentlicht https://github.com/aojea/kubernetes-raspi-binaries
Sie werden mit einem Github-Actions-Job erstellt, also können Sie ihn gerne wiederverwenden

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen