MicroK8sでアプリケーションを動かす

以下の記事でMicroK8sをインストールしてみたので、MicroK8s上でアプリケーションを動かしてみたいと思います。

MicroK8sをMacOSにインストールしてみる

  • docker.ioのコンテナイメージを実行する
  • オリジナルコンテナイメージを実行する
    • docker registryを構築する
    • docker registryにオリジナルコンテナイメージを登録する
    • オリジナルコンテナイメージを実行する

docker.ioのコンテナイメージを実行する


最初にdocker.ioのコンテナイメージからアプリケーションを実行します。

以下のコマンドで、ベースイメージbusyboxを使って”Hello World”を出力するPodを作成します。

root@microk8s-vm:~# microk8s kubectl run hello --restart=Never --image=busybox -- echo "Hello World"

確認してみると、以下のように”Hello World”を出力していることがわかります。

root@microk8s-vm:~# microk8s kubectl get pods
NAME    READY   STATUS      RESTARTS   AGE
hello   0/1     Completed   0          65s
root@microk8s-vm:~# microk8s kubectl logs hello
Hello World

ということで、kubernetesと全く同じようにアプリケーションを実行できることが確認できました。

オリジナルコンテナイメージを実行する


次に自身で作成したオリジナルコンテナイメージを以下の構成でMicroK8sで動かします。

docker registryを構築する


以下のコマンドでdocker registryコンテナを作成します。今回は永続ボリュームは付与しません。

root@microk8s-vm:~# microk8s.kubectl run registry --image=registry --port=5000
pod/registry created
root@microk8s-vm:~# microk8s.kubectl get pods
NAME       READY   STATUS      RESTARTS   AGE
hello      0/1     Completed   0          6h56m
registry   1/1     Running     0          93s

作成したら、MacPCからアクセスできるようにNodePortで公開します。

root@microk8s-vm:~# microk8s.kubectl expose pod registry --type=NodePort --name=registry-service
service/registry-service exposed
root@microk8s-vm:~# microk8s.kubectl get svc
NAME               TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
kubernetes         ClusterIP   10.152.183.1    <none>        443/TCP          20h
registry-service   NodePort    10.152.183.23   <none>        5000:32147/TCP   8s

docker registryにオリジナルコンテナイメージを登録する


構築したdocker registryにオリジナルコンテナイメージを登録します。オリジナルコンテナイメージは、golangでcssファイルを読み込むで作成したwebコンテナイメージを利用します。

ifconfigコマンドでmultipassのVM IPアドレスを調べて、~/.docker/daemon.jsonに以下の内容を追記します。ポート番号はNodePortで公開したポートです。

"insecure-registries":["192.168.64.2:32147"]

dockerを起動し、以下のコマンドでdocker registryにオリジナルコンテナイメージを登録します。

$ docker push 192.168.64.2:32147/web
The push refers to repository [192.168.64.2:32147/web]
aa26d6c54ca2: Pushed 
51b5da98010b: Pushed 
6510ca638cc9: Pushed 
6e69dbdef94b: Pushed 
f0c38edb3fff: Pushed 
ef234633eec2: Pushed 
8967306e673e: Pushed 
9794a3b3ed45: Pushed 
5f77a51ade6a: Pushed 
e40d297cf5f8: Pushed 
latest: digest: sha256:860250e45f5851832e2c7632b3e6e1b2c7b89319fdd521bc99262baad6b992cc size: 2421

オリジナルコンテナイメージを実行する


以下のコマンドで登録したオリジナルコンテナイメージを実行します。

root@microk8s-vm:~# microk8s.kubectl run web --image=localhost:32147/web --port=8080 --insecure-skip-tls-verify
pod/web created
root@microk8s-vm:~# microk8s.kubectl get pods
NAME       READY   STATUS      RESTARTS   AGE
hello      0/1     Completed   0          7h28m
registry   1/1     Running     0          33m
web        1/1     Running     0          6s

NodePortで公開し、Mac PCからアクセスできるようにします。

root@microk8s-vm:~# microk8s.kubectl expose pod web --type=NodePort --name=web
service/web exposed
root@microk8s-vm:~# microk8s.kubectl get svc
NAME               TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
kubernetes         ClusterIP   10.152.183.1    <none>        443/TCP          20h
registry-service   NodePort    10.152.183.23   <none>        5000:32147/TCP   26m
web                NodePort    10.152.183.60   <none>        8080:30162/TCP   29s

192.168.64.2:30162でアクセスしたところ、以下の画面になりました。

冷静に考えると、バックエンドのsearcherとdbを動かしてなかったので、エラーになってました。。。もっと早く気づくべきだった。。

# microk8s.kubectl logs web
2020/06/07 13:19:35 http: panic serving 10.1.2.1:51940: runtime error: invalid memory address or nil pointer dereference
goroutine 18 [running]:
net/http.(*conn).serve.func1(0xc000096000)
    /usr/local/go/src/net/http/server.go:1772 +0x139
panic(0x7993a0, 0xb09820)
    /usr/local/go/src/runtime/panic.go:975 +0x3e3
main.glob..func1(0x890ac0, 0xc0000c0000, 0xc0000a0300)
    /go/src/web/main.go:36 +0xc6
net/http.HandlerFunc.ServeHTTP(0x81cc60, 0x890ac0, 0xc0000c0000, 0xc0000a0300)
    /usr/local/go/src/net/http/server.go:2012 +0x44
net/http.(*ServeMux).ServeHTTP(0xb19820, 0x890ac0, 0xc0000c0000, 0xc0000a0300)
    /usr/local/go/src/net/http/server.go:2387 +0x1a5
net/http.serverHandler.ServeHTTP(0xc000136000, 0x890ac0, 0xc0000c0000, 0xc0000a0300)
    /usr/local/go/src/net/http/server.go:2807 +0xa3
net/http.(*conn).serve(0xc000096000, 0x891440, 0xc00009c000)
    /usr/local/go/src/net/http/server.go:1895 +0x86c
created by net/http.(*Server).Serve
    /usr/local/go/src/net/http/server.go:2933 +0x35c

まぁ、今回はKubernetesと同じように動かせることが分かっただけで良しとします。

中途半端になってしまいましたが、以上です!