Raspberry Piで作るk8sクラスタ

はじめに

Raspberry Piでkubenetes(以降k8s)のクラスタを作って行きたいと思います。

わざわざ作らないとk8sの検証ができないということはなく、minikubeやgcpを使ったりして学ぶことはできます。予算的には2万5千円くらいかかるので、kubenetesに関して学びたいだけならgcp借りてやったほうが安いですし、余計なトラブルはないと思います。

個人的にはその技術をちゃんと1から触ってみないとよく理解できないということが往往にしてあるので、ちゃんと作りたいという意志で作りました。

また、本記事の内容はほとんど サイバーエージェントさんの出している記事 、 ウェディングパークさんの出している記事 と同じですが、一部足りない点やハマったところがあったので書いています。

今年の9月に発売された本Docker/Kubernetes 実践コンテナ開発入門 がとてもわかりやすいです。 kubenetesの運用や、Dockerの軽量化の話まで乗っているのでとてもお勧めします。

材料

以下の材料が必要です。

  • Raspberry Piを載せる台

  • 最小サイズで、設計しました。僕が作ったモデルを公開しているので、レーザーカッターなどが使える人は、利用してみてください
    [https://www.dropbox.com/s/2quv78gna1ycpze/kuberaspiboard.ai?dl=0http://](https://www.dropbox.com/s/2quv78gna1ycpze/kuberaspiboard.ai?dl=0http://)

  • Raspberry Pi

  • 2~∞台(LANポートがあるモデルをお勧めします。僕は 3B1台, 3B+2台の計3台の構成で行いました。)

  • 60WクラスのUSB充電器

  • Raspberry Pi3台の想定でこのUSB充電器を使っています。

  • ルーター

  • Private IPが振られない環境だと必要かもしれない、用意しておくのをお勧めします。

  • スイッチングハブ

  • ルーターの口が足りない場合必要です。上記のルーターを使う場合は必要です。

  • LANケーブル

  • お任せ、長さ揃えるとよいかも、長さ的に自作することをおすすめします。
    USBケーブル
    お任せ、長さ揃えるとよいかも

  • スペーサー

  • これだと大きいサイズのスペーサーの数が足りないので他のがいいかも小さいのを組み合わせて作りました。

大まかな流れ導入流れ

以下のような流れでRaspberry Piクラスタを作って行きます。

  • Raspberry Piをクラスタに組む
  • Dockerとkubenetesをインストール
  • クラスタを設定

構成図

今回作るクラスタは以下のような構成で作っています。 環境によっては、ルーターは

導入
ハマりどころ
先にハマりどころを書いておきます。

Dockerは18.06出ないとk8sを起動できない

https://github.com/kubernetes/minikube/issues/3323 (12/5現在)
kubeletのバージョンを固定しないとノードをjoinできない

後からノードを追加するときにkubeletのバージョンが違かったのでエラー吐かれることがありました。一気にやる場合は大丈夫です。
IPを固定してあげたほうがいい、PrivateIPが振られる環境で作らないと厳しそう

OSのインストール、SSHの有効化まではよしなに

Raspberry Piの設定
raspberry piのIPを固定します。 /etc/dhcpcd.confに編集します。コメントアウトと追記で動きます。終わったら再起動してあげてください。

 
interface eth0
static ip_address=192.168.0.{指定したいIP}/24
static routers=192.168.0.1 # ルーターのIPアドレス

/boot/cmdline.txt に以下の内容を追加します。改行せずに、一行で追加してください

cgroup_enable=cpuset cgroup_enable=memory cgroup_memory=1

スワップの削除をします。kubeletを起動するのに必要です。


sudo dphys-swapfile swapoff
sudo dphys-swapfile uninstall
sudo update-rc.d dphys-swapfile remove

Docker, k8sの設定
Dockerを追加します。Dockerのバージョンを18.06にしています。


curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
curl -sSL https://get.docker.com/ | sh
sudo apt remove docker-ce docker-ce-cli 
sudo rm -rf /var/lib/docker
VERSION=18.06.1-ce sh get-docker.sh
# apt-transport-httpsをインストール
sudo apt install apt-transport-https
# k8sをインストール

aptのリソースのリストにk8sを追加

echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt update

k8sの各種ツールをインストールします

sudo apt-get install kubelet kubeadm kubectl kubernetes-cni
master nodeのセットアップ
sudo kubeadm init --pod-network-cidr=10.244.0.0/16

を行い、master nodeを立ち上げます。コンテナ間の通信をflannelでやるので–pod-network-cidr=10.244.0.0/16が必要です。公式ページ参照

以下を実行してconfigをコピーしてきます。

mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

うまくいったら

kubeadm join –token のようなものが出力されます。

表示されなかったらkubeadm resetでセットアップからやり直してください。

僕の場合、上記の設定のどれかを忘れていたか、Private IPが振られていなかったのが原因でした。

nodeの追加

先ほど表示されたkubeadm join〜〜をノードにするRaspberry Piで実行します。

失敗したらkubeadm resetをしてやり直します。kubeletのバージョンが違かったりしました。

flannelのapply

以下を実行して、flannelを追加します。

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/bc79dd1505b0c8681ece4de4c0d86c5cd2643275/Documentation/kube-flannel.yml 

nodeの確認

kubectl get node

これでnodeの状態を確認します。 追加したいnodeが追加されていたら、k8sの設定は終了です。

終わりに
僕が作ったものは以下のようになりました。 LANケーブルが酷いことになってるので、自作LANケーブルします。

今後は、前に作ってたアプリケーションをraspberry Piクラスタに乗せて見て実際に稼働させて見たいと思います。 何か間違っていることだったり、追加ありましたらTwitterの方にいただけると気づくので嬉しいです。