HaLake Magazine

コワーキングスペースHaLakeの技術情報発信サイト!IoT,AR,VRなど最新技術情報をお届け!

ラズパイ4+HypriotOSでKubernetesクラスタ構築

f:id:takumishinoda:20200123194815p:plain

今回は2020/1/19日現在最新のラズパイ4(4GBメモリモデル)でKubernetesクラスタの構築をしていきます。
今回は構築のみを行いますが、まだわからないこともあるので今後も機会があれば別の記事にしてまとめられればと思います。
また、OSはRaspbianOSではなくDocker用に最適化されたHypriotOSで構築していきます。

目標


注意点

  • 今回は有線LANを使用します
  • SSH接続などラズパイの使用経験がある前提で説明します
  • ラズパイセットアップ環境: MacBookPro 2017


目次

  1. microSDにHypriotOSを書き込む
  2. ラズパイの初期設定
  3. クラスタに必要なパッケージのインストール
  4. マスタの環境構築
  5. ノードの追加
  6. 導入後、再起動からクラスタ再構築まで


1. microSDにHypriotOSを書き込む

まずはHypriotOSイメージを入手しましょう。
以下のリンクから好きなバージョンを選択してダウンロードします。
筆者環境では最新のVersion 1.12.0をしようしました。  

blog.hypriot.com

次にmicroSDにOSイメージを行く方法として、Etcherを利用していきます。
まずは以下のリンクからEtcherをダウンロード&インストールを済ませましょう。

Etcherを起動すると下の画像のようなウィンドウが出てくるので、手順にしたがってmicroSDにイメージを書き込みます。

やることは全てGUI上で完結されていて、とても簡単にイメージを焼くことができます。
もちろんこのソフトはRaspbianOSのsdカード作成にも使えるのでインストールしておくのはおすすめです。

2. ラズパイの初期設定

OSの書き込みが終わったらまずはmicroSDの内容を編集します。
Etcherで書き込みが終わるとmicroSDはアンマウントされるので、一度パソコンから抜いてもう一度刺してマウントしましょう。
マウントしたディレクトリにuser-dataファイルがあるのを確認したらhostname: black-pearlと記述された部分を見つけ出してblack-pearlの部分を好きなホスト名に編集しましょう。
またこの時、編集するのにはコマンドプロンプトからでnanoエディタvimを使って編集します。
Macテキストエディットを使って保存すると、筆者環境ではラズパイが起動しなくなったので使わないようにしましょう。

f:id:takumishinoda:20200123210132p:plain
nanoエディタでの編集例


ここまでできたらmicroSDをラズパイに刺して起動しましょう。
今回は有線LANを利用するので、有線LAN接続してからラズパイに電源供給します。 しばらくするとルータにIPが割り振られるので、ラズパイのIPを確認してssh接続します。
筆者の環境ではLanScanを利用して確認しています。

LanScan

LanScan

  • iwaxx Sarl
  • ユーティリティ
  • 無料
apps.apple.com

ssh接続できたらまずIPアドレスを固定しましょう。
/etc/network/interfacesファイルに以下を追記することでIP固定が可能になります。
今回はクラスタの構築なので、マスターと複数ノードできりのいい番号から連番にしておくことで管理しやすくなります。

allow-hotplug eth0
iface eth0 inet static
  address 192.168.x.x # 固定するIP
  netmask 255.255.255.0 
  gateway 192.168.x.1 # ゲートウェイ


3. クラスタに必要なパッケージのインストール

それではまずマスタの構築から入ります。
はじめにクラスタ構築に必要なパッケージをインストールしていきます。
まずHypriotOSのパッケージリストにインストールするパッケージを登録します。 以下のコマンドでGPGキーを追加します。

$ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -

このコマンドを実行して、OKと表示されれば成功です。
次に/etc/apt/sources.list.d/kubernetes.listに以下の内容を追記します。

deb https://apt.kubernetes.io/ kubernetes-xenial main

ここまでできたら、sudo apt-get updateを実行すればリポジトリの登録が完了します。
そして以下の3つのコマンドを実行してKubernetesクラスタの必須パッケージをインストールします。
しかしここで注意点があり、三つのパッケージのバージョンを合わせることと、構築するクラスタのマスタ機とノード各機のパッケージバージョンは同じである方が良いようです。
ブログ執筆時も数日開けて環境構築をした際にバージョンが二回変わったので、更新間隔が近いので注意が必要です。

$ sudo apt-get install -y kubelet
$ sudo apt-get install -y kubeadm
$ sudo apt-get isntall -y kubectl

# または

$ sudo apt-get install -y kubelet kubeadm kubectl

エラーが出ずにインストールができれば完了です。
ここでインストールした三つのパッケージについて軽く説明します。

  • kubelet: ポッドの管理(裏側の処理)
  • kubeadm: Kubernetes環境をコマンドで簡単に立ち上げるのをサポートする(ルート権限で操作)
  • kubectl: Kubernetesの操作コマンド(ユーザ権限で操作)

4. マスタの環境構築

ここまでで必要なパッケージがインストールできたので、本格的に環境構築に入ります。
まずはkubeadmコマンドを使ってKubernetesを立ち上げます。
この作業には2~5分ほどかかるので待ちましょう。

$ sudo kubeadm init --pod-network-cidr=10.244.0.0/16

この処理が正常に終われば、最終行にkubeadm join ...のようなコマンドが表示されるので、コピーしておきましょう。
もしこの時コピーを忘れてしまった時は、sudo kubeadm token create --print-join-commandを実行して結果を再度コピーしておきましょう。
次にkubectlコマンドを使えるようにするために、以下を実行します。

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

次にCNIプラグインをインストールしましょう。

$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.yml

コマンドの実行が終わったらkubectl get nodeを実行して以下のようにマスタのステータスがReadyになっていればマスタの設定は終了です。

5. ノードの追加

ノードの追加はマスタが正常に立ち上がっていればとても簡単です。
ノード側では3. クラスタに必要なパッケージのインストールまでの作業が済んでいればあとはマスタで発行されたkubeadm joinコマンドを実行するだけです。
この時、コマンドの実行はルート権限(sudo付き)で実行してください。

実行したあとにエラーが出ていなければ、マスタで再度$ kubectl get nodeを実行してみるとノードが追加されReadyまたはNot Readyになっているかと思われます。
Not Readyだった場合はしばらく待つか、マスタとノードを両方とも再起動してからもう一度4. マスタの環境構築からやり直してみてください。
これでクラスタの構築が完了しました。

6. 導入後、再起動からクラスタ再構築まで

クラスタ構築完了後、ラズパイを再起動してまたクラスタを構築することがあると思います。
設定がうまくできていれば、再起動後も勝手にクラスタが構成されますがマスタの不調でもう一度立て直したい時の方法を紹介します。
まずはマスタでの操作で、以下のコマンド群を順に実行します。

$ sudo kubeadm reset
$ sudo kubeadm init --pod-network-cidr=10.244.0.0/16
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.yml

次にノード側では以下を実行します。

$ sudo kubeadm reset
$ # マスタで発行された`kubeadm join`コマンドをルート権限で実行

これで構築時と同じようにマスタにノードが接続されているのがマスタで$ kubestl get nodeを実行することで確認できるはずです。
もしThe connection to the server 192.168.x.x:6443 was refused - did you specify the right host or port?のようなエラーが出た時はしばらく待つか、まっても変わらない場合はマスタと各ノード全てを再起動してください。

まとめ

・HypriotOSのインストールがラズパイにできた ・Kubernetesクラスタがラズパイでたてられた ・次は機会があればKubernetesで何かイメージを動かしたい