22
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Raspberry pi 4におけるK3Sクラスタ構築

Last updated at Posted at 2020-02-27

#はじめに
Raspberry piにk3sを構築するのは従来からあるが、Raspberry pi「4」に構築した記事はあまりなかったのでメモ。
よって新規性は「4」であることだけなのであまり記事としての価値は正直ないです。
当例ではRaspberry pi 4を3台用意し、Master1台、Node2台で構築します。
RaspbianのInstallは解説しません。ddコマンドやrufusを使ってMicro SDにOSを焼いてください。

##おやくそく

  • FirewallやSELinuxは無効にしてあります。各自セキュリティ対策を実行してください。
  • 当例ではすべてRoot権限を持ったアカウントで実行しています。適宜sudoする等してください。

##環境
 - Raspbery pi 4 3台(Master, Node, Node)
 - Rasbian OS (Debian 10.1)

#準備(全ノード)
##hostsファイル編集
[報告されているバグ][link-1]を回避するため、hostsファイルに全ノードを登録します。
[link-1]:https://github.com/rancher/k3s/issues/60

本環境では
Master: 192.168.1.221 pi4-master
Node1: 192.168.1.222 pi4-node1
Node2: 192.168.1.223 pi4-node2
としました。よってhostファイル編集後は

root@pi4-master:/home/pi# cat /etc/hosts
127.0.0.1       localhost
::1             localhost ip6-localhost ip6-loopback
ff02::1         ip6-allnodes
ff02::2         ip6-allrouters

192.168.1.221 pi4-master
192.168.1.222 pi4-node1
192.168.1.223 pi4-node2

となります。

##Cgroup有効化
参考 https://kenfdev.hateblo.jp/entry/2019/03/11/193034
当環境ではこれを行わないとのちのコンテナ作成においてContainer Creatingから先に進みませんでした。
/boot/cmdline.txtの行末
cgroup_enable=cpuset
を追記します。改行して追記ではありません。
つまり編集後にcatすると

root@pi4-master:/home/pi# cat /boot/cmdline.txt
1:console=serial0,115200 console=tty1 root=PARTUUID=d9b3f436-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles
cgroup_memory=1 cgroup_enable=memory cgroup_enable=cpuset 

となります。(1:は行番号。筆者追記)

下記例のように改行して追記ではありません

#下記例は間違い
root@pi4-master:/home/pi# cat /boot/cmdline.txt
1:console=serial0,115200 console=tty1 root=PARTUUID=d9b3f436-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles
cgroup_memory=1 cgroup_enable=memory 
2:cgroup_enable=cpuset 

当環境ではcgroup_memory=1 cgroup_enable=memoryは存在したので追記しませんでしたが、
なかった場合は同様に1行目の行末に追記してください。

##Firewall, SELinux無効
執筆時点(2020/02/27)で最新のRaspbian利用時は下記コマンドでSwapを無効化しました。
バージョンによってコマンドが異なるようですので、古いバージョン利用時は[ここ][link-2]を参考に各自行ってください。
[link-2]:https://www.angelcurio.com/raspberrypi/?Raspberry%20Pi/%E5%90%84%E7%A8%AE%E8%A8%AD%E5%AE%9A/swap%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E5%BB%83%E6%AD%A2

systemctl stop firewalld
systemctl disable firewalld
systemctl stop dphys-swapfile
systemctl disable dphys-swapfile

#K3S Install(Master)
https://k3s.io/
むずかしいことはありません。公式通り。

curl -sfL https://get.k3s.io | sh -

正常に終了後、
kubectl get pods --all-namespacesを実行すると、Podが立ち上がっているのが確認できます。
※構築時にここのメモ取り忘れたので、構築完了時から編集して下記に載せています。存在するPod間違えているかもしれません。

root@pi4-master:/home/pi# kubectl get pods --all-namespaces
NAMESPACE     NAME                                      READY   STATUS      RESTARTS   AGE
kube-system   metrics-server-6d684c7b5-gw8bh            1/1     Running     1          24h
kube-system   coredns-d798c9dd-5rmc7                    1/1     Running     1          24h
kube-system   traefik-6787cddb4b-vnvcp                  1/1     Running     1          24h

同様に、Nodeもkubeclt get nodesで確認すると

root@pi4-master:/home/pi# kubectl get nodes
NAME         STATUS   ROLES    AGE   VERSION
pi4-master   Ready    master   24h   v1.17.2+k3s1

##Token取得
Masterの構築は上記でほぼ終わりですが、Node追加用にTokenを取得します。
Tokenは /var/lib/rancher/k3s/server/node-tokenにあります。

root@pi4-master:/home/pi# cat /var/lib/rancher/k3s/server/node-token
K1020893324feca9a5dd57f7b722dddfba8b777ebb212212426a1a234379508d::server:a53fba4b42707ee50aebfe325d6

上記の
K1020893324feca9a5dd57f7b722dddfba8b777ebb212212426a1a234379508d::server:a53fba4b42707ee50aebfe325d6
をメモしておきましょう。

#K3S Install(Node2台)
Node2台とも同じコマンドを実行します。
最初のインストールはMasterと同様です。

