Статьи

Запуск Kubernetes / Docker на Raspberry Pi

Запуск движка Docker на Raspberry Pi очень прост благодаря пиратам Docker от Hypriot , просто скачайте изображение и прошейте его на своем Pi, и вы отправитесь в гонки. Я не собираюсь рассказывать об этом процессе установки, он хорошо задокументирован на веб-сайте Hypriot,   и я также написал рецепт в  поваренной книге Docker . Грубо, скачайте файл .img и вставьте его в SD-карту, затем загрузите PI.

Наличие Docker на Raspberry Pi предлагает массу возможностей для любителей и домашних устройств. Это также вызвало у меня интерес, потому что  Kubernetes , один из оркестровщиков Docker, может работать автономно на одном узле с использованием  контейнеров Docker .  Несколько месяцев назад я написал  пост о том, как делать это с помощью docker-compose. Поэтому я решил попробовать на прошлых выходных запустить Kubernetes на PI с использованием образа Hypriot с движком Docker.

Начало  etcd бегать

Первая проблема заключается в том, что Kubernetes в настоящее время использует  etcd , и вам нужно запустить его на ARM. Я решил получить  etcd исходный код непосредственно на PI и обновил Dockerfile, чтобы собрать его прямо там. Etcd использует изображение Golang ONBUILD, и это вызывает у меня горе. Поэтому я скопировал содержимое образа ONBUILD и создал новый файл Docker, основанный на  hypriot/rpi-golang его непосредственном построении. Вы можете увидеть  Dockerfile . При этом у вас есть контейнер Docker, выполняющий etcd на ARM.

Как запустить Hyperkube на ARM

Теперь мне нужно, чтобы двоичный файл гиперкуба работал на ARM. Hyperkube — это один двоичный файл, который позволяет запускать все компоненты Kubernetes. К счастью, для ARM уже есть несколько  бинарных файлов . Это было удобно, потому что я изо всех сил пытался скомпилировать Kubernetes прямо на PI.

Имея этот двоичный файл гиперкуба под рукой, я построил изображение на основе  resin/rpi-raspbian:wheezyизображения. Довольно просто:

FROM resin/rpi-raspbian:wheezy

RUN apt-get update
RUN apt-get -yy -q install iptables ca-certificates

COPY hyperkube /hyperkube

Kubelet Systemd Unit

Агент Kubernetes, работающий на всех узлах кластера, называется Kubelet. Kubelet отвечает за то, чтобы все контейнеры, которые должны работать на узле, действительно работали. Его также можно использовать с манифестом для запуска некоторых конкретных контейнеров при запуске. Об этом есть  хороший пост  от Келси Хайтауэр. Поскольку в образе Hypriot используется systemd, я взял системный модуль, который создает сервис Kubelet прямо из поста Келси:

[Unit]
Description=Kubernetes Kubelet
Documentation=https://github.com/kubernetes/kubernetes

[Service]
ExecStart=/usr/bin/kubelet  \
--api-servers=http://127.0.0.1:8080 \
--allow-privileged=true \
--config=/etc/kubernetes/manifests \
--v=2
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

Kubelet  двоичный файл загружается непосредственно из того же  места ,  как hyperkube. Манифест — это определение модуля Kubernetes, которое запускает все контейнеры для запуска контроллера Kubernetes. Она начинается  etcd, сервер API, планировщик, контроллер и прокси — сервис, все с помощью hyperkube изображения , построенный выше.

Теперь грязный хак

Кубернетес делает что-то интересное. Все контейнеры в модуле фактически используют один и тот же IP-адрес. Это делается путем запуска  поддельного  контейнера, который просто ничего не делает. Другие контейнеры в модуле Pod совместно используют то же пространство сетевых имен, что и этот  поддельный  контейнер. На самом деле это называется  контейнером паузы . Я не нашел способа указать другое изображение для   контейнера паузы в Kubernetes, он, кажется, жестко запрограммирован, с  gcr.io/google_containers/pause:0.8.0 которым, конечно, должен работать на x86_64.

Таким образом, подвох заключался в том, чтобы взять   код паузы Goland из источника Kubernetes, скомпилировать его на PI с помощью  hypriot/rpi-golang и вставить двоичный файл в изображение SCRATCH и пометить его локально, чтобы он отображался как  gcr.io/google_containers/pause:0.8.0 и избегал загрузки реального изображения, работающего на x86_64. , Да … верно … Я сказал тебе грязно, но это был самый быстрый способ, о котором я мог думать.

Собираем все вместе

Теперь, когда у вас есть все изображения, готовые непосредственно на PI, плюс сервис Kubelet, вы можете запустить его. Контейнеры будут созданы, и у вас будет один кластер Kubernetes для узла на PI. Все , что осталось, чтобы использовать  kubectl  CLI , чтобы использовать его. Вы можете скачать ARM-  версию  Kubectl из официального выпуска Kubernetes.

HypriotOS: root@black-pearl in ~
$ docker images
REPOSITORY                       TAG         
hyperkube                        latest
gcr.io/google_containers/pause   0.8.0
etcd                             latest
resin/rpi-raspbian               wheezy   
hypriot/rpi-golang               latest 

HypriotOS: root@black-pearl in ~
$ ./kubectl get pods
NAME                          READY     STATUS    RESTARTS   AGE
kube-controller-black-pearl   5/5       Running   5          5m
HypriotOS: root@black-pearl in ~
$ ./kubectl get nodes
NAME          LABELS                               STATUS
black-pearl   kubernetes.io/hostname=black-pearl   Ready

Возьми

Все на  GitHub  в  https://github.com/runseb/k8s4pi том числе ужасный Баш скрипт , который делает всю сборку 🙂