仮想化通信

日本仮想化技術株式会社の公式エンジニアブログ

MinikubeをPodman Driverで使う

はじめに

MinikubeはシングルノードのKubernetes環境をローカル環境に簡単にセットアップできるツールです。 Linuxのほか、Windows、macOSに対応しています。

実行方法は対応するハイパーバイザーをインストールしておいて、Minikubeをダウンロードして実行するだけでKubernetesクラスターを実行できます。

対応するドライバーは以下に纏まっています。

minikube.sigs.k8s.io

上記サイトからLinuxのドライバーを抜き出すと、次のようになります。 多くの場合はKVM2もしくはDockerドライバーを使っていると思います。Noneはベアメタル環境下にMinikubeでKubernetesをセットアップするオプションですが、それなりに制約があるので使いにくいかもしれません。

  • Docker - container-based (preferred)
  • KVM2 - VM-based (preferred)
  • VirtualBox - VM
  • None - bare-metal
  • Podman - container (experimental)

久しぶりにドライバーがまとまっているページを見たら「Podman - container (experimental)」というものが追加されていたので、早速使ってみることにしました。ちなみにPodman Driverは現状amd64アーキテクチャーでしか動作しないため、注意が必要です。

まずはホストOSのセットアップ

Linuxであればどのディストリビューションでも良かったのですが、今回はリリースしたてだったopenSUSE Leap 15.2(以降openSUSE)を利用しました。 以下、使いたいLinuxディストリビューションに置き換えていただければ、同じようにセットアップできると思います。

OSをインストーラーでセットアップします。ファイアウォールはセットアップ時に切っておきました。切りたくない場合は、TCP/22、TCP/6443、TCP/30000-32767などを最低限開けておいてください。

セットアップ後、Podmanをインストールします。openSUSEの場合は

$ sudo zypper install podman

Linux版のminikubeでPodmanを使う場合は、コンテナーの実行にroot権限が必要ではあるものの、Minikube自体はrootユーザーでは実行することができません。そこでPodman Driverのページの説明にあるように、以下の設定を行っておきます。「username」のところは実際、minikubeコマンドを実行するユーザー名に置き換えて記述します。

$ sudo visudo
...
username ALL=(ALL) NOPASSWD: /usr/bin/podman

Minikubeのインストール

Minikubeを以下のように実行してインストールします。

$ curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 \
  && chmod +x minikube
$ sudo mkdir -p /usr/local/bin/
$ sudo install minikube /usr/local/bin/

Minikubeのセットアップとクラスターの作成

全ての設定を終えたら、まずは次のように実行してみます。 数分待つと、Kubernetesクラスターの出来上がりです。

$ minikube start --vm-driver=podman
😄  "Opensuse-Leap" "15.2" (vbox/amd64) 上の minikube v1.12.0
✨  設定を元に、 podman (experimental) ドライバを使用します
👍  Starting control plane node minikube in cluster minikube
💾  Kubernetes v1.18.3 のダウンロードの準備をしています
    > preloaded-images-k8s-v4-v1.18.3-docker-overlay2-amd64.tar.lz4: 526.27 MiB
🔥  Creating podman container (CPUs=2, Memory=1979MB) ...
🐳  Docker 19.03.2 で Kubernetes v1.18.3 を準備しています...
🔎  Verifying Kubernetes components...
🌟  Enabled addons: default-storageclass, storage-provisioner
🏄  Done! kubectl is now configured to use "minikube"
💗  Kubectl not found in your path
👉  You can use kubectl inside minikube. For more information, visit https://minikube.sigs.k8s.io/docs/handbook/kubectl/
💡  最適な結果を得るには、kubectl を次のサイト https://kubernetes.io/docs/tasks/tools/install-kubectl/ からインストールしてください

$ minikube kubectl get no
    > kubectl.sha256: 65 B / 65 B [--------------------------] 100.00% ? p/s 0s
    > kubectl: 41.99 MiB / 41.99 MiB [---------------] 100.00% 10.54 MiB p/s 4s
NAME       STATUS   ROLES    AGE   VERSION
minikube   Ready    master   45s   v1.18.3

いらなくなったクラスターは minikube stop で停止、 minikube delete で削除可能です。

$ minikube delete
🔥  podman の「minikube」を削除しています...
🔥  Deleting container "minikube" ...
🔥  /home/ytooyama/.minikube/machines/minikube を削除しています...
💀  Removed all traces of the "minikube" cluster.

デフォルト設定のminikube startでは、最新のStableバージョン(執筆時点ではv1.18)、ネットワークはブリッジ接続、ランタイムはDockerが使われてクラスターがデプロイされます。一般的なKubernetesのように特定のランタイム、特定のコンテナネットワークアドオンを利用したい場合は、次のようにコマンド実行します。

