とことんDevOps | 日本仮想化技術が提供するDevOps技術情報メディア

DevOpsに関連する技術情報を幅広く提供していきます。

日本仮想化技術がお届けするとことんDevOpsでは、DevOpsに関する技術情報や、日々のDevOps業務の中での検証結果など、DevOpsのお役立ち情報をお届けします。
主なテーマ: DevOps、CI/CD、アジャイル開発、コンテナ開発など

開催予定の勉強会

各種SNSのフォローもよろしくお願いいたします。

minikubeのはじめ方

2022-12-07に「Kubernetes再入門」というタイトルで勉強会に登壇しました。

devops-blog.virtualtech.jp

そこで「勉強する環境がほしいが、どのように準備したらよいか」という質問をいただきましたので、ローカルで試す場合の環境の用意なんかを取り上げてみたいと思います。

minikube???

「ミニクーベ」「ミニクベ」なんて読みます。これはローカル環境でKubernetesを簡単に実行するためのツールです。Kubernetesを1から自前で用意するのは構築も運用も大変なので、私はこれをよく使います。

kubernetes.io

使ってみる

https://minikube.sigs.k8s.io/docs/start/

ホストマシンに必要なスペックは以下の通り。

2 CPUs or more
2GB of free memory
20GB of free disk space
Internet connection
Container or virtual machine manager, such as: Docker, QEMU, Hyperkit, Hyper-V, KVM, Parallels, Podman, VirtualBox, or VMware Fusion/Workstation

CPU 2コア以上、空きメモリ2GB以上、空きストレージ20GB以上で、かつ、ネットに繋がっている必要があります。コンテナかVMで「Docker, QEMU, Hyperkit, Hyper-V, KVM, Parallels, Podman, VirtualBox, or VMware Fusion/Workstation」が必要です。迷ったらDockerかVirtualBoxを入れておくのが一番簡単な気がします。

Get Startedにはインストール方法も記載されています。インストールするOSを選択するとインストール方法が見れますので、その手順に従ってください。検証環境がMacならHomebrewから入れてしまってもいいかもしれません。

brew install minikube

それではいよいよ起動します。

minikube start

これだけです。プロビジョニングに少し時間がかかるので、コーヒーでも飲みながら待ちましょう。

minikubeの使い方を見たい場合はminikubeのみで実行するといいでしょう。サブコマンドの使い方を見たい場合はminikube <command> --helpで見られます。例えば、先ほどのminikube startのオプションを見たい場合はminikube start --helpとするといいです。

プロビジョニングが完了すると~/.kube/configにminikubeのエントリーが追加されます。minikubeが操作対象になっているか、以下のコマンドで確認してみてください。

kubectl config current-context

それでは、いよいよローカルでKubernetesを使ってみます。

まずはNodeの状態を取得してみます。

kubectl get nodes
NAME       STATUS   ROLES           AGE     VERSION
minikube   Ready    control-plane   5m55s   v1.25.3

今回はKubernetesバージョンv1.25.3が起動しました。minikubeは直近3つのマイナーリリースをサポートしています。

https://minikube.sigs.k8s.io/docs/handbook/config/#selecting-a-kubernetes-version

minikube follows the Kubernetes Version and Version Skew Support Policy, so we guarantee support for the latest build for the last 3 minor Kubernetes releases. When practical, minikube aims to support older releases as well so that users can emulate legacy environments.

起動できるKubernetesバージョンは以下から確認することができます。

https://kubernetes.io/releases/

minikube start --kubernetes-version=X.XX.Xの様に指定します。1.26のような指定はできません。1.26.0のようにpatchバージョンまで含めてください。

Nodeの状態を見ると、Nodeが1つしかないことがわかりますね。もしホストマシンでリソースが余っているならNodeを複数にしても面白いかもしれません。以下のコマンドでNodeを追加してみます。

minikube node add

以下で確認します。

kubectl get nodes -o wide

ROLESが<node>のNodeが増えていれば成功です。

NAME           STATUS   ROLES           AGE   VERSION   INTERNAL-IP      EXTERNAL-IP   OS-IMAGE               KERNEL-VERSION   CONTAINER-RUNTIME
minikube       Ready    control-plane   29m   v1.25.3   192.168.205.39   <none>        Buildroot 2021.02.12   5.10.57          containerd://1.6.8
minikube-m02   Ready    <none>          17s   v1.25.3   192.168.205.40   <none>        Buildroot 2021.02.12   5.10.57          containerd://1.6.8

minikube node listでもノードの一覧は取れるのですが、情報量が少ないので私はいつもkubectlをつかってしまいます。

せっかくノードを起動したのでWorkshopでよくつかわれているpodinfoをデプロイしてみます。

github.com

kubectl apply -k github.com/stefanprodan/podinfo//kustomize

-kはkustomizeを処理するというオプションです。kustomizeは簡単にいうと複数のマニフェストをいい感じにまとめてapplyしてくれるツールです。詳細についてはこちらをご覧ください。

service/podinfo created
deployment.apps/podinfo created
Warning: autoscaling/v2beta2 HorizontalPodAutoscaler is deprecated in v1.23+, unavailable in v1.26+; use autoscaling/v2 HorizontalPodAutoscaler
horizontalpodautoscaler.autoscaling/podinfo created

Warningが出るかもしれないですが、色々createdされたのがわかります。

どのNodeにデプロイされたのか見てみましょう。

kubectl get pods -l app=podinfo -o wide

NODEの項目を見ると、どのNodeにデプロイされたのかがわかります。

NAME                       READY   STATUS              RESTARTS   AGE     IP          NODE           NOMINATED NODE   READINESS GATES
podinfo-58746d449b-gtmsv   0/1     ContainerCreating   0          9s      <none>      minikube       <none>           <none>
podinfo-58746d449b-jdbt2   1/1     Running             0          8m59s   10.88.0.2   minikube-m02   <none>           <none>

実際にアクセスできるようにしてみます。podinfoをデプロイするとserviceもデプロイされるので、minikubeからポートフォワードしてあげるのが簡単です。

まずはserviceに設定されているポートを確認します。

kubectl get service podinfo

以下のように取得できます。

NAME      TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)             AGE
podinfo   ClusterIP   10.104.239.2   <none>        9898/TCP,9999/TCP   11m

9898がHTTP、9999がgRPCなので、今回は9898を使っていきます。

kubectl port-forward services/podinfo 9898:9898

ブラウザからhttp://127.0.0.1:9898/にアクセスしてみて、以下のような画面がでたら成功です。

アプリケーションを片付けます。

kubectl delete -k github.com/stefanprodan/podinfo//kustomize

最後にminikubeを片付けます。

ただ停止しておきたい場合は

minikube stop

もういらないかな、新しくしちゃいたいなっという場合は以下です。

minikube delete

片付けも簡単ですね。

まとめ

minikubeを使用すると、ちょっとしたKubernetes環境が簡単に構築できます。ローカルでKubernetes環境を動かす方法はいくつかあって、Microk8sやkind、Docker DesktopやRancher DesktopのようなGUIアプリケーションならポチっとするだけで起動できたります。Kubernetesの運用ノウハウが欲しいならkubeadmなんかでKubernetes環境を用意するのがいいと思うんですが、Kubernetesで何かを動かしたい、アプリケーションの運用をしたいのならminikubeやSaaSを利用するのが簡単です。