curl -sfL https://get.k3s.io | sh -

当方のやり方が悪いのか、出回っている方法だとNode追加できなかったので下記方法で期待する動作を実現しました。

##k3s無効化

このままだとMasterとして動作してしまうので一通り停止と無効化します。

#k3s stop
sh /usr/local/bin/k3s-killall.sh

#k3s disable
systemctl stop k3s
systemctl disable k3s

##k3s agentサービス登録・有効化

k3s-agnetをサービスとして登録してsystemdで管理している先人が[ここ][link-3]にいらしたので真似します。
[link-3]: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/


cat <<EOF > /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

EOF

次に上記にあるEnvironmentFileを作成し、Tokenを読み込むようにします。

SERVERとTOKENは各自のServer機のIPとMaster機のTokenに置き換えてください。

#ディレクトリ作成(ない場合) 
mkdir /etc/sysconfig/

cat <<EOF > /etc/sysconfig/k3s-agent
SERVER=https://192.168.1.221:6443
TOKEN=K1020893324feca9a5dd57f7b722dddfba8b777ebb212212426a1a234379508d::server:a53fba4b42707ee50aebfe325d6

EOF

/* 2020/07/16 上記修正しました(sysco「m」fig)
# 誤 cat <<EOF > /etc/syscomfig/k3s-agent
# 正 cat <<EOF > /etc/sysconfig/k3s-agent
*/

サービスを読み込み、有効化と起動をします。

systemctl daemon-reload
systemctl start k3s-agent
systemctl status k3s-agent
systemctl enable k3s-agent

#動作確認(Master)
この時点でMasterからNode1,2がWorkerとして認識されているはずです。

kubectl get nodes
NAME         STATUS   ROLES    AGE   VERSION
pi4-node1    Ready    <none>   24h   v1.17.2+k3s1
pi4-node2    Ready    <none>   24h   v1.17.2+k3s1
pi4-master   Ready    master   24h   v1.17.2+k3s1

node1,2が増えています。ReadyになっていればOKです。

せっかくなのでRoleも追加します。

###Role追加

kubectl label node pi4-node1 node-role.kubernetes.io/worker=worker
kubectl label node pi4-node2 node-role.kubernetes.io/worker=worker

すると、ROLESの欄がWorkerになります。

kubectl get nodes
NAME         STATUS   ROLES    AGE   VERSION
pi4-node1    Ready    worker   24h   v1.17.2+k3s1
pi4-node2    Ready    worker   24h   v1.17.2+k3s1
pi4-master   Ready    master   24h   v1.17.2+k3s1

なお、ラベルでの管理については触れません。

##nginx deploy
[すばらしいYaml][link-4]があったのでお借りします。
[link-4]:https://tech-lab.sios.jp/archives/15620

cat <<EOF > nginx.yaml                                             
apiVersion: v1
kind: Service
metadata:
  name: nginx-test-service
  labels:
    app: nginx-test
spec:
  selector:
    app: nginx-test
  type: NodePort
  ports:
  - protocol: TCP 
    port: 80
    targetPort: 80
    nodePort: 30080
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-test-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx-test
  template:
    metadata:
      labels:
        app: nginx-test
    spec:
      containers:
      - name: nginx-container
        image: nginx:1.15.9
        ports:
        - containerPort: 80
        lifecycle:
          postStart:
            exec:
              command:
                - /bin/sh
                - -c
                - echo "NGINX container!" > /usr/share/nginx/html/index.html && echo "Pod name is \$(hostname) ." >> usr/share/nginx/html/index.html
EOF

これをDeployします。

#deploy
kubectl apply -f nginx.yaml

#確認。すべてRunningになればOK
kubectl get pods
#NAME                                     READY   STATUS    RESTARTS   AGE
#nginx-test-deployment-745b8d55dc-q2qn2   1/1     Running   0          22h
#nginx-test-deployment-745b8d55dc-tdn8w   1/1     Running   0          22h
#nginx-test-deployment-745b8d55dc-zpz84   1/1     Running   0          22h

#access(IP addressはMasterでもNodeでもOK)
curl -XGET http://192.168.1.221:30080/
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>

[先程参考にしたページ][link-4]ではPod名だけ返ってくるはずが、なぜかHTML全部返ってきました。
動作の確認はできたので詳しくは追求しません。バージョンの問題かもしれません。
わかった方教えてください。

#おわりに
先人の知恵だけで一通り構築ができました。
特段Raspberry pi 4だからといって違いはないです(当たりまえ)
一式3万円くらいで揃えられるので、オンプレK8s(K3s)練習環境としては最適ではないでしょうか。IMG_20190927_003955.jpg
(Raspberry pi 3の写真しかなかった・・・)

#参考文献
[1] Rancher公式 https://k3s.io/
[2] 既存バグ回避 https://github.com/rancher/k3s/issues/60
[3] k3sをラズパイで起動するまでにやったこと https://kenfdev.hateblo.jp/entry/2019/03/11/193034
[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/
[5] SIOS k3s でクラスタ (Master 1台/Worker 2台) を構築してみた https://tech-lab.sios.jp/archives/15620

22
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?