ラズベリーパイでk3sクラスタを作ってみた

日常系エンジニアのTech Blog

Rancher Labsの k3s を使ってラズペリーパイでクラスタを作ってみました。

材料

材料 個数
Raspberry Pi 3 B +マザーボード 3個
積層式ケース for Raspberry Pi 専用 1個
microSDカード32GB 3個
Rampow Micro USBケーブル 2個
ロジテック スイッチングハブ 5ポート 1個
エレコム LANケーブル 0.3m 3個
両面テープ(分厚くて剥がせるやつがオススメ) 1個
マジック結束バンド 1個
アクリル円盤 80 1個
OWL-ACU6C12S-BK 1個
Ansibleステッカー(プライスレス) 1枚

k3sクラスタ構築手順

全ノードでfirewalld/SELinuxは無効化しています。

環境

各バージョン

項目 バージョン 備考
Fedora 29
k3s v1.14.1-k3s.4
Helm 2.13.1
Mac High Sierra 操作端末

登場人物

ホスト名 役割
k3s-master masterノード
k3s-node01 workerノード
k3s-node02 workerノード

OSインストール

Micro SDカードをPC(ここではMac)に挿してフォーマットします。
まずは、Micro SDカードがどのデバイスかを確認します。

$ diskutil list

ここでは /dev/disk4 にマウントされていたので、それを指定しています。
環境に合わせてマウントされたデバイスを指定してください。

$ sudo diskutil partitionDisk /dev/disk4 1 MBR "Free Space" "%noformat%" 100

FedoraのARM用のイメージをダウンロードします。
イメージは以下からダウンロードできます。

$ curl -L https://dl.fedoraproject.org/pub/fedora-secondary/releases/29/Spins/aarch64/images/Fedora-Minimal-29-1.2.aarch64.raw.xz -O  $ xz -d Fedora-Minimal-29-1.2.aarch64.raw.xz

イメージをダウンロードしたら以下のコマンドでMicro SDへ書き込みます。

$ sudo dd if=Fedora-Minimal-29-1.2.aarch64.raw of=/dev/rdisk4 bs=4m

書き込みが完了したらアンマウントします。

$ sudo diskutil umountDisk /dev/disk4

後は、Micro SDカードをラズパイに挿入して起動します。
起動後にIPやホスト名を設定します。

また、以下のコマンドを実行してディスク容量を拡張します。

[root@k3s-master ~]# growpart /dev/mmcblk0 3  [root@k3s-master ~]# resize2fs /dev/mmcblk0p3

k3sセットアップ

全てのホストに以下のhostsを設定しています。

[root@k3s-master ~]# vi /etc/hosts  (snip)  192.168.0.140   k3s-master  192.168.0.141   k3s-node01  192.168.0.142   k3s-node02

masterセットアップ

必要なパッケージをインストールします。

[root@k3s-master ~]# dnf -y install tar

masterで必要なモジュールをロードします。

[root@k3s-master ~]# modprobe nf_conntrack  [root@k3s-master ~]# modprobe br_netfilter  [root@k3s-master ~]# modprobe vxlan

ルーティング設定をします。

[root@k3s-master ~]# cat <<EOF >  /etc/sysctl.d/k3s.conf  > net.bridge.bridge-nf-call-ip6tables = 1  > net.bridge.bridge-nf-call-iptables = 1  > EOF  [root@k3s-master ~]# sysctl --system

master側にk3sをインストールします。

[root@k3s-master ~]# curl -sfL https://get.k3s.io | sh -

masterのk3sユニットファイルを修正します。

[root@k3s-master ~]# vi /etc/systemd/system/k3s.service  (snip)  ExecStartPre=-/sbin/modprobe br_netfilter  ExecStartPre=-/sbin/modprobe overlay  ExecStartPre=-/sbin/modprobe nf_conntrack # 追加  ExecStartPre=-/sbin/modprobe vxlan        # 追加  (snip)  [root@k3s-master ~]# systemctl daemon-reload  [root@k3s-master ~]# systemctl restart k3s  [root@k3s-master ~]# systemctl status k3s  [root@k3s-master ~]# kubectl get nodes  NAME         STATUS   ROLES    AGE   VERSION  k3s-master   Ready    <none>   48s   v1.14.1-k3s.4

masterのロールを設定します。

[root@k3s-master ~]# kubectl label node k3s-master node-role.kubernetes.io/master=master  node/k3s-master labeled

全てのpodが起動するまで待ちます。

[root@k3s-master ~]# kubectl get pods --all-namespaces  NAMESPACE     NAME                             READY   STATUS      RESTARTS   AGE  kube-system   coredns-857cdbd8b4-zq78s         1/1     Running     0          5m12s  kube-system   helm-install-traefik-bmwbb       0/1     Completed   0          5m13s  kube-system   svclb-traefik-57689557bb-gqslb   2/2     Running     0          3m2s  kube-system   traefik-55bd9646fc-h9rxx         1/1     Running     0          3m1s

Helm tillerをデプロイします。
今回はARMなのでイメージは以下のリポジトリのものを使用します。

