【Kubeのラズパイ包み】Rasberry Piを使ったKubernetes クラスタでの機械学習基盤構築

はじめに

機械学習基盤、もうちょいなんとかしたくて、勉強のためにKubernetesのオライリー本を買ったら、付録に「Rasberry Piを使ったKubernetes クラスタ構築」を見つけたので本体読み始める前に必要なもの揃えて構築してみました。この上で勉強すればいいかなって。

入門 Kubernetes

入門 Kubernetes

  • 作者: Kelsey Hightower,Brendan Burns,Joe Beda,松浦隼人
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2018/03/22
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログを見る

で、色んな方が既に実践されているので多いに参考にさせて頂きました。ありがとうございました。

developers.cyberagent.co.jp

qiita.com

色んな所でこのラズパイのkubernetes包みは紹介されているので、わざわざ記事にしなくても良いかなと思ったけど、そのままやったんじゃエラー吐いたから備忘録的に。

必要なモノ揃えて、 f:id:tkzs:20180720011759j:plain

組み立てる。

f:id:tkzs:20180720011841j:plain

機械学習基盤にしようとしてるけど、無線で全部つなげるっていう不安定さ、ホンマにいいんかなって気はするけど、まぁいいや。使ったRaspbianは下記。

$ lsb_relsease -a
Distributor ID: Raspbian
Description:    Raspbian GNU/Linux 9.4 (stretch)
Release:        9.4
Codename:       stretch

もろもろ準備

下ごしらえで3台のラズパイに下記を実施。

まずはネットワーク周りを確保したいが、 /etc/wpa_supplicant/wpa_supplicant.confを編集してWiFi有効化する方法だとなぜか反映されなかったので、

sudo raspi-config

でWiFi環境を設定しておいた。

ラズパイホスト名が同じraspberryになっていたのでk8s-master,k8s-node1, k8s-node2へ変更。

$ sudo apt-get update
$ sudo apt-get -y upgarade

$ sudo vi /etc/hosts
$ sudo vi /etc/hostname

さらにcgroupsの有効化するために。

$ cd /Volumes/boot
$ vi cmdline.txt

でcgroup_enable=cpuset cgroup_enable=memoryを追加。

$sudo apt-get install -y \
     apt-transport-https \
     ca-certificates \
     curl \
     gnupg2 \
     software-properties-common

$ sudo dphys-swapfile swapoff
$ sudo dphys-swapfile uninstall
$ sudo update-rc.d dphys-swapfile remove

Dockerのインストール

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo apt-key fingerprint 0EBFCD88
$ 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のインストール

現時点でlatestであった1.11をインストールして進めるとkubeadm initの段階でエラーが発生したので、1.9.7を使っている。GKEと同じバージョン。

$ curl -fsSL 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
$ sudo apt-get install -y kubelet=1.9.7-00 kubeadm=1.9.7-00 kubectl=1.9.7-00

ちなみにkubeadm v1.11でinitしようとすると

Jul 14 20:19:12 k8s-node1 kubelet[5447]: E0714 20:19:12.365501    5447 reflector.go:205] k8s.io/kubernetes/pkg/kubelet/kubelet.go:455: Failed to list v1.Service: Get https://192.168.13.7:6443/api/v1/services?limit=500&resourceVersion=0: dial tcp 192.168.13.7:6443: connect: connection refused

ってエラーが出たから下記のissueに従って変更。

github.com

masterのセットアップ

今回マスターが仕様するIPアドレスは192.168.13.7だったので、このアドレスを指定してノードをクラスタにする必要がある。そのための--apiserver-advertise-addressへの登録。initに成功したら素直に支持されたコマンドでconfigファイルをコピー。

$ sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.13.7 --ignore-preflight-errors=cri

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.xxxxxxxxxxxxx 192.168.13.7:6443 --discovery-token-ca-cert-hash xxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config

nodeのセットアップ

ノード端末の方でもinit時に指定されていたコマンドでmasterに参加。

sudo kubeadm join --token xxxxxxxxxxxxxxxxxxxxxxxx 192.168.13.7:6443 --discovery-token-ca-cert-hash xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

とりあえずできた

ちゃんとレジストされているか確認。

$ kubectl get node
NAME         STATUS     ROLES     AGE       VERSION
k8s-master   NotReady   master    2h        v1.9.7
k8s-node1    Ready      <none>    1h        v1.9.7
k8s-node2    NotReady   <none>    1h        v1.9.7

できてた。