2019/04/26のCloud Native Sendai #1で発表した資料です
IoT”っぽい”アプリをk3s+Raspberry Piで実行するCloud Native Sendai #[email protected]/04/26@taiko19xx / 木村 俊彦
View Slide
自己紹介• 木村俊彦(@taiko19xx)• 主にAzure/AWSの設計構築• PHP/Node.jsでのバックエンド構築も• 技術系同人誌サークル「杜の都の開発室」主宰• https://morinomiyakono.booth.pm/• 「技術書典」というイベントで本を出しています
いつものようにRaspberry Piで遊んでいたある日のこと…
ある日のこと• Raspberry PiでDockerは動く• Kubernetesは動くのか?• 実用的かは別• 動いたとしてもRaspberry Piには重荷と予想
ある日のこと• Kubernetesも思っていた以上の低負荷で動かせる事が判明• コンテナ動かすだけであれば簡単にできる• せっかくなのでRaspberry Piらしい何かをしたい
“GPIO”にアクセスして“Lチカ”させられないか?
What is GPIO/Lチカ• GPIO = General-purpose input/output• 汎用入出力のこと• Raspberry Piに沢山ついている”ピン”• Lチカ = LEDチカチカ• LEDを点滅させること• 電子工作の第一歩として有名
KubernetesのPodから物理デバイスにアクセスする必要がある
実現するための唯一にして最大のハードル
本当に可能か?
今回の実験環境• Raspberry Pi 3B• Raspbian Stretch• k3s v0.4.0• Kubernetes v1.14.1-k3s.4• Docker v18.09.0• 比較用• k3sにcontainerdが含まれているので、Docker自体は不要
Docker単体ではどうか?• 可能• $ docker run -it --rm --device /dev/gpiomem raspbian/stretch/bin/bash• --device /dev/gpiomem でGPIOが割り当てられてるメモリ領域へのアクセスを可能にする
しかしKubernetesには--device相当のオプションがない
行けるかと思ったがダメだった…
最終手段、Privileged• 特権モードを有効にしてホストのデバイスの操作ができる• https://kubernetes.io/docs/concepts/workloads/pods/pod/#privileged-mode-for-pod-containers• Kubernetesでは1.11以降でサポート• Dockerにもある(--privileged)• 全デバイスにアクセスできるので諸刃の剣
Lチカのデモ
Kubernetes on Raspberry Piは実用的か?
正直(まだ)実用的ではない
実用的ではない理由• 利用できるコンテナが少ない• Raspberry PiはARM(armhf/arm64)アーキテクチャ• 既存のコンテナ(x86_64)が利用できない• 種類がない訳ではない• カスタマイズする場合のビルドも大変• Raspberry Pi(もしくは他のARMデバイス)上でビルドする• もしくはクロスプラットフォームビルドを行う必要がある• まだまだ重い• K3sを使えば大分軽くはなるが…
Kubernetesを使うことによる良い面• 使い慣れたkubectlでデプロイや操作ができる• ビルド問題が解決できている前提• 管理に利用するツールが一括で済む• SSHで接続してログやサービスの状態を確認する手間が減る• Podが落ちても自動でリトライしてくれる• スタンドアロンで動作させる時は便利• IoT機器は基本スタンドアロン
結論• 何とか物理アクセスは可能• 1GBしかメモリを積んでいない環境ではまだまだ重荷• KubernetesやK3sのこれからに期待• Raspberry Piのような制限のある環境で試行錯誤するのは楽しい• 休み中のコンテナ入門にいかがでしょうか• 頑張ればクラスタも組めます
ありがとうございました