軽すぎ!超軽量のKubernetes「k3s」のインストール手順

Rancher Labsから超軽量なKubernetes「k3s」がリリースされました。

https://k3s.io/

リポジトリはこちら。

https://github.com/rancher/k3s

説明にある以下の言葉が印象的です。洒落てますね。

Lightweight Kubernetes. 5 less than k8s.

k8sより5少ない軽量なKubernetes。


LinuxのVMさえ用意できればどこでも動かせそうです。バイナリーは40MB以下、使用メモリは512MBまで抑えられているとのことで、IoT機器などリソースが少ない機器上でも動かすことを目指しているようです。これならラズパイ単体でも十分動きそうですね。

また、Kubernetesの勉強をしようとする場合、それなりのリソースが必要となってしまうのがこれまでネックでした。(Minikubeなどありますが)

また、こちらの記事でも紹介したように、Kubernetesを1から構築しようとするとどうしてもそれなりの手間がかかってしまいます。

k3sならバイナリーをダウンロードして起動するだけで使えるようになるので、サクッと導入して検証したい場合には最適かもしれません。

早速導入してみようと思います。

Vagrantで導入

御託はいいからさっさと導入したい人向けに、「vagrant up」で使えるようになるやつを作っておきました。

k3sとは?

ややこしいので、この記事では以下の呼称を用います。さらにややこしい?何となく察してください。

k8s: 今までのKubernetes。

Kubernetes: k3sもk8sも含めたKubernetes。

k3s: 今回リリースされたやつ

とりあえずリポジトリのReadMeを読んでみる。ふむふむ。

k3sはKubernetes互換のディストリビューションとなるように作られていますが、以下については変更が加えられているようです。

  1. あんまり使わない機能だったり、標準的ではなかったり、アルファ版の機能は削除されている。
  2. 複雑なプラグインは削除されている。(ストレージやクラウドプロバイダー関連)。それらはアドオンで代替可能。
  3. Kubernetesではデータストアとしてetcd3が使われていますが、k3sではsqlite3がデフォルトで使われている。etcdへの変更は可能。
  4. ランチャーは1つ。その中にいろんな面倒な設定すべてが詰め込まれている。
  5. OS依存を最小限に。(普通なLinuxカーネルとcgroupマウントだけが必要。なのでWindowsやmacOSでは動かない) Kubernetes の動作に必要な以下のやつはk3sにパッケージングしてある。
    • containerd
    • Flannel
    • CoreDNS
    • CNI
    • Host utilities (iptables, socat, etc)

5. を見ての通り、コンテナランタイムにはdockerではなくcontainerdが使われています。dockerの勉強をしたい場合には向かないので注意です。

k3sの導入

まず、適当なLinuxを用意します。ほぼなんでも良いはず。VMでもベアメタルでも何でも良いです。

今回は手元にすぐ用意できたので、CentOSを使用しました。

社内クラウドを使ったので少しカスタマイズはされていますが、ほぼminimal installのものです。

おもむろに、以下を実行します。

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

これで必要な設定が全て完了します。

こんなメッセージが出ました。

[INFO]  Creating uninstall script /usr/local/bin/k3s-uninstall.sh
[INFO]  Downloading https://github.com/rancher/k3s/releases/download/v0.1.0/sha256sum-amd64.txt
[INFO]  Downloading https://github.com/rancher/k3s/releases/download/v0.1.0/k3s
[INFO]  Verifying download
[INFO]  Installing k3s to /usr/local/bin/k3s
[INFO]  Creating /usr/local/bin/kubectl symlink to k3s
[INFO]  Creating /usr/local/bin/crictl symlink to k3s
[INFO]  systemd: Creating /etc/systemd/system/k3s.service
[INFO]  systemd: Enabling k3s unit
Created symlink from /etc/systemd/system/multi-user.target.wants/k3s.service to /etc/systemd/system/k3s.service.
[INFO]  systemd: Starting k3s

ちょっと待って、30秒もかかってない。

インストールはこれで終わりです。お疲れ様でした。

半信半疑で動作確認

本当にセットアップされてるのか疑問を持ちつつ、動作確認・・・

$ k3s kubectl get node

どうやら、「kubectl」でも「k3s kubectl」でも良さそうです。

そして、動いてる!!!!はえーすっごい。

NAME       STATUS   ROLES    AGE     VERSION
hogehoge   Ready    none   2m41s   v1.13.3-k3s.6

でも本当にPod動くんかねこれ・・・

$ kubectl create -f https://k8s.io/examples/controllers/nginx-deployment.yaml


deployment.apps/nginx-deployment created
$ kubectl get deploy


NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3            3           74s
$ kubectl get po


NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-76bf4969df-m8bp4   1/1     Running   0          80s
nginx-deployment-76bf4969df-q4f68   1/1     Running   0          80s
nginx-deployment-76bf4969df-wcbz4   1/1     Running   0          80s

普通に動いてて草。

サービスまで作って接続できるか見てみます。(以下の全行をコピーして実行してください)

cat <<EOF | kubectl create -f -
kind: Service
apiVersion: v1
metadata:
  name: my-service
spec:
  type: NodePort
  selector:
    app: nginx
  ports:
  - protocol: TCP
    targetPort: 80
    port: 80
EOF

確認します。

$ kubectl get svc


NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.43.0.1       <none>        443/TCP        29m
my-service   NodePort    10.43.117.203   <none>        80:32415/TCP   73s
$ curl http://localhost:32415


<!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>

普通に動いてますね!これできる環境が30秒で用意できるとは・・・

まとめ

いやーすごいですね。ここまで軽量にできるんですね。

本来はIoT機器などリソースが少ない機器向けを想定されているようですが、社内でKubernetesのハンズオン勉強会とかやる場合はk3sで十分な気がしました。

HA構成は未対応などまだまだ本番用途で使うのは早いとはいえ、遊びや練習用途で使うのにはすごく便利だと思うので今後積極的に使っていこうと思います。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です