IoT向け軽量KubernetesのK3sを試してみる

Table of Content

はじめに

K3sとは、Rancher Lab社が発表した軽量のKubernetes distributionです。
K3sの名前の由来はk8s(Kubernetes)から5つの変更があるから、k3sだそうです。センス良いですね(≧∇≦)b

以下、日本語版K3sマニュアルの第一章より引用。

  • デフォルトのデータストアであるetcdから組み込み型データベースのSQLiteに置き換え(PostgreSQL,MySQL,etcdなどの外部のデータベースもサポート)
  • ローカルストレージプロパイダ、ロードバランサーサービス、Helmコントローラ、Traefikイングレスコントローラなど、シンプルながら協力な機能が組み込まれてる
  • Kubernetesのコントロールプレーンが動くために必要なコンポーネントが、単一のバイナリとプロセスにカプセル化。これにより、証明書配布などのクラスタ操作を簡単に管理、自動化できる。
  • ソースコード内のクラウドプロパイダーとストレージプラグインは削除
  • 外部環境への依存が必要最低限に抑えれれている。以下のパッケージがk3sに含まれる
    • containerd
    • Flannel
    • CoreDNS
    • ホストユーティリティ(iptables,socat,etc)

フットプリントが小さいため、最適な用途としてエッジコンピューティング、IoT、CI、ARM環境が挙げられます。

前提

今回立てるサーバは以下の通りです。vagrant-libvirtで仮想マシンを作成しています。

ホスト名 IPアドレス
server1 192.168.200.10
agent1 192.168.200.11
agent2 192.168.200.12

k3sではKubernetesで言うところのmasterはserver、workerはagentと言うそうです。
Rancher Lab社で確認しているディストリビューションは以下のとおりです。

  • Ubuntu 16.04 (amd64)
  • Ubuntu 18.04 (amd64)
  • Raspbian Buster

今回はUbuntu 18.04でインストールしていきます。
k3sのバージョンは2020/11/5時点では、v1.18.9です。

インストール

/etc/hostsの設定

各サーバに全サーバのhostsを追加します。

cat <<EOF | sudo tee -a /etc/hosts
192.168.200.10 server1
192.168.200.11 agent1
192.168.200.11 agent2
EOF

serverのインストール

agentは別のサーバに入れるのでINSTALL_K3S_EXEC="--disable-agent"を追加してインストールします。またkubeconfigを読めるようパーミッションを設定しています。

[vagrant@server1 ~]$ curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="--disable-agent" K3S_KUBECONFIG_MODE="644" sh -

インストールが終了したらagentに登録するトークンを表示させます。

[vagrant@server1 ~]$ sudo cat /var/lib/rancher/k3s/server/node-token

agentのインストール

agent1に以下のコマンドでインストールします。<token>はserver1で表示したトークンを設定します。

[vagrant@agent1 ~]$ curl -sfL https://get.k3s.io | K3S_TOKEN=<token> K3S_URL=https://server1:6443 sh -

agent2も同じ様にインストールします。

[vagrant@agent2 ~]$ curl -sfL https://get.k3s.io | K3S_TOKEN=<token> K3S_URL=https://server1:6443 sh -

インストール確認

ノード一覧から、インストールしたagentがReadyで表示されているのを確認します。

[vagrant@server1 ~]$ kubectl get nodes
NAME     STATUS   ROLES    AGE     VERSION
agent1   Ready    <none>   3d23h   v1.18.9+k3s1
agent2   Ready    <none>   3d23h   v1.18.9+k3s1

たったこれだけでKubernetesが構築できてしまいました。インストールが簡単なのがk3sの良いところですね。

nginxを動かしてみる

nginxのデプロイ

以下のコマンドでnginxをデプロイします。

[vagrant@server1 ~]$ kubectl create deployment --image=nginx nginx -n default
deployment.apps/nginx created

pod,deployment,replicasetを確認します。

[vagrant@server1 ~]$ kubectl get all -n default
NAME                        READY   STATUS    RESTARTS   AGE
pod/nginx-f89759699-wpnlg   1/1     Running   0          17s

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.43.0.1    <none>        443/TCP   111s

NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx   1/1     1            1           17s

NAME                              DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-f89759699   1         1         1       17s

nginxを公開する

このままでは外部からアクセスできないため、NodePortでnginxを公開します。

[vagrant@server1 ~]$ kubectl expose deploy/nginx --type=NodePort --port=80
service/nginx exposed

公開されたポートを確認します。

[vagrant@server1 ~]$ kubectl get svc
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.43.0.1      <none>        443/TCP        8m7s
nginx        NodePort    10.43.12.252   <none>        80:32227/TCP   27s

公開されたポートでagentにアクセスします。agentはどれでも構いません。

nginxへのアクセス

nginxをスケールアウトする

pod一つでnginxを動かしてきましたが、以下のコマンドでスケールアウトすることができます。

[vagrant@server1 ~]$ kubectl scale deploy nginx --replicas=2
deployment.apps/nginx scaled
[vagrant@server1 ~]$ kubectl get pods
NAME                    READY   STATUS    RESTARTS   AGE
nginx-f89759699-wpnlg   1/1     Running   0          2d8h
nginx-f89759699-2vx9k   1/1     Running   0          28s

後始末

deployment、serviceを削除します。

[vagrant@server1 ~]$ kubectl delete deployments nginx
deployment.apps "nginx" deleted
[vagrant@server1 ~]$ kubectl delete svc nginx
service "nginx" deleted

最後に

コマンド一つでKubernetes環境ができるのが手軽で良いですね。フットプリントの軽さからIoT等の用途に向いてますが、CNCF認定だけあって、一通りのKubernetesの操作ができるので学習に向いているなぁと思います。
k3sを始めるにあたって株式会社スタイルズさんの日本語版K3sマニュアルを一読してみると、よりk3sの魅力がわかると思います。