$ minikube start --container-runtime=containerd --network-plugin=cni --cni=bridge --extra-config=kubeadm.pod-network-cidr=10.244.0.0/16

クラスター作成後、 minikube kubectl コマンドを引き続き利用してもようですが、少々オプションが通常のkubectlツールと異なるので、次のドキュメントに従ってインストールしておきます。インストール済みだとkubeconfigもminikubeがよしなにやってくれます。

kubernetes.io

kubeadm.pod-network-cidrは、CNIにより適切なネットワークセグメントを指定します。

CNIとしてFlannelを使いたい場合は次のように実行します。これはCoreOS/Flannelに書かれているコマンドと同一です。Kubernetesのバージョンによって違うバージョンを指定する場合があるかもしれません(1.17以前の場合)。

$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

ステータスを確認します。

$ minikube status
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured

このようなYAMLを用意します。

$ cat hello-pods.yaml 
---
apiVersion: v1
kind: Pod
metadata:
  name: hello-pods
spec:
  containers:
    - name: hello-pods
      image: busybox
      tty: true

Podを作ってみます。

$ kubectl create -f hello-pods.yaml 

Podから外のネットワークにアクセスしてみましょう。プロキシーが必要な環境では少々設定を行わないと外部にアクセスできないかもしれません。

$ kubectl exec -it hello-pods -- ping -c3 virtualtech.jp
PING virtualtech.jp (124.35.85.83): 56 data bytes
64 bytes from 124.35.85.83: seq=0 ttl=50 time=8.968 ms
64 bytes from 124.35.85.83: seq=1 ttl=50 time=8.632 ms
64 bytes from 124.35.85.83: seq=2 ttl=50 time=8.861 ms

--- virtualtech.jp ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 8.632/8.820/8.968 ms

Minikubeノードにアクセスしてみる

今回のセットアップ例ではPodman Driverを使ったため、MinikubeはPodmanコンテナーの中で動いています。 Minikubeノードへは minikube ssh コマンドでアクセスできるため、早速覗いてみましょう。

PodmanコンテナーでMinikubeが動いている(正確にはMinikubeでデプロイしたKubernetesクラスターが実行されている)ことが確認できます。

$ sudo podman ps
CONTAINER ID  IMAGE                                COMMAND  CREATED         STATUS             PORTS                                                                                                     NAMES
acd4ebe61ebb  gcr.io/k8s-minikube/kicbase:v0.0.10           12 minutes ago  Up 12 minutes ago  127.0.0.1:42521->22/tcp, 127.0.0.1:36845->2376/tcp, 127.0.0.1:43067->5000/tcp, 127.0.0.1:38509->8443/tcp  minikube

Minikubeノードにアクセスします。

$ minikube ssh
docker@minikube:~$ 

crictlコマンドを使って、containerdコンテナーの一覧を出してみます。これらのコンテナーはPodmanの中のコンテナーで実行されています(Container in Container)。なんかすごいですね。

docker@minikube:~$ sudo crictl pods
POD ID              CREATED             STATE               NAME                               NAMESPACE           ATTEMPT
aa56b3fb34836       5 minutes ago       Ready               hello-pods                         default             0
e7fbd37f5cb3b       11 minutes ago      Ready               kube-flannel-ds-amd64-4br4v        kube-system         0
17de410ba9307       11 minutes ago      Ready               storage-provisioner                kube-system         0
b0b44c01fb000       11 minutes ago      Ready               coredns-66bff467f8-nwldb           kube-system         0
2488ba0bff180       12 minutes ago      Ready               kube-proxy-jpcvj                   kube-system         0
7e114d3085951       12 minutes ago      Ready               kube-scheduler-minikube            kube-system         0
35b2868a2c644       12 minutes ago      Ready               kube-apiserver-minikube            kube-system         0
3ebb67441bd86       12 minutes ago      Ready               kube-controller-manager-minikube   kube-system         0
a3ec950d551e5       12 minutes ago      Ready               etcd-minikube                      kube-system         0

MinikubeをPodmanドライバーで使う場合に注意すること

最初に書いたように、PodmanドライバーはExperimentalという扱いなのでまだまだ安定していなかったり、想定どおり動かない場合があったりするのに注意する必要があると思います。

また、私が触ってみた時点ではランタイムとしてCRI-Oを使うと、コンテナー内部からの名前引きがうまくいかないことがありました。containerdやDockerランタイムでは問題なく動作しました。困る人は困るかもしれません。

備考

本ブログ記事は2020年7月13日現在の設定方法をまとめた記事です。minikube v1.12.0およびPodman 1.8.0の環境で動作確認しており、手元ではKubernetes 1.18.3のクラスターが正常に動作するのを確認しています。