2022-12-07に「Kubernetes再入門」というタイトルで勉強会に登壇しました。
そこで「勉強する環境がほしいが、どのように準備したらよいか」という質問をいただきましたので、ローカルで試す場合の環境の用意なんかを取り上げてみたいと思います。
minikube???
「ミニクーベ」「ミニクベ」なんて読みます。これはローカル環境でKubernetesを簡単に実行するためのツールです。Kubernetesを1から自前で用意するのは構築も運用も大変なので、私はこれをよく使います。
使ってみる
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をデプロイしてみます。
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を利用するのが簡単です。