CLOVER🍀

That was when it all began.

シングルノードで動かすことに特化したKubernetesである、MicroK8sを試す

Ubuntu Linuxにリモートログインした時に、こんな表示が出るようになっていたのが前々から気になっていまして。

Welcome to Ubuntu 18.04.2 LTS (GNU/Linux 4.15.0-47-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

 * Ubuntu's Kubernetes 1.14 distributions can bypass Docker and use containerd
   directly, see https://bit.ly/ubuntu-containerd or try it now with

     snap install microk8s --classic

どうも、Kubernetesっぽいですけど、なんでしょう?

MicroK8s

これは、MicroK8sというものらしいです。

MicroK8s - Fast, Light, Upstream Developer Kubernetes

ドキュメントは、こちら。

User Guide | MicroK8s

Canonicalによって提供される、シングルノードで動くKubernetesのようです。

第560回 microk8sでお手軽Kubernetes環境構築:Ubuntu Weekly Recipe|gihyo.jp … 技術評論社

同じような目的のものとしてMinikubeがあると思いますが、Minikubeとの違いは「snap」コマンド一発でインストール
できることみたいですね。

各種LinuxにおけるSnapのセットアップ方法と利用方法 | マイナビニュース

また、昨今話題に上がったk3sとの違いは、いろいろ削ったk3sとは異なり、あくまでシングルノードでKubernetesを動かすことに
フォーカスしているようです。

k3s と MicroK8s の違いを考える - Qiita

とりあえず、簡単に試してみましょう。

インスールして動かしてみる

今回の環境は、Ubuntu Linux 18.04 LTSです。

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.2 LTS
Release:    18.04
Codename:   bionic

Vagrant上で動かしています。

インストールは、以下のコマンドで。

$ sudo snap install microk8s --classic

バージョンを指定してインストールすることもできるようです。

$ sudo snap install microk8s --classic --channel=1.12/stable

今回は、バージョンを指定せずにインストールしています。

インスールには、数分かかりました。

「microk8s.〜」コマンドを使うようなので、シェル補完で見てみると次のようなコマンドがあるようです。

$ microk8s.
microk8s.config    microk8s.disable   microk8s.inspect   microk8s.kubectl   microk8s.start     microk8s.stop      
microk8s.ctr       microk8s.enable    microk8s.istioctl  microk8s.reset     microk8s.status

ステータスを見てみます。

$ microk8s.status
microk8s is running
addons:
jaeger: disabled
fluentd: disabled
gpu: disabled
storage: disabled
registry: disabled
ingress: disabled
dns: disabled
metrics-server: disabled
prometheus: disabled
istio: disabled
dashboard: disabled

アドオンが使えるようですが、現時点ではすべて無効です。

kubectlでバージョンを確認してみます。

$ microk8s.kubectl version
Client Version: version.Info{Major:"1", Minor:"14", GitVersion:"v1.14.0", GitCommit:"641856db18352033a0d96dbc99153fa3b27298e5", GitTreeState:"clean", BuildDate:"2019-03-25T15:53:57Z", GoVersion:"go1.12.1", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"14", GitVersion:"v1.14.0", GitCommit:"641856db18352033a0d96dbc99153fa3b27298e5", GitTreeState:"clean", BuildDate:"2019-03-25T15:45:25Z", GoVersion:"go1.12.1", Compiler:"gc", Platform:"linux/amd64"}

現時点では、Kubernetes v1.14.0がインストールされたようです。

稼働中のノードを取得。

$ microk8s.kubectl get nodes
NAME            STATUS   ROLES    AGE     VERSION
ubuntu-bionic   Ready    <none>   6m24s   v1.14.0

では、イメージをデプロイしてみます。

nginxのイメージを、Deploymentとしてデプロイ。

$ microk8s.kubectl create deployment nginx --image nginx:latest
deployment.apps/nginx created

確認。

$ microk8s.kubectl get all
NAME                        READY   STATUS    RESTARTS   AGE
pod/nginx-9d4cf4f77-c7zpb   1/1     Running   0          46s

NAME                 TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.152.183.1   <none>        443/TCP   21m

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

NAME                              DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-9d4cf4f77   1         1         1       47s

接続確認のため、Serviceを作成します。

$ microk8s.kubectl expose deployment nginx --port 80
service/nginx exposed

確認。

$ curl 10.152.183.104
<!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>

参照できましたね。

では、ラベルを確認して

$ microk8s.kubectl get all --show-labels 
NAME                        READY   STATUS    RESTARTS   AGE     LABELS
pod/nginx-9d4cf4f77-c7zpb   1/1     Running   0          4m47s   app=nginx,pod-template-hash=9d4cf4f77

NAME                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE   LABELS
service/kubernetes   ClusterIP   10.152.183.1     <none>        443/TCP   25m   component=apiserver,provider=kubernetes
service/nginx        ClusterIP   10.152.183.104   <none>        80/TCP    61s   app=nginx

NAME                    READY   UP-TO-DATE   AVAILABLE   AGE     LABELS
deployment.apps/nginx   1/1     1            1           4m48s   app=nginx

NAME                              DESIRED   CURRENT   READY   AGE     LABELS
replicaset.apps/nginx-9d4cf4f77   1         1         1       4m48s   app=nginx,pod-template-hash=9d4cf4f77

削除。

$ microk8s.kubectl delete all -l app=nginx
pod "nginx-9d4cf4f77-c7zpb" deleted
service "nginx" deleted
deployment.apps "nginx" deleted
replicaset.apps "nginx-9d4cf4f77" deleted

ところで、kubectlコマンドを使うのに「microk8s.kubectl」と入力するのが面倒な場合は、「aliasを作れ」だそうです。

$ sudo snap alias microk8s.kubectl kubectl

Accessing Kubernetes

起動と停止

MicroK8sの起動と停止を行ってみます。

まずは、今動いているMicroK8sを停止させます。

$ microk8s.stop
Stopped.

確認。

$ microk8s.status 
microk8s is not running. Use microk8s.inspect for a deeper inspection.

起動。

$ microk8s.start
Started.

アドオンを有効にする

MicroK8sには、いくつかアドオンがあるようです。

Kubernetes add-ons

デフォルトではすべて無効なのですが、dnsは有効にすることが推奨されているようなので、ちょっと有効にしてみましょう。

$ microk8s.enable dns
Enabling DNS
Applying manifest
service/kube-dns created
serviceaccount/kube-dns created
configmap/kube-dns created
deployment.extensions/kube-dns created
Restarting kubelet
DNS is enabled

確認。

$ microk8s.status
microk8s is running
addons:
jaeger: disabled
fluentd: disabled
gpu: disabled
storage: disabled
registry: disabled
ingress: disabled
dns: enabled
metrics-server: disabled
prometheus: disabled
istio: disabled
dashboard: disabled

dnsが「enabled」になりました。

アンインストール

最後に、MicroK8sをアンインストールします。

最初に、「microk8s reset」でリソース、イベントのクリーンアップを行います。

$ microk8s.reset

あとは、snapで削除。

$ sudo snap remove microk8s
microk8s removed

こんなところでしょうか。

とりあえず、シングルノードで動いて、簡単にインストールできるKubernetesとしては便利そうです。