Raspberry Piにkubernetesクラスタをインストールする

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
    • Docker
$ sudo dpkg -l |grep docker-ce
ii docker-ce 18.06.1~ce~3-0~raspbian armhf Docker: the open-source application container engine
    • Flannel
$ 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/

 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください