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の完成です(笑)
参考にした記事等
https://gihyo.jp/admin/serial/01/ubuntu-recipe/0560
https://knowledge.sakura.ad.jp/3681/
https://www.server-world.info/query?os=Ubuntu_20.04&p=microk8s&f=4
https://microk8s.io/docs/registry-images
続きはこちら
本エントリではPodを単体で起動するのみですが、serviceを定義して複数のpodにロードバランシングするまでやってみました。
下記エントリーをどうぞ。