初めまして、 @shirot61 です。
この記事の目的
タイトルそのままです。
動機
-
3日間クッキング【Kubernetes のラズペリーパイ包み “サイバーエージェント風”】がとても美味しそうだったので、
kubernetes & Raspberry Pi 素人でも作れるか、試してみたかった。 - SoftwareDesign 3 月号の kubernetes 特集をみて、kubernetes に入門したくなった。
- せっかく作ったので、どこかにまとめておきたかった
料理を作るにあったって
3日間クッキング では、論理的構築が省略されていたため、その辺りを色々調べていたところ、
Z Lab の @hatotaka シェフが、kubeadmを使ったクラスタ構築を行なっていました!
なので、論理的構築は、そちらを参考に(ほぼ丸パクリ)させていただきました。(ありがとうございます)
というわけで、今回構築する k8s クラスタは、以下になります。
- Raspberry pi
- モデル: Raspberry Pi 3 Model B
- OS: Raspbian stretch lite (2018-03-13)
- Kubernetes
- kubeadm: v1.9.4
- Pod Network: Flannel
@hatotaka さんの記事との違いは、バージョンくらいです。
macOS High Sierra を使って、これらを構築していきます。
#材料
サイバーエージェントシェフの材料 (の画像) を凝視して集めた材料がこちらになります。
Raspberry Pi 3 Model B | 3 個 |
ヒートシンク | 3 セット |
microSDカード 16GB | 3 枚 |
4段積層式 Raspberry Pi 3 ケース | 1 個 |
6ポート 60W USB 充電器 (Anker PowerPort 6) | 1 個 |
2.4A microUSB ケーブル | 4 本 |
コンパクト無線親機 (WMR-433W-BK) | 1 個 |
NETGEAR GS305-100JPS | 1 個 |
0.3m LAN ケーブル | 4 本 |
材料を並べた画像がこちらです。
ちょくちょく違うものも混じっていますが、まぁいいでしょう!
スイッチングハブは NETGEAR のものを使います。(ステッカー...)
#料理開始
ラズパイラックの構築から 〜 LANの設定
RaspberryPi を袋から取り出して、
ヒートシンクをつけて、
(もう少し短いケーブルにすべきだったかも..)
そして、無線LANの設定を行うために、
- ブラウザで 192.168.13.1 にアクセスして、
- ワイヤレスワンモードを選択し、
- 接続先を指定して、
- 接続先の暗号化キーを入力すると、
- 接続がタイムアウトしました ...?
もう、勘弁して下さい
調べてみると、自宅の回線は PPPoE 認証が必要なやつらしく、
コンパクト無線親機の WMR-433W-BK は、PPPoE 認証に対応してないので、これが原因で接続がタイムアウトしてました...
なので今回は、
有線LAN - スイッチングハブ - ラズパイ ×3
と接続する方式に、急遽、路線変更しております。
raspbian のインストールと、各種設定(ホスト&ユーザ名変更など)
OS インストール
というわけでまずは、raspbian をダウンロードして、インストールを行います。
ラズパイ初心者に向けて、 https://www.raspberrypi.org/documentation/installation/ に
Beginners should start with NOOBS, which gives the user a choice of operating system from the standard distributions.
との記載があり、NOOBS をお勧めしてくれていますが、そんなものは無視です。
GUI はいらないので、ここ からRaspbian Stretch Lite をダウンロードして、Mac に microSDカードを差し込みます。
その後の手順は、以下の通りです。
// raspbianの解凍
$ cd ~/raspbianがDLされた場所
$ unzip 2018-03-13-raspbian-stretch-lite.zip
// SDカードのパスをチェック
// 自分の環境だと、 /dev/disk2s1 だった
$ diskutil list
// SDカードのアンマウント
// diskutil list で調べたパスを指定する
$ sudo diskutil unmount /dev/disk2s1
// イメージの書き込み
$ sudo dd bs=1m if=2018-03-13-raspbian-stretch-lite.img of=/dev/rdisk2 conv=sync
詳細:Installing operating system images - Raspberry Pi Documentation
次に、sshを有効にします。
// sshの有効化
$ cd /Volumes/boot
$ touch ssh
あとは、cgroups の、cpu と memory を有効化するために、
/Volumes/boot/cmdline.txt
に、cgroup_enable=cpuset cgroup_memory=1 を追加して下さい。
これで OK (のはず) です。
Raspberry Pi へのログイン
ログインしようにも、ラズパイ達のアドレスがわからなかったので、
$ arp -a
を実行し、それぞれのラズパイに割り当てられているIPアドレスを調べて、
ssh でログイン
$ ssh pi@192.168.xxx.xxx
// 以下、ついでにやっときます
$ sudo apt-get update
$ sudo apt-get -y upgrade
// k8s 1.8からスワップが有効だとkubeletが起動しないそうなので、先にやっとく(起動しっぱなしにしてたら、消せって怒られた)
// スワップを切ることで、SDカードの寿命を伸ばせる
$ sudo dphys-swapfile swapoff
$ sudo dphys-swapfile uninstall
$ sudo update-rc.d dphys-swapfile remove
後は、ホスト名とユーザ名を変更など、セッティングを行って、
$ slogin user@host.local
でログインできることを確認します。
をラズパイ3台分で行います。
Docker & kubeadm のインストール ~ master & node のセットアップ
Docker のインストール
注 : 今回私が使用している raspbian(Debian) のバージョン(コードネーム)は、stretch です。
Docker をインストールしていきます。
$ sudo apt-get install -y \
apt-transport-https \
ca-certificates \
curl \
gnupg2 \
software-properties-common
// $(. /etc/os-release; echo "$ID") で、OS の名前を引っ張ってこれる(wheezy 以降?)
$ curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")/gpg | sudo apt-key add -
$ echo "deb [arch=armhf] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list
$ sudo apt-get update
$ sudo apt-get -y install docker-ce
kubeadm のインストール
kubeadm をインストールしていきます。
$ curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
// k8s 公式(下の詳細リンクのとこ)の方には、ヒアドキュメントを使ってやる方法で書いてあるけど、
// @hatotaka さんみたいに、パイプと tee 使った方が、なんだかカッコ良い
$ echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
$ sudo apt-get update
$ sudo apt-get install -y kubelet kubeadm kubectl
詳細:Installing kubeadm | Kubernetes
masterのセットアップ
master のセットアップを行います。
$ sudo kubeadm init ...
のとこは、--apiserver-advertise-address で、master のアドレスを指定する方が正解かも?
参考:kubeadm で kubernetes v1.8 + Flannel をインストール
$ sudo kubeadm init --pod-network-cidr=10.244.0.0/16
[init] Using Kubernetes version: v1.9.4
[init] Using Authorization modes: [Node RBAC]
[preflight] Running pre-flight checks.
Your Kubernetes master has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
You can now join any number of machines by running the following on each node
as root:
kubeadm join --token xxxxxx.xxxxxxxxxxxxxxxx 192.168.1.13:6443 --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// kubeadm init で表示されたメッセージに従う
$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubectl が正しく実行できるか確認。
$ kubectl verision
Client Version: version.Info{Major:"1", Minor:"9", GitVersion:"v1.9.4", GitCommit:"bee2d1505c4fe820744d26d41ecd3fdd4a3d6546", GitTreeState:"clean", BuildDate:"2018-03-12T16:29:47Z", GoVersion:"go1.9.3", Compiler:"gc", Platform:"linux/arm"}
Server Version: version.Info{Major:"1", Minor:"9", GitVersion:"v1.9.4", GitCommit:"bee2d1505c4fe820744d26d41ecd3fdd4a3d6546", GitTreeState:"clean", BuildDate:"2018-03-12T16:21:35Z", GoVersion:"go1.9.3", Compiler:"gc", Platform:"linux/arm"}
falnnel のデプロイ
$ kubectl apply -f <(curl -s https://raw.githubusercontent.com/coreos/flannel/v0.9.1/Documentation/kube-flannel.yml |sed 's/amd64/arm/g')
node のセットアップ
node のセットアップを行います。
kubeadm init
を実行した時に表示されたメッセージに従い、コマンドを入力して、master のとこに参加させる。
$ kubeadm join --token xxxxxx.xxxxxxxxxxxxxxxx 192.168.1.13:6443 --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
そして完成へ
最後に、master で kubectl get node
を実行して 、node の参加を確認する。
$ kubectl get node
NAME STATUS ROLES AGE VERSION
raspi001 Ready master 3d v1.9.4
raspi002 Ready <none> 3d v1.9.4
raspi003 Ready <none> 3d v1.9.4
以上でセットアップが完了しました。
ついに、kubernetes のラズパイ包みの完成です!!
非常に美味しそうです。(なんとかできてよかった...)
おわりに
今回は、
サイバーエージェントの MasayaAoyama さんの記事と、Z Lab の @hatotaka さんの記事を元に、
-
物理的構築
-
論理的構築
を行いました。
これで、
一家に一台おうち Kubernetes の時代
に乗り遅れずにすみそうです。
というわけで、
全くのkubernetes(&ラズパイ)素人でも
簡単にkubernetesクラスタを構築できて、テンションが上がっております。
今後はこれを使って kubernetes を触っていきます。
拙い記事でしたが、最後まで読んで頂き、ありがとうございました。
ご指摘等々ございましたら、よろしくお願いします。