はじめに
Raspberry Piでkubenetes(以降k8s)のクラスタを作って行きたいと思います。
わざわざ作らないとk8sの検証ができないということはなく、minikubeやgcpを使ったりして学ぶことはできます。予算的には2万5千円くらいかかるので、kubenetesに関して学びたいだけならgcp借りてやったほうが安いですし、余計なトラブルはないと思います。
個人的にはその技術をちゃんと1から触ってみないとよく理解できないということが往往にしてあるので、ちゃんと作りたいという意志で作りました。
また、本記事の内容はほとんど サイバーエージェントさんの出している記事 、 ウェディングパークさんの出している記事 と同じですが、一部足りない点やハマったところがあったので書いています。
今年の9月に発売された本Docker/Kubernetes 実践コンテナ開発入門 がとてもわかりやすいです。 kubenetesの運用や、Dockerの軽量化の話まで乗っているのでとてもお勧めします。
材料
以下の材料が必要です。
- Raspberry Piを載せる台
- Raspberry Pi
- 60WクラスのUSB充電器
ルーター
- スイッチングハブ
- LANケーブル
- スペーサー
最小サイズで、設計しました。僕が作ったモデルを公開しているので、レーザーカッターなどが使える人は、利用してみてください
[https://www.dropbox.com/s/2quv78gna1ycpze/kuberaspiboard.ai?dl=0http://](https://www.dropbox.com/s/2quv78gna1ycpze/kuberaspiboard.ai?dl=0http://)
2~∞台(LANポートがあるモデルをお勧めします。僕は 3B1台, 3B+2台の計3台の構成で行いました。)
Raspberry Pi3台の想定でこのUSB充電器を使っています。
Private IPが振られない環境だと必要かもしれない、用意しておくのをお勧めします。
ルーターの口が足りない場合必要です。上記のルーターを使う場合は必要です。
お任せ、長さ揃えるとよいかも、長さ的に自作することをおすすめします。
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の方にいただけると気づくので嬉しいです。