Contents
Rancher Labsの k3s を使ってラズペリーパイでクラスタを作ってみました。
Ansibleのラズペリーパイ包み🤤🤤🤤 pic.twitter.com/1UwIWm3A1x
— 日常系インフラ自動化もふもふおじさん@Ansible(コンテナ基盤構築とか自動化やりたい) (@sky_jokerxx) 2019年4月15日
材料
材料 | 個数 |
---|---|
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カードがどのデバイスかを確認します。
1 2 |
$ diskutil list |
ここでは /dev/disk4
にマウントされていたので、それを指定しています。
環境に合わせてマウントされたデバイスを指定してください。
1 2 |
$ sudo diskutil partitionDisk /dev/disk4 1 MBR "Free Space" "%noformat%" 100 |
FedoraのARM用のイメージをダウンロードします。
イメージは以下からダウンロードできます。
1 2 3 |
$ 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へ書き込みます。
1 2 |
$ sudo dd if=Fedora-Minimal-29-1.2.aarch64.raw of=/dev/rdisk4 bs=4m |
書き込みが完了したらアンマウントします。
1 2 |
$ sudo diskutil umountDisk /dev/disk4 |
後は、Micro SDカードをラズパイに挿入して起動します。
起動後にIPやホスト名を設定します。
また、以下のコマンドを実行してディスク容量を拡張します。
1 2 3 |
[root@k3s-master ~]# growpart /dev/mmcblk0 3 [root@k3s-master ~]# resize2fs /dev/mmcblk0p3 |
k3sセットアップ
全てのホストに以下のhostsを設定しています。
1 2 3 4 5 6 |
[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セットアップ
必要なパッケージをインストールします。
1 2 |
[root@k3s-master ~]# dnf -y install tar |
masterで必要なモジュールをロードします。
1 2 3 4 |
[root@k3s-master ~]# modprobe nf_conntrack [root@k3s-master ~]# modprobe br_netfilter [root@k3s-master ~]# modprobe vxlan |
ルーティング設定をします。
1 2 3 4 5 6 |
[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をインストールします。
1 2 |
[root@k3s-master ~]# curl -sfL https://get.k3s.io | sh - |
masterのk3sユニットファイルを修正します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[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のロールを設定します。
1 2 3 |
[root@k3s-master ~]# kubectl label node k3s-master node-role.kubernetes.io/master=master node/k3s-master labeled |
全てのpodが起動するまで待ちます。
1 2 3 4 5 6 7 |
[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なのでイメージは以下のリポジトリのものを使用します。
1 2 3 4 5 6 7 8 9 10 11 |
[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ノードにコピーいします。
1 2 3 |
[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に同じ手順でセットアップします。
ルーティング設定をします。
1 2 3 4 5 6 |
[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を確認します。
1 2 3 |
[root@k3s-master ~]# cat /var/lib/rancher/k3s/server/node-token K1046c7f789335114bd5f675332d792287b6711d702b3cbfb417a4603892a00d015::node:e8960da566ca7b9d2247d9e61c4af107 |
workerノードでagent起動用ユニットファイルを作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
[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 |
ユニットファイルで読み込む変数ファイルを作成します。
1 2 3 4 |
[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を起動します。
1 2 3 4 5 |
[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ノードがクラスタに参加できたか確認します。
1 2 3 4 5 6 |
[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ノードのロールを設定します。
1 2 3 4 5 6 7 8 |
[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のクラスタが構築できました 🙂