はじめに
MinikubeはシングルノードのKubernetes環境をローカル環境に簡単にセットアップできるツールです。 Linuxのほか、Windows、macOSに対応しています。
実行方法は対応するハイパーバイザーをインストールしておいて、Minikubeをダウンロードして実行するだけでKubernetesクラスターを実行できます。
対応するドライバーは以下に纏まっています。
上記サイトから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がよしなにやってくれます。
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のクラスターが正常に動作するのを確認しています。