[root@k3s-master ~]# curl -L https://storage.googleapis.com/kubernetes-helm/helm-v2.13.1-linux-arm64.tar.gz -O  [root@k3s-master ~]# tar zxvf helm-v2.13.1-linux-arm64.tar.gz linux-arm64/helm  linux-arm64/helm  [root@k3s-master ~]# mv linux-arm64/helm /usr/local/bin/  [root@k3s-master ~]# git clone https://github.com/jessestuart/tiller-multiarch.git  [root@k3s-master ~]# kubectl create -f tiller-multiarch/manifests/tiller-rbac.yaml  [root@k3s-master ~]# export KUBECONFIG=/etc/rancher/k3s/k3s.yaml  [root@k3s-master ~]# helm init --service-account tiller --tiller-image=jessestuart/tiller:latest-arm64  [root@k3s-master ~]# kubectl get pods --all-namespaces | grep tiller-deploy  kube-system   tiller-deploy-7f657558bf-8p8s5   1/1     Running     0          86s

k3sコマンドをworkerノードにコピーいします。

[root@k3s-master ~]# scp /usr/local/bin/k3s root@192.168.0.141:/usr/local/bin/  [root@k3s-master ~]# scp /usr/local/bin/k3s root@192.168.0.142:/usr/local/bin/

workerセットアップ

2台のworkerに同じ手順でセットアップします。

ルーティング設定をします。

[root@k3s-node01 ~]# cat <<EOF >  /etc/sysctl.d/k3s.conf  > net.bridge.bridge-nf-call-ip6tables = 1  > net.bridge.bridge-nf-call-iptables = 1  > EOF  [root@k3s-node01 ~]# sysctl --system

masterノードでクラスタに参加するためのtokenを確認します。

[root@k3s-master ~]# cat /var/lib/rancher/k3s/server/node-token  K1046c7f789335114bd5f675332d792287b6711d702b3cbfb417a4603892a00d015::node:e8960da566ca7b9d2247d9e61c4af107

workerノードでagent起動用ユニットファイルを作成します。

[root@k3s-node01 ~]# vi /etc/systemd/system/k3s-agent.service  [Unit]  Description=Lightweight Kubernetes Agent  Documentation=https://k3s.io  After=network-online.target    [Service]  Type=simple  EnvironmentFile=/etc/sysconfig/k3s-agent  ExecStartPre=-/sbin/modprobe br_netfilter  ExecStartPre=-/sbin/modprobe nf_conntrack  ExecStartPre=-/sbin/modprobe overlay  ExecStartPre=-/sbin/modprobe vxlan  ExecStart=/usr/local/bin/k3s agent --server $SERVER --token $TOKEN  Delegate=yes  LimitNOFILE=infinity  LimitNPROC=infinity  LimitCORE=infinity  TasksMax=infinity  TimeoutStartSec=0    [Install]  WantedBy=multi-user.target

ユニットファイルで読み込む変数ファイルを作成します。

[root@k3s-node01 ~]# vi /etc/sysconfig/k3s-agent  SERVER=https://192.168.0.140:6443  TOKEN=K1046c7f789335114bd5f675332d792287b6711d702b3cbfb417a4603892a00d015::node:e8960da566ca7b9d2247d9e61c4af107

項目 説明
SERVER k3sのmasterノードへのアクセスURL
TOKEN クラスタへ参加するためのtoken

k3sのagentを起動します。

[root@k3s-node01 ~]# systemctl daemon-reload  [root@k3s-node01 ~]# systemctl start k3s-agent  [root@k3s-node01 ~]# systemctl status k3s-agent  [root@k3s-node01 ~]# systemctl enable k3s-agent

masterノード側でworkerノードがクラスタに参加できたか確認します。

[root@k3s-master ~]# kubectl get nodes  NAME         STATUS   ROLES    AGE     VERSION  k3s-master   Ready    master   31m     v1.14.1-k3s.4  k3s-node01   Ready    <none>   2m36s   v1.14.1-k3s.4  k3s-node02   Ready    <none>   2s      v1.14.1-k3s.4

ロール設定

workerノードのロールを設定します。

[root@k3s-master ~]# kubectl label node k3s-node01 node-role.kubernetes.io/worker=worker  [root@k3s-master ~]# kubectl label node k3s-node02 node-role.kubernetes.io/worker=worker  [root@k3s-master ~]# kubectl get nodes  NAME         STATUS   ROLES    AGE    VERSION  k3s-master   Ready    master   32m    v1.14.1-k3s.4  k3s-node01   Ready    worker   4m8s   v1.14.1-k3s.4  k3s-node02   Ready    worker   94s    v1.14.1-k3s.4

これで、ラズパイ上にk3sのクラスタが構築できました 🙂

https://sky-joker.tech/2019/05/04/%e3%83%a9%e3%82%b9%e3%82%99%e3%83%98%e3%82%99%e3%83%aa%e3%83%bc%e3%83%8f%e3%82%9a%e3%82%a4%e3%81%a6%e3%82%99k3s%e3%82%af%e3%83%a9%e3%82%b9%e3%82%bf%e3%82%92%e4%bd%9c%e3%81%a3%e3%81%a6%e3%81%bf/

Sent with Reeder