Edited at

おうちKubernetes構築でハマったところ - ニッチ編 -

おうちKubernetesが流行ってますね!

Raspberry Pi 3 Model Bがたまたま安く手に入ったので、もはや何番煎じかも分かりませんが、Raspberry Piとkubeadmを使って、自宅Kubernetesクラスタを構築しました。

k8s on raspi

構築方法の記事については、既に下記のような良記事が存在するので、本記事ではハマった細かい部分についてのみ記載します。


順番通りにホスト名を設定したい

無事筐体のセットやケーブリングの設定が完了し、Raspberry Piの設定でホスト名を設定しようとしたところ、どのIPがどのマシンに設定されているか分かりませんでした。

hostname setting

そのため、どのIPがどのRaspiと対応しているのか確認するために、LEDを消灯させることにしました。

pi@raspi:~ $ echo none | sudo tee /sys/class/leds/led0/trigger

none
pi@raspi:~ $ echo none | sudo tee /sys/class/leds/led1/trigger
none
pi@raspi:~ $ echo 0 | sudo tee /sys/class/leds/led1/brightness
0

power off led

消灯後、ホスト名を設定した後はrebootすれば元に戻ります。

他の方法としては、ディスクアクセスをさせれば、緑色のLEDが点滅するので、 sudo apt-get update コマンド等を実行してLEDの点滅を見ることで、IPと対応するRaspiを確認することもできます。

ちなみにRaspberry Piに接続するためのIPについては、arp コマンド等で確認できます。

$ arp -a

またホスト名が設定された後は、標準でAvahiが起動している為、MacからであればBonjourのおかげで下記のようにホスト名でアクセスすることができます。LinuxやWindowsもAvahiを入れれば、ホスト名でアクセスできるようになると思います。

$ ssh <ホスト名>.local


Dockerのバージョン

2019年2月現在 apt-get で入るDockerのバージョンは 18.09 です。現在Kubernetesでrecommendedされているバージョンは 18.06 の為、kubeadm init を実行した際にエラーになります。(オプションでskipできそうですが…)

そのため、バージョンを指定してインストールする必要があります。

apt-get でインストールできるバージョンは下記で確認することができます。



$ sudo apt-cache showpkg docker-ce
...
Provides:
5:18.09.0~3-0~raspbian-stretch -
18.06.1~ce~3-0~raspbian -
18.06.0~ce~3-0~raspbian -
18.03.1~ce-0~raspbian -
18.03.0~ce-0~raspbian -
17.12.1~ce-0~raspbian -
17.12.0~ce-0~raspbian -
17.09.1~ce-0~raspbian -
17.09.0~ce-0~raspbian -
Reverse Provides:

バージョンを指定してインストールする方法は下記の通りです。

sudo apt-get install docker-ce=<version>


Kubernetesクラスタにクライアントマシンからアクセスしたい

Kubernetesクラスタの構築も完了し、Raspberry Piにsshして kubectl を実行するところまで確認することができました。さて次に、クライアントのMacからも kubectl で操作したいと思ったところでハタと困りました。

普段は az コマンドや gcloud コマンドがよしなに設定してくれる箇所なのでKubernetesにおけるユーザの追加方法を意識していませんでした。

下記の記事を参考に 秘密鍵の生成kubectlの設定 を実行することでアクセスできるようになります。


ARM用のイメージを利用する

Pythonのサンプルイメージを利用して動作確認をしようとしたところ、動作しませんでした。

# Base Image

FROM python:3.6

# ...(中略

# Run the application
CMD ["python", "/opt/myapp/app.py"]

実行結果のエラーは下記の通り

$ kubectl logs  <pod>

standard_init_linux.go:190: exec user process caused "exec format error"

ローカルのdockerでは起動する為、理由が分からず悩みましたが、Base ImageのPythonがx86用にbuildされていたのが原因でした。考えてみれば当たり前で、RaspiのCPUはARMの為、ARM用のBuild Imageを利用する必要があります。

# Base Image

FROM armhf/python:3.6

# ...(中略

Docker HubにARM用のImageが存在するので、そちらを利用するように修正すると問題なく動作しました。


まとめ

まとめていて思いましたが、Kubernetes全然関係ありませんね。

実際のところ先達の良記事のおかげで、ほぼハマらずにスムーズに構築することができます。

kubeadmのおかげで、Kubernetesの構築もほぼコマンド一つです。

皆さん書いていますが、大変だったのは、ケースのアクリル板から保護ビニールを剥がすところくらいです。

構築前・構築中は実際のところ3Gしかないし、利用するかな?Docker for Mac等のローカルでのシングルノードクラスタで十分じゃないかなと思っていました。

構築後利用してみると、便利です。クライアント側マシンには負荷がかからないので、重い処理をしていても快適です。後所有感がすごいです。やはり一家に一台、Kubernetesクラスタですね!

それでは良いKubernetes生活を!