これは ドリコム Advent Calendar 2020 の6日目です。

はじめに

こんにちは!
enzaのSREチームのmendです!

現在業務でkubernetes(k8s)を使用しており、知っておくべきことが多く非常に苦戦しております。。。(汗)

勉強のためにk8s関連の情報を集めていたところ、k8sだけではなくk3sもk9sもあるとか…
さらにk8s環境を簡単に構築できるk0sがリリースされたとのことで、今回はk0sで作成したk8sクラスタを勢いでk9sから確認してみました!

k0sとは

k0sは、軽量でインストールから実際の稼働までを非常にシンプルなコマンドで扱えるシングルバイナリのkubernetesのディストリビューションです。

k8sクラスタを構築はawsのEKSやgoogleのGKEの利用で簡単に構築できますが、個人としてはお金が結構かかってしまうため気軽に試せないというデメリットもあります。
自分で用意したサーバーでk8sを動かすにしてもdockerやkubeadmのインストールなど、手間がかかって面倒なこともしばしば。
なので本当にk0sは簡単なのか、実際に動かしてどんなものか見てみましょう!

実際にやってみる

k0sでk8sクラスタを構築するにあたり、最終的にk9sで実際にクラスタが作成されていることが確認できることをゴールにやってみました!
先に感想を言ってしまうとめちゃめちゃ簡単にクラスタができました!

インスタンスの用意

クラスタで稼働するサーバーとして、terraformでawsのEC2上にk8sのmasterとworkerとそれぞれ1台ずつ作成しました。
それぞれのインスタンスは同一のsubnet上で動作しており、それぞれにelastic ipを割り当ててインスタンスにsshでログインできるようにしています。

実際に構築したインフラはterraformでこちらのリポジトリに上げています。

k0sのインストール

まずそれぞれのインスタンスにsshしてk0sをインストールし、k0sコマンドを使用できるようにします。

$ sudo sh -c "curl -sSLf get.k0s.sh | sh"

k0sコマンドが実際にインストールされたか、バージョンを見て確認してみます。

$ k0s version
v0.7.0

普通のk8sのインストールと比べてめちゃめちゃ楽ですね…

マスターのセットアップ

続いて作成したインスタンスのうち1台をmasterとしてセットアップします。
masterとして作成するにあたり、外部からkubectlで参照できるようにするためk0sの設定をデフォルトから少し変更します。
まずはk0sのデフォルト設定をk0s.yamlとして作成します。

$ k0s default-config > k0s.yaml

作成したk0s.yamlを変更します。

$ vim k0s.yaml

下記のようにspec.api.sans[]にmasterのelastic ipを追加します。
k0sは起動時に./k0s.yamlを読み込んで動作してくれるようです。

apiVersion: k0s.k0sproject.io/v1beta1
kind: Cluster
metadata:
  name: k0s
spec:
  api:
    address: 10.0.0.232
    sans:
    - 10.0.0.232
    - 10.0.0.232
    - xxx.xxx.xxx.xxx #masterのelastic ip
    extraArgs: {}
  controllerManager:
.......

続いてk0sをmasterとして起動します。
なんとこれだけでクラスタとして動いてしまいます….早い….

$ sudo k0s server

ちなみに--enable-workerを付けるとmaster 兼 workerとしても動かせるようです

$ sudo  k0s server --enable-worker

作成したクラスタをローカルのkubectlでも確認できるよう、kubeconfigをローカルに落としておきましょう

$ sudo cp /var/lib/k0s/pki/admin.conf ~/admin.conf
# ローカルマシンにscp等で落とします。
# 拡張子は.confから変更しても問題ありません

実際にローカルのkubectlでクラスタを確認してみます
しかしその前にローカルに落としたkubeconfigの中身を少し修正する必要があります
落としたkubeconfig内のlocalhostになっている部分をmasterのhost名にします

apiVersion: v1
clusters:
- cluster:
  server: https://xxx.xxx.xxx.xxx:6443
......

では実際にkubectlコマンドで確認します

$ export KUBECONFIG=/path/to/kubeconfig
$ kubectl get no
No resources found in default namespace.
....

masterとして起動したのでまだworkerがないですが、
きちんとkube-apiserverからレスポンスが返ってきていますね…すごい….
もし--enable-workerをつけて起動した場合は、既にnodeが登録されていると思います

ワーカーのセットアップ

masterだけではpodを動かせないので、実際にworkerを追加してみましょう!
まずはmasterからサーバーをworkerとして登録するためのjoin tokenをmasterから取得します。
長いjoin tokenが発行されるのでクリップボード等にコピーしておきましょう

# masterからk0s serverが起動している状態で実行
$ sudo k0s token create --role=worker

次に発行されたjoin tokenをworkerのインスタンスで入力します

$ sudo k0s worker "masterで発行されたjoin token"

なんとこれだけでworkerとして認識されます….すごい…..

k9sで見てみる

k9sというk8s上のリソースを監視/確認できるCLIツールを使って確認します。
主にリソースを確認するときにはkubectlを使って確認すると思いますが、k9sはkubectlよりもはるかにリッチなインターフェースで、(使い方を覚えれば)かなりサクサクとリソースを確認できます!
(というかただ使ってみたかっただけ)

詳しい使い方やインストール方法はk9sのgithubにあります。
ではk9sを起動してみます

$ k9s

なんか急にオシャレな画面が出てきました!!!!
試しにnodeを選択してenterを押してみましょう

このようにk9sではpodやpodのログ、events、node等々のリソースをオシャレなインターフェースで見ることができます
最近では他にもLens等のような、本格的にGUIでk8sのリソースを確認できるツールがたくさんあるのでぜひ試してみましょう!

終わりに

今回はリリースされたばかりのk0sを使って、普通のEC2インスタンスにk8sクラスタを構築してみました!
正直これだけ少ない作業で自前のクラスタを構築できるとは思いませんでした….

これまでk8sの学習にはminikubeを使用してきましたが、
minikubeは学習用途で使用されることが前提で、ワーカーノードが1台のみのクラスタしか作成できません。さらに仮想マシンを起動するため、別途virtualboxのインストールする必要があったり、クラスターを動作させるまで手間がかかります。

比較してk0sはk8s環境を軽量に動作させることを目的としているため、学習の際でもワーカーノードを複数台用意し、本番環境と同様のk8sクラスタを再現することも可能です。
そのうえワーカーノード1台で起動する時にも--enable-workerをつけて実行するだけなので、学習を始めるまでにかかる手間も少ないです。

上記の理由も交えた個人的な感想ですが、個人でk8sの学習をする際にはminikubeよりk0sのほうが簡単だと思いました。

k0s、すごかったです

明日の記事は masakij さんの「puppeteerを使ったE2Eテストでも動画を撮ってみる」です。


ドリコムでは一緒に働くメンバーを募集しています!
募集一覧はコチラを御覧ください!