ローリングコンバットピッチなう!

AIとか仮想化とかペーパークラフトとか

microk8sのインストールから自作コンテナのpod化まで

microk8sはkubernetesのコンパクトバージョンです。
個人でkubernetesをちょっと動かしてみたい、勉強したいという方には手軽に試せる選択肢になると思います。

microk8sのインストールと、python3 + flaskベースの自作コンテナの起動をやってみたので紹介します。

まずはmicrok8sをインストール

下記のエントリでdockerコンテナをなんとか自作できました。次はmicrok8sをインストールし、作成したコンテナを動かしてみました。
rc30-popo.hatenablog.com


環境はUbuntu18.04です。VCPUを1コアだけ割り当てた仮想マシンでメモリは2GBしかありません。

まずはインストール可能なmicrok8sのバージョンを調べます。
こんな感じでchannelsというところにインストール可能なバージョンがずらずら出てきます。

$ snap info microk8s
name:      microk8s
summary:   Lightweight Kubernetes for workstations and appliances
publisher: Canonical✓
store-url: https://snapcraft.io/microk8s
contact:   https://github.com/ubuntu/microk8s
license:   unset
description: |
  MicroK8s is the smallest, simplest, pure production Kubernetes for
  clusters, laptops, IoT and Edge, on Intel and ARM. One command installs a
  single-node K8s cluster with carefully selected add-ons on Linux, Windows
  and macOS.  MicroK8s requires no configuration, supports automatic updates
  and GPU acceleration. Use it for offline development, prototyping, testing,
  to build your CI/CD pipeline or your IoT apps.
commands:
  - microk8s.add-node
  - microk8s.cilium
  - microk8s.config
  - microk8s.ctr
  - microk8s.dashboard-proxy
  - microk8s.dbctl
  - microk8s.disable
〜中略〜
  - microk8s.start
  - microk8s.status
  - microk8s.stop
services:
  microk8s.daemon-apiserver:            simple, enabled, active
  microk8s.daemon-apiserver-kicker:     simple, enabled, active
  microk8s.daemon-cluster-agent:        simple, enabled, active
  microk8s.daemon-containerd:           simple, enabled, active
  microk8s.daemon-control-plane-kicker: simple, enabled, active
  microk8s.daemon-controller-manager:   simple, enabled, active
  microk8s.daemon-etcd:                 simple, enabled, inactive
  microk8s.daemon-flanneld:             simple, enabled, inactive
  microk8s.daemon-kubelet:              simple, enabled, active
  microk8s.daemon-proxy:                simple, enabled, active
  microk8s.daemon-scheduler:            simple, enabled, active
snap-id:      EaXqgt1lyCaxKaQCU349mlodBkDCXRcg
tracking:     1.20/stable
refresh-date: 8 days ago, at 01:11 UTC
channels:
  1.20/stable:      v1.20.7         2021-05-17 (2213) 221MB classic
  1.20/candidate:   v1.20.7         2021-05-17 (2213) 221MB classic
  1.20/beta:        v1.20.7         2021-05-17 (2213) 221MB classic
  1.20/edge:        v1.20.7         2021-05-20 (2228) 221MB classic
  latest/stable:    v1.21.1         2021-05-18 (2210) 192MB classic
  latest/candidate: v1.21.1         2021-05-13 (2212) 192MB classic
  latest/beta:      v1.21.1         2021-05-13 (2212) 192MB classic
  latest/edge:      v1.21.1         2021-05-20 (2231) 191MB classic
  dqlite/stable:    –                                       
  dqlite/candidate: –                                       
  dqlite/beta:      –                                       
  dqlite/edge:      v1.16.2         2019-11-07 (1038) 189MB classic
  1.22/stable:      –                                       
  1.22/candidate:   –                                       
  1.22/beta:        –                                       
  1.22/edge:        v1.22.0-alpha.1 2021-04-28 (2177) 192MB classic
  1.21/stable:      v1.21.1         2021-05-17 (2210) 192MB classic
  1.21/candidate:   v1.21.1         2021-05-17 (2210) 192MB classic
  1.21/beta:        v1.21.1         2021-05-17 (2210) 192MB classic
  1.21/edge:        v1.21.1         2021-05-20 (2230) 191MB classic
  1.19/stable:      v1.19.10        2021-05-07 (2158) 216MB classic
  1.19/candidate:   v1.19.11        2021-05-14 (2211) 216MB classic
  1.19/beta:        v1.19.11        2021-05-14 (2211) 216MB classic
  1.19/edge:        v1.19.11        2021-05-12 (2211) 216MB classic
  1.18/stable:      v1.18.18        2021-04-23 (2140) 198MB classic
  1.18/candidate:   v1.18.19        2021-05-13 (2208) 198MB classic
  1.18/beta:        v1.18.19        2021-05-13 (2208) 198MB classic
  1.18/edge:        v1.18.19        2021-05-12 (2208) 198MB classic
  1.17/stable:      v1.17.17        2021-01-15 (1916) 177MB classic
 〜中略〜
  1.10/candidate:   ↑                                       
  1.10/beta:        ↑                                       
  1.10/edge:        ↑                                       

とりあえず 1.20/stableをインストールします。

$ sudo snap install microk8s --channel  1.20/stable --classic

特にハマる事無くインストール自体は完了しました。

dashboardをenableしてアクセスする

インストール直後の初期状態ではdashboardはdisableの様です。
下記コマンドでenableにします。

