WSL2でmicroK8sを使ってみた　～トラブルシューティングを添えて～

この記事は、[NTTテクノクロスAdvent Calnder 2021](https://qiita.com/advent-calendar/2021/ntt-tx)の12日目です。
NTTテクノクロスの@yuyhiraka (平川) と申します。

## 免責
この記事に記載の内容は個人的な取り組みの内容であり、所属する組織とは関係ありません。また、記事の中で手順を示しますが読者が手順を実際に行った場合において一切の責任を負いかねますので、自己責任のもとで行ってください。

## はじめに
手元で動くKubernetes環境としてminikubeを良く使っているのですがネットワーク構成の関係でNodePortが上手く使えないので今回はMicroK8sを使ってみました。（kubectl port-forwardしたくない。）

## マシンスペック
- Windows10 WSL2上のUbuntu 20.04 LTS
- CPU Intel(R) Core(TM) i7-10610U 1.80GHz
- Mem 16GB

# WSL2 Ubuntu 20.04 LTS上にMicroK8sを構築する
今回MicroK8sを利用します。MicroK8sはCanonical社による[有償サポートプラン(Ubuntu Advantage Desktop)](https://ubuntu.com/legal/ubuntu-advantage-service-description/ja) の適用範囲であり[NTTテクノクロス](https://www.ntt-tx.co.jp/column/tec/ubuntu/)がUbuntu Advantageの国内唯一の日本語対応可能の代理店となっています。[パンフレット](https://www.ntt-tx.co.jp/products/osscloud/documents/ubuntu_20210525.pdf)もあります。

実はMicroK8sは[Windowsに標準対応している](https://ubuntu.com/tutorials/install-microk8s-on-windows#1-overview)のですがWSL2でやってみたかったので今回はその方法は取りませんでした。

## WSL2上のOSを確認する
```
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04.3 LTS"
```

## WSL2でsnapが使えないので対処
※暫定対処
WSL2でsnapが使えないのは既知で複数の対処方法があります。これは一例になりますがサポート対象外のダーティな対処になります。
参考記事:[WSL2のUbuntuでsystemd（systemctl）とsnapが使えない](https://nnahito.com/articles/62)

## MicroK8sをインストールする
### snapが操作できることを確認
brokenになっているのが気になりますね。

```
$ sudo snap list
Name    Version  Rev    Tracking       Publisher   Notes
core18           2128   latest/stable  canonical✓  broken
lxd              21029  4.0/stable/…   canonical✓  broken
snapd            12704  latest/stable  canonical✓  broken
```

### 起動直後だと以下のエラーが出るので出なくなるまで待つ
```
$ sudo snap install microk8s
error: too early for operation, device not yet seeded or device model not acknowledged
```

### オプションが足りないと怒られる
```
$ sudo snap install microk8s
error: This revision of snap "microk8s" was published using classic confinement and thus may
       perform arbitrary system changes outside of the security sandbox that snaps are usually
       confined to, which may put your system at risk.

       If you understand and want to proceed repeat the command including --classic.
```

### 気を取り直してmicroK8sのインストールを試みる
```
$ sudo snap install microk8s --classic
microk8s (1.22/stable) v1.22.4 from Canonical✓ installed   
```

### 正常動作しているかを確認する
brokenではなくなっていることがわかります。

```
 sudo snap list
Name      Version   Rev    Tracking       Publisher   Notes
core18    20211028  2253   latest/stable  canonical✓  base
microk8s  v1.22.4   2695   1.22/stable    canonical✓  classic
snapd     2.53.2    14066  latest/stable  canonical✓  snapd
```

### microK8sのkubectlコマンドを触ってみる
```
$ sudo microk8s.kubectl version
Client Version: version.Info{Major:"1", Minor:"22+", GitVersion:"v1.22.4-3+adc4115d990346", GitCommit:"adc4115d990346b87714cc4f033d225711bf744d", GitTreeState:"clean", BuildDate:"2021-11-17T22:07:39Z", GoVersion:"go1.16.10", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"22+", GitVersion:"v1.22.4-3+adc4115d990346", GitCommit:"adc4115d990346b87714cc4f033d225711bf744d", GitTreeState:"clean", BuildDate:"2021-11-17T22:03:17Z", GoVersion:"go1.16.10", Compiler:"gc", Platform:"linux/amd64"}
```

```
$ sudo microk8s.kubectl get node
NAME         STATUS   ROLES    AGE     VERSION
node   Ready    <none>   5m59s   v1.22.4-3+adc4115d990346
```

## MicroK8s上のワークロードがWindows側から見れるか確認
### PodとServiceを作って確認する
```
$ sudo microk8s.kubectl run nginx --image nginx
pod/nginx created
$ sudo microk8s.kubectl expose pod nginx --port 80 --type NodePort --name nginx
service/nginx exposed
$ sudo microk8s.kubectl get pod
NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          94s
$ sudo microk8s.kubectl get svc
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.152.183.1     <none>        443/TCP        10m
nginx        NodePort    10.152.183.250   <none>        80:30099/TCP   58s
```

### Windows側のWebブラウザでアクセス
問題なくNodePortが機能していることが確認できます。
![firefox.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141357/35bb49e9-9e64-c9d5-3737-998f8a2cf369.png)

## トラブルシューティングとワークアラウンド
本ページを執筆するにあたって遭遇した問題のワークロードについて紹介します。

概要としては

- 問題1) WSL2再起動契機でmicroK8sが壊れる
- 問題2) microK8sがsnapで再インストールができなくなる

### 問題発生の契機
検証作業のためにまとまった時間が取れなかったので一度作業を中断したいと思いました。

そこで中断するためにcmd.exeを管理者権限で起動し

```
wsl.exe --shutdown
```

でWSL2停止。
しばらく時間が経ってから検証作業に復帰しWSL2を起動しkubectlコマンドを実行すると

```
$ sudo microk8s.kubectl get node
[sudo] password for user:
internal error, please report: running "microk8s.kubectl" failed: cannot find installed snap "microk8s" at revision 2695: missing file /snap/microk8s/2695/meta/snap.yaml
```
というエラーが出るようになってしまいます。　(★問題1)

以下を見るかぎりsnap的にbrokenになってしまっています。似た事象の内容の[フォーラム](https://forum.snapcraft.io/t/wsl2-ubuntu20-04-all-snaps-broken-after-each-reboot-even-snapd/24819)は見かけましたが関連するかは不明です。

```
$ sudo snap list
Name      Version  Rev    Tracking       Publisher   Notes
core18             2253   latest/stable  canonical✓  broken
microk8s           2695   1.22/stable    canonical✓  broken
snapd              14066  latest/stable  canonical✓  broken
```

色々と切り分けしても解決しないので仕方なくmicroK8sを再インストールすると今度は別の問題が発生しそもそもmicroK8sがインストールできなくなりました。　(★問題2)

```
$ sudo snap remove microk8s
microk8s removed
$ sudo snap install microk8s  --classic
error: cannot perform the following tasks:
- Run install hook of "microk8s" snap if present (run hook "install":
-----
++ /snap/microk8s/2695/bin/uname -m
/snap/microk8s/2695/meta/hooks/install: line 5: /snap/microk8s/2695/bin/uname: No such file or directory
+ ARCH=
-----)
```

デバッグモードを試しますが情報量は特に増えません。

```
$ sudo -i
# SNAPD_DEBUG=1 snap install microk8s --classic
2021/12/09 11:29:23.476801 tool_linux.go:204: DEBUG: restarting into "/snap/core/current/usr/bin/snap"
error: cannot perform the following tasks:
- Run install hook of "microk8s" snap if present (run hook "install":
# 
-----
++ /snap/microk8s/2695/bin/uname -m
/snap/microk8s/2695/meta/hooks/install: line 5: /snap/microk8s/2695/bin/uname: No such file or directory
+ ARCH=
-----)
```

当該エラーで検索しても有効な情報は見つからず途方に暮れたのでsnap自体を再インストールします。

```
# rootから一般ユーザに戻ります
# exit

$ sudo apt autoremove --purge snapd
$ sudo apt install snapd
```

無事に復旧しました。

```
$ sudo snap install microk8s --classic
2021-12-09T12:40:31+09:00 INFO Waiting for automatic snapd restart...
microk8s (1.22/stable) v1.22.4 from Canonical✓ installed
$ sudo microk8s.kubectl get node
NAME         STATUS     ROLES    AGE   VERSION
node   Ready   <none>   46s   v1.22.4-3+adc4115d990346
```

# まとめ
手元で動くKubernetes環境としてWSL2上にmicroK8sを構築できることがわかりました。  
一方、ワークアラウンドは見つけたものの検証において問題を2件発見しました。

```
問題1)
WSL2を再起動するとmicroK8sが使えなくなり「internal error, please report: running　～」というエラーが表示される。

問題2)
問題1のワークアラウンドとしてmicroK8sを再インストールを試みるが不思議な壊れ方をしてmicroK8sの再インストールができない
```

問題1, 問題2のどちらについても「発生のための環境的な前提条件」や「発生原因」の特定ができていないので調査してみるのも面白そうです。

明日は@nobeansによる[NTTテクノクロスAdvent Calnder 2021](https://qiita.com/advent-calendar/2021/ntt-tx)の記事です。お楽しみに！