【Kubeのラズパイ包み】Rasberry Piを使ったKubernetes クラスタでの機械学習基盤構築
はじめに
機械学習基盤、もうちょいなんとかしたくて、勉強のためにKubernetesのオライリー本を買ったら、付録に「Rasberry Piを使ったKubernetes クラスタ構築」を見つけたので本体読み始める前に必要なもの揃えて構築してみました。この上で勉強すればいいかなって。
- 作者: Kelsey Hightower,Brendan Burns,Joe Beda,松浦隼人
- 出版社/メーカー: オライリージャパン
- 発売日: 2018/03/22
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
で、色んな方が既に実践されているので多いに参考にさせて頂きました。ありがとうございました。
色んな所でこのラズパイのkubernetes包みは紹介されているので、わざわざ記事にしなくても良いかなと思ったけど、そのままやったんじゃエラー吐いたから備忘録的に。
必要なモノ揃えて、
組み立てる。
機械学習基盤にしようとしてるけど、無線で全部つなげるっていう不安定さ、ホンマにいいんかなって気はするけど、まぁいいや。使った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に従って変更。
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
できてた。