$ sudo microk8s.enable dashbaord

次にdashboardにログインするためのtokenを調べます。

$ sudo microk8s kubectl -n kube-system describe secret $(microk8s kubectl -n kube-system get secret | grep default-token | awk '{print $1}')

やたらにたくさんtokenが表示されるのですが、下記の様に「kubernetes-dashboard-token..」となっている部分のtoken:以下をどこかにコピーしておきます。

Name:         kubernetes-dashboard-token-l5l77
Namespace:    kube-system
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: kubernetes-dashboard
              kubernetes.io/service-account.uid: 2aa69496-e09c-482c-ad69-5d65c19916d9

Type:  kubernetes.io/service-account-token

Data
ca.crt:     1103 bytes
namespace:  11 bytes
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6Ik9YdkZDLTZ〜以下、省略〜

そしてdashboardにアクセス出来る様にポートマップを行います。

$ sudo microk8s kubectl port-forward -n kube-system service/kubernetes-dashboard --address 0.0.0.0 10443:443
Forwarding from 0.0.0.0:10443 -> 8443

Firefoxでmicrok8sが動いているホストのポート10443にhttpsでアクセスします。
(下記の例ではmicrok8sを動かしているubuntu18.04サーバーのIPアドレスが192.168.11.252で、別のマシンからFirefox起動してアクセスしています)
すると下記の様なエラーが出るのですが、「詳細情報」をクリック、表示された「危険性を承知で続行」をクリックするとセキュリティtokenの入力画面にすすみます。
ちなみにchromeでもエラーが出るのですが、chromeの場合、Firefoxの様に警告を無視して強行突破出来ない様です。なのでFirefoxを使います。
(2021/05/30時点)

この画面にtokenを貼り付けます。

成功するとこんな画面が表示されます。

自作コンテナを動作させるためのPodを定義する

前回の記事で作成したflask版hello worldを含んだdockerイメージflask-helloを実行するためのPodの定義ファイルをyamlで書きます。
Podはコンテナ動かすための論理的なホストらしいです。

pod-flaskhello.yamlというファイル名で下記の様に作成します。
これはflask-helloをローカルリポジトリからイメージを読みだして起動し、microk8sが動作するホストのポート10000をコンテナのポート5000にマップします。
上手く行けば、Pod起動後、curl http://<ホストのIP>:10000で"Hello World!!"という文字列が返ってくるはずです。

apiVersion: v1
kind: Pod
metadata:
                name: flask-hello
                labels:
                        app: flask-hello
spec:
        containers:
        - name: hello-flask
          image: myubuntu:flask-hello
          imagePullPolicy: Never
          ports:
          - containerPort: 5000
            hostPort: 10000

このyamlファイルを作成したら、以下を実行するとPodが生成されコンテナが起動するのですが、最初に実行した時にはエラーが出てPodが走行状態になりませんでした。

$ sudo microk8s kubectl create -f pod-flaskhello.yaml

調べたところ、microk8sのローカルリポジトリとmicrok8s導入以前からインストールされていたdockerのローカルリポジトリは独立しているらしく、microk8sからはflask-helloのイメージが引っ張れない様です。(先ほどのdashboardからPodの状態を確認、エラーメッセージから判断)

これを解決する必要があります。

DockerイメージをExportして、microk8sにImportする

dockerコマンドでflask-helloをtar ballにExportします。そのtar ballをmicrok8sにImportすると、microk8sからflask-helloが起動出来るようになります。同じコンテナイメージを2重に持つのでストレージは余分に消費します。docker側のローカルリポジトリを外部解放してmicrok8sからアクセスさせる方法もある様ですが、そちらは試していません。

$ docker save myubuntu:flask-hello -o flask-hello.tar
$ sudo microk8s ctr image import flask-hello.tar

完了したらflask-hello.tarは削除して構いません。
下記コマンドでflash-helloがmicrok8sのイメージとしてImportされた事を確認します。

$ sudo microk8s ctr image ls
〜中略〜
docker.io/library/myubuntu:flask-hello                                                                         application/vnd.docker.distribution.manifest.v2+json      sha256:d96d5dc05398d299b3f18e34d8d0aba837587c98fa15182f8a36256ec7c70427 473.4 MiB linux/amd64                                                 io.cri-containerd.image=managed 
〜中略〜

microk8sにはインストール直後の状態でもmicrok8s自身のモジュールがコンテナイメージとして登録されているのでお目当てのイメージの情報を探すのは少し大変かも知れません。

出来たら、再度kubectl createでflask-helloを起動してみます。

$ sudo microk8s kubectl create -f pod-flaskhello.yaml
pod/flask-hello created

こんな感じでシンプルに「pod/flask-hello created」とレスポンスが返ります。
試しにcurlで自ホストのポート10000にアクセスしてみます。

$ curl http://localhost:10000
Hello World!!

動いているみたいですね。
Firefoxで表示させているdashboardの上でPodの状態を確認すると、新しいPodが生成されrunning状態になっているのが確認できました。

これで自分でdockerイメージを作成し、microk8s上でPodを建てて動かすことが出来る様になりました。ここまでくれば、後は色々といじって遊ぶ事が出来ます。(多分)
microだけど、一応おうちkubernetesの完成です(笑)

続きはこちら

本エントリではPodを単体で起動するのみですが、serviceを定義して複数のpodにロードバランシングするまでやってみました。
下記エントリーをどうぞ。

rc30-popo.hatenablog.com