この記事は、NTTテクノクロスAdvent Calnder 2021の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) の適用範囲でありNTTテクノクロスがUbuntu Advantageの国内唯一の日本語対応可能の代理店となっています。パンフレットもあります。
実はMicroK8sはWindowsに標準対応しているのですが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が使えない
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ブラウザでアクセス
トラブルシューティングとワークアラウンド
本ページを執筆するにあたって遭遇した問題のワークロードについて紹介します。
概要としては
- 問題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になってしまっています。似た事象の内容のフォーラムは見かけましたが関連するかは不明です。
$ 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の記事です。お楽しみに!