Caffè Latte

日々を徒然に

スポンサーリンク

Raspberry Piで作るk8sクラスタ

スポンサーリンク

Raspberry Piで作るk8sクラスタ

この記事は Aizu Advent Calendar 2018 の9日目の投稿です。 昨日の記事はNoahOrbergくんの記事でしたね、彼のdotfileはとても参考になるのでおすすめです。 noahorberg.hatenablog.com

明日はout1ogicさんの投稿です。楽しみですね

昨日会津では雪が降ったらしいです。例年に比べてだいぶ遅かったんじゃ無いかなと思います。 今年は暖冬と言われますが、今年の雪はどうなるのでしょうか 学部一年の頃はとてもワクワクして、昨日の投稿をした NoahOrbergくんと 雪ダイブ(下に参考資料)をして楽しみました f:id:Nozomi_M:20181208225723j:plain 本格的な冬を迎える会津がとても楽しみです。昨年は雪降る中檜原湖を一周したり、滝沢不動滝で車をスタックしたりと思い出がたくさんありました。僕は会津出身では無いので、地元では楽しめないこの雪景色がとても大好きです。今度会津のおすすめスポットとかも紹介したいですね。冬場はオリオン座の季節なので、しっかり会津とオリオン座を撮りたいなあと思ってたりします。 今年も楽しみです。


はじめに

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

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

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

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

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

材料

以下の材料が必要です。

f:id:Nozomi_M:20181208225345j:plain

大まかな流れ導入流れ

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

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

構成図

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

f:id:Nozomi_M:20181208225238p:plain

導入

ハマりどころ

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

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

  • 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 -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をインストール
# 鍵登録
curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
# 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ケーブルします。

f:id:Nozomi_M:20181208225208j:plain

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

Twitterアカウント

参考記事等

お世話になりました。 https://developers.cyberagent.co.jp/blog/archives/14721/

https://engineers.weddingpark.co.jp/?p=1993

https://qiita.com/tk3fftk/items/d7ef8bc12a1f0a76ad4a

https://qiita.com/MarieKawasuji/items/b088ffb252a92eee8f5d

スポンサーリンク