8月末に何気なくテレビを見ていたら夏休みの自由研究について話していたので自分も何かしたくなり、3台のRaspbrerry Pi 3 B+にkubeadmを使ってkubernetesクラスタシングル構成をインストールしてみました。
購入したハードウェア
kubernetesのラズパイ包みが美味しそうだったので、kubeadmを使って作ってみたを参考にし、Raspberry PiはRSコンポーネンツから、Raspberry Pi以外はAmazonで購入しました。Raspberry Piを入れるタワー状のケースもちゃんとAmazonで売っていました。
- Raspberry Pi 3 Model B+ [137-3331] * 3
- Samsung microSD card 32GB(B06XSV23T1) * 3
- Micro USB cable Syncwire UNBREAKcable 20cm(B073WT6VJ5) * 3
- UGREEN Micro USB cable 0.5m(B06VV6Z3L7)
- LAN cable 0.3m(B00JEUSAR2) * 3
- 6 port USB charger(B00QUS6AY6)
- Switching hub 5 port(B00D5Q7V1M)
- Raspberry Pi case(B01F8AHNBA)
ソフトウェア
-
- 2018-06-27-raspbian-stretch-lite.img
- Kubeadm
$ kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"11", GitVersion:"v1.11.3", GitCommit:"a4529464e4629c21224b3d52edfe0ea91b072862", GitTreeState:"clean", BuildDate:"2018-09-09T17:59:42Z", GoVersion:"go1.10.3", Compiler:"gc", Platform:"linux/arm"}
$ sudo dpkg -l |grep kube
ii kubeadm 1.11.3-00 armhf Kubernetes Cluster Bootstrapping Tool
ii kubectl 1.11.3-00 armhf Kubernetes Command Line Tool
ii kubelet 1.11.3-00 armhf Kubernetes Node Agent
ii kubernetes-cni 0.6.0-00 armhf Kubernetes CNI
$ sudo dpkg -l |grep docker-ce
ii docker-ce 18.06.1~ce~3-0~raspbian armhf Docker: the open-source application container engine
$ kubectl describe ds kube-flannel-ds-arm -n kube-system | grep Image
Image: quay.io/coreos/flannel:v0.10.0-arm
Image: quay.io/coreos/flannel:v0.10.0-arm
インストール手順
3台すべてで行うもの、Master nodeで行うもの、Worker node(2台) で行うものからなります。以下の設定で実行したので適宜置き換えてください。
ノード |
IPアドレス |
ホスト名 |
Master node |
10.0.0.51 |
berry-1 |
Worker node1台目 |
10.0.0.52 |
berry-2 |
Worker node2台目 |
10.0.0.53 |
berry-3 |
3台すべてで行うもの
Raspberry PiのOSを手持ちのMacBookでSDカードに書き込みます。Raspbian stretch lite をhttps://www.raspberrypi.org/downloads/raspbian/からダウンロードします。以下を実行します。
$ cd ~/Download
$ unzip 2017-09-07-raspbian-stretch-lite.zip
$ sudo diskutil umount /dev/disk2s1
$ sudo dd bs=1m if=2018-06-27-raspbian-stretch-lite.img of=/dev/rdisk2 conv=sync
$ sudo diskutil umountDisk /dev/disk2
sshを有効にします。
$ cd /Volumes/boot
$ touch ssh
SDカードをMacBookからとり、Raspberry Piに挿入し、電源のUSBケーブルを挿します。ログインプロンプトが出たら、pi/raspberryでログインします。raspi-configコマンドを実行し、キーボード設定とホスト名を変更します。
次に、/etc/dhcpcd.confに以下を追加し、IPアドレスを変更します。ip_addressの値はそれぞれの値とします。
interface eth0
static ip_address=10.0.0.53/24
static routers=10.0.0.1
static domain_name_servers=10.0.0.1
Dockerをインストールします。
$ curl -sSL get.docker.com | sh && \
sudo usermod pi -aG docker
newgrp docker
SWAPを無効にします。
$ sudo dphys-swapfile swapoff && \
sudo dphys-swapfile uninstall && \
sudo update-rc.d dphys-swapfile remove
/boot/cmdline.txtにあるテキストの最後に、スペースを空けて以下を追加します。
cgroup_enable=cpuset cgroup_enable=memory
一旦リブートします。
kubeadmをインストールします。
$ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - && \
echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list && \
sudo apt-get update -q && \
sudo apt-get install -qy kubeadm
Master node(1台)で実行する
下記のコマンドを実行し、Master nodeを初期化します。
$ sudo kubeadm init --token-ttl=0 --pod-network-cidr=10.244.0.0/16
初期化が終了したら、表示されたように以下を実行します。
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 で始まるコマンドが表示されているのでそれを適当な場所に保存しておきます。
Flannel setup
Flannelをインストールしてカーネルを初期化します。
$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
$ sudo sysctl net.bridge.bridge-nf-call-iptables=1
STATUSがRunningになっていることを確認します。
$ kubectl get po -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-78fcdf6894-shcnd 1/1 Running 1 2d
coredns-78fcdf6894-vzrp9 1/1 Running 1 2d
etcd-berry-1 1/1 Running 1 2d
kube-apiserver-berry-1 1/1 Running 1 2d
kube-controller-manager-berry-1 1/1 Running 1 2d
kube-flannel-ds-arm-k7psp 1/1 Running 2 1d
kube-proxy-x58xl 1/1 Running 1 2d
kube-scheduler-berry-1 1/1 Running 1 2d
Worker node(2台)で実行する
カーネルパラメータを変更します。
$ sudo sysctl net.bridge.bridge-nf-call-iptables=1
クラスタに参加します。Master nodeを初期化した時に表示されたコマンドを実行します。
$ sudo kubeadm join 10.0.0.51:6443 --token wxxo84.rmbxfo2gprs91li7 --discovery-token-ca-cert-hash sha256:d76dede60db0a973b43628d59b82a139f5978469f5f2b743c419628a45fc1cc8
Master nodeから参加したノードで動作するpodのSTATUSがRunningであることを確認します。
$ kubectl get po -n kube-system -o wide |grep berry-2
kube-flannel-ds-arm-gq8bs 1/1 Running 2 9h 10.0.0.52 berry-2 <none>
kube-proxy-zx4qq 1/1 Running 0 9h 10.0.0.52 berry-2 <none>
動作確認
hello-worldを起動してもpodがCrashLoopBackOffになってしまったので、代わりに以下の方法で確認します。まず下記を実行します。
$ kubectl run hypriot --image=hypriot/rpi-busybox-httpd --replicas=3 --port=80
$ kubectl expose deployment hypriot --port 80 --target-port 80 --type NodePort
$ kubectl get svc hypriot
実行後、http://10.0.0.52:をブラウザから開きます。
参考
- https://gist.github.com/alexellis/fdbc90de7691a1b9edb545c17da2d975
- https://qiita.com/hatotaka/items/48a88ecb190e1f5e03c3
- https://blog.hypriot.com/post/setup-kubernetes-raspberry-pi-cluster/