MicroK8s を AWS Lightsail に導入失敗

## 本記事の内容
Kubernetes（K8s）を学習するために、AWS Lightsail (メモリ1GB)に「MicroK8s」をインストールしてみました。

[MicroK8s - Zero-ops Kubernetes for developers, edge and IoT](https://microk8s.io)

結論から言うと、1GBのインスタンスはMicroK8sにはスペック不足でした。
まず、最新版のv1.20はインストールに失敗しました。起動に時間がかかり、タイムアウトしているようでした。
また、v1.19はインストールできましたが、K8sの起動を待機する`microk8s status --wait-ready`が40分待っても完了しませんでした。
その間、CPU使用率は90%以上で、バーストキャパシティーを消費し続けます。

v1.18は`microk8s status --wait-ready`が約6分で完了し、CPU使用率も持続可能ゾーンに収まるため、何とか使えそうです。

ただ、せっかく勉強するなら最新版を使いたいので、私は古いノートPC（Core 2 Duo、メモリ4GB）にUbuntuを入れて学習することにしました。
Windows 10の動作にはちょっと厳しく眠っていたPCですが、Ubuntu + MicroK8sの学習には十分なスペックです。

※本格的に学習するなら、ラズパイ4（メモリ4GB or 8GB）を3台用意して、クラスター組むのが理想な気がします。

今回は失敗談に近いですが、参考になればと思い投稿しました。

## 前提条件
- Lightsailインスタンス（Linux）を作成済み。

本記事は、Lightsailの5ドルプラン（メモリ1GB）、CentOS バージョン 7.9.2009 で作成。
構築手順は下記記事にまとめています。
※下記記事では3.5ドルプラン（メモリ512MB）ですが、本記事の内容を試す場合は最低でも5ドルプラン（メモリ1GB）を選択してください。

[AWS Lightsail 入門1 インスタンス作成](https://qiita.com/s8ta/items/fd274b05b083bcf36dba)
[AWS Lightsail 入門2 SSH接続（RLogin）](https://qiita.com/s8ta/items/688aa803d2874feff82c)
[AWS Lightsail 入門3 基本設定（管理画面）](https://qiita.com/s8ta/items/d3e475c8f26580c9ce5e)
[AWS Lightsail 入門4 基本設定（CentOS 7）](https://qiita.com/s8ta/items/696fc68b27b91128251a)

## インストール手順
### 1. snapd のインストール
EPELリポジトリ追加

```
$ sudo yum install -y epel-release
```

snapdインストール

```
$ sudo yum install -y snapd
```

snapd有効化

```
$ sudo systemctl enable --now snapd.socket
```

シンボリックリンク作成

```
$ sudo ln -s /var/lib/snapd/snap /snap
```

一度ログアウト後、再ログインする。

### 2. MicroK8s のインストール

v1.18を指定してインストール。

```
$ sudo snap install microk8s --classic --channel=1.18/stable
```

### 3. MicroK8s の設定

#### 権限設定

```
$ sudo usermod -a -G microk8s $USER
$ sudo chown -f -R $USER ~/.kube
```
一度ログアウト後、再ログインする。

#### Kubernetesの起動待機
下記コマンドを入力し、Kubernetesの起動を待つ。
※Lightsail 1GBでは約6分かかった。

```
$ microk8s status --wait-ready
microk8s is running
addons:
cilium: disabled
dashboard: disabled
dns: disabled
fluentd: disabled
gpu: disabled
helm: disabled
helm3: disabled
ingress: disabled
istio: disabled
jaeger: disabled
knative: disabled
kubeflow: disabled
linkerd: disabled
metallb: disabled
metrics-server: disabled
prometheus: disabled
rbac: disabled
registry: disabled
storage: disabled
```

## インストール後のリソース確認

Lightsail管理画面で確認したところ、CPU使用率は約6.7%で安定し、持続可能ゾーンに収まりました。
ただし、拡張機能は全て無効で、他のアプリは未起動でこの状態なので、実用にはちょっと厳しいかもしれません。

<img width="80%" alt="microk8s-lightsail-01-001.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1010477/08cbdce2-55cf-4c7b-8472-ded339ba383e.png">

v1.18のメモリ使用量は下記の通りです。

```
$ free -h
              total        used        free      shared  buff/cache   available
Mem:           989M        448M         72M        6.7M        468M        392M
Swap:          2.0G        186M        1.8G
```

参考までに、ノートPC（Ubuntu、メモリ4GB）でv1.20を起動した際のメモリ使用量です。
MicroK8sの起動のみで1.2GB使用しており、Lightsail 1GBで動かないのが納得できました。
※拡張機能の「ha-cluster」がデフォルトで有効になっています。

```
$ free -h
              total        used        free      shared  buff/cache   available
Mem:          3.8Gi       1.2Gi       395Mi        96Mi       2.1Gi       2.3Gi
Swap:         2.0Gi          0B       2.0Gi
```

```
$ microk8s status --wait-ready
microk8s is running
high-availability: no
  datastore master nodes: 127.0.0.1:19001
  datastore standby nodes: none
addons:
  enabled:
    ha-cluster           # Configure high availability on the current node
  disabled:
    ambassador           # Ambassador API Gateway and Ingress
    cilium               # SDN, fast with full network policy
    dashboard            # The Kubernetes dashboard
    dns                  # CoreDNS
    fluentd              # Elasticsearch-Fluentd-Kibana logging and monitoring
    gpu                  # Automatic enablement of Nvidia CUDA
    helm                 # Helm 2 - the package manager for Kubernetes
    helm3                # Helm 3 - Kubernetes package manager
    host-access          # Allow Pods connecting to Host services smoothly
    ingress              # Ingress controller for external access
    istio                # Core Istio service mesh services
    jaeger               # Kubernetes Jaeger operator with its simple config
    keda                 # Kubernetes-based Event Driven Autoscaling
    knative              # The Knative framework on Kubernetes.
    kubeflow             # Kubeflow for easy ML deployments
    linkerd              # Linkerd is a service mesh for Kubernetes and other frameworks
    metallb              # Loadbalancer for your Kubernetes cluster
    metrics-server       # K8s Metrics Server for API access to service metrics
    multus               # Multus CNI enables attaching multiple network interfaces to pods
    portainer            # Portainer UI for your Kubernetes cluster
    prometheus           # Prometheus operator for monitoring and logging
    rbac                 # Role-Based Access Control for authorisation
    registry             # Private image registry exposed on localhost:32000
    storage              # Storage class; allocates storage from host directory
    traefik              # traefik Ingress controller for external access
```

## MicroK8s のアンインストール方法
下記コマンドで簡単に行えます。

```
$ sudo snap remove microk8s
```

## まとめ
「MicroK8s」の名前から、「とても小さなK8s → 低スペックでも動く！」とイメージしていましたが、誤りでした。
MicroK8sはKubernetesの仕様を満たし、最小限ではあるものの本番運用にも耐えうる可用性を持っているようです。

また、バージョンによって必要なスペックが大きく異なるため、過去の事例を参考にする場合は要注意です。
特に、v1.18、v1.19、v1.20の間には、大きな壁が存在します。（v1.19から追加されたHAクラスターの影響が大きそうです）

公式サイトでは、推奨メモリは4GBとなっています。
MicroK8sの導入作業自体はとても簡単なので、必要スペックを満たす環境を用意できれば、学習には良いと思います。
もしも使っていないPCがあれば、Ubuntuをインストールし、その上にMicroK8sをインストールするのが簡単です。（Ubuntuはsnapが導入済み）

本記事が、これからK8sを学習する方の参考になれば幸いです。