参考記事
https://kubernetes.io/ja/docs/setup/learning-environment/minikube/
https://minikube.sigs.k8s.io/docs/start/
はじめに
「Kubernetes(k8s)って何? 何から手をつけたらいいの?」と疑問を持つ初学者の方々に向けて、この記事では実際に手を動かしながらKubernetesの基本を学ぶ方法を紹介します。
社内のKubernetes勉強会で、プログラミング初心者から業務でKubernetesを使用している経験者まで、5名の幅広いメンバーと共にこの活動を行いました。
今回は、Minikubeを使用してローカル環境でKubernetesを動かす方法を中心に解説します。
必要なツールのインストール
Docker
Dockerはコンテナを作成・管理するために必要です。以下のリンクから自分の環境に合わせてインストールしてください。
Macの場合:Appleシリコンチップを搭載しているか、インテルチップを搭載しているかを確認する方法
クリックすると、Docker Desktopのインストーラーのダウンロードが開始されます。
ダブルクリックしてDocker.dmgインストーラーを開き、Docker アイコンをアプリケーションフォルダーにドラッグします。
アプリを開いてアプリを使用する目的を入力して「finish」を選択し、下記の画面に遷移します。
Minikube
Minikubeはローカル環境で簡単にKubernetesクラスタを立ち上げるツールです。以下のコマンドでインストールできます。
brew install minikube
Kubernetesクラスタの起動
Minikubeを使ってクラスタを起動するには、ターミナルで以下のコマンドを実行します。
minikube start
なお、Dockerをインストールせずにminikube start
を実行すると、以下のようなエラーが表示されます。
😄 Darwin 13.2.1 (arm64) 上の minikube v1.33.1
👎 デフォルトドライバーを採用できませんでした。こちらが可能性の高い順に考えられる事です:
💡 代わりに、これらのドライバーのいずれかをインストールすることもできます:
▪ docker: Not installed: exec: "docker": executable file not found in $PATH
▪ hyperkit: Not installed: exec: "hyperkit": executable file not found in $PATH
▪ parallels: Not installed: exec: "prlctl": executable file not found in $PATH
▪ qemu2: Not installed: exec: "qemu-system-aarch64": executable file not found in $PATH
▪ virtualbox: Not installed: unable to find VBoxManage in $PATH
▪ podman: Not installed: exec: "podman": executable file not found in $PATH
❌ DRV_NOT_DETECTED が原因で終了します: 利用可能なドライバーが検出されませんでした。--driver 指定を試すか、https://minikube.sigs.k8s.io/docs/start/ を参照してください
問題なくMinikubeがスタートされると以下のように表示されます。
- 😄 Darwin 13.2.1 (arm64) 上の minikube v1.33.1
✨ docker ドライバーが自動的に選択されました
📌 root 権限を持つ Docker Desktop ドライバーを使用
👍 Starting "minikube" primary control-plane node in "minikube" cluster
🚜 Pulling base image v0.0.44 ...
💾 ロード済み Kubernetes v1.30.0 をダウンロードしています...
> preloaded-images-k8s-v18-v1...: 319.81 MiB / 319.81 MiB 100.00% 3.03 Mi
> gcr.io/k8s-minikube/kicbase...: 435.76 MiB / 435.76 MiB 100.00% 3.35 Mi
🔥 Creating docker container (CPUs=2, Memory=2200MB) ...
🐳 Docker 26.1.1 で Kubernetes v1.30.0 を準備しています...
▪ 証明書と鍵を作成しています...
▪ コントロールプレーンを起動しています...
▪ RBAC のルールを設定中です...
🔗 bridge CNI (コンテナーネットワークインターフェース) を設定中です...
🔎 Kubernetes コンポーネントを検証しています...
▪ gcr.io/k8s-minikube/storage-provisioner:v5 イメージを使用しています
🌟 有効なアドオン: storage-provisioner, default-storageclass
🏄 終了しました!kubectl がデフォルトで「minikube」クラスターと「default」ネームスペースを使用するよう設定されました
Kubectlを使ってPodを一覧表示する
kubectlを使用して、全namespaceのPodを一覧表示することができます。
# 全namespaceに存在するPodを一覧表示する
$ kubectl get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-787d4945fb-8c9fq 1/1 Running 0 12s
kube-system coredns-787d4945fb-q6r8p 1/1 Running 0 12s
kube-system etcd-minikube 1/1 Running 0 27s
kube-system kube-apiserver-minikube 1/1 Running 0 27s
kube-system kube-controller-manager-minikube 1/1 Running 0 25s
kube-system kube-proxy-krj5b 1/1 Running 0 12s
kube-system kube-scheduler-minikube 1/1 Running 0 27s
kube-system storage-provisioner 1/1 Running 0 24s
アプリケーションをデプロイする
サンプル Deploymentを作成し、ポート 8080 で公開します。
kubectl create deployment hello-minikube --image=kicbase/echo-server:1.0
kubectl expose deployment hello-minikube --type=NodePort --port=8080
しばらく時間がかかることもありますが、以下を実行するとすぐにデプロイメントが表示されます。
kubectl get services hello-minikube
このサービスにアクセスするために、minikube に Web ブラウザを起動させます。
minikube service hello-minikube
kubectl を使用してポートを転送します。
kubectl port-forward service/hello-minikube 7080:8080
やったー!ローカル環境でk8sを動かしてアプリケーションがデプロイされました。
Minikubeクラスターを停止&削除
ローカル環境のMinikubeクラスターを停止します。
minikube stop
ローカルのMinikubeクラスターを削除します。
minikube delete --all
番外編
Podの数を増やしたい
Deploymentで管理されているPodの個数を増やす方法を紹介します。
$ kubectl edit deployment hello-minikube
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-minikube
labels:
app: nginx
spec:
replicas: 3 # 希望のPod数に変更します
$ kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
hello-minikube 3/3 3 3 16m
$ kubectl get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
default hello-minikube-7ddcbc9b8b-4trx6 1/1 Running 0 51s
default hello-minikube-7ddcbc9b8b-gqzq6 1/1 Running 0 7m26s
default hello-minikube-7ddcbc9b8b-xqfbl 1/1 Running 0 51s
kube-system coredns-565d847f94-6thzk 1/1 Running 0 31m
Podを消してもPodが再作成される!
Podを取得します。
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
hello-minikube-77b6f68484-zbb9f 1/1 Running 0 22s
Podを削除します。
$ kubectl delete pod hello-minikube-77b6f68484-zbb9f
Podが削除されているか確認します。
$ kubectl delete pod hello-minikube-77b6f68484-6tlkp
なぜPodが削除されないのでしょうか?
それは、PodがDeploymentで管理されているからです。
KubernetesではPodを直接削除しても、そのPodがDeploymentなどのコントローラによって管理されている場合、Deploymentの設定に基づいて自動的に新しいPodが再作成されます。
この挙動は、システムの可用性と耐障害性を確保するために重要です。
もしPodを削除したい場合にPodが自動的に再作成されるのを防ぎたいなら、そのPodを管理しているDeploymentやReplicaSetを削除する必要があります。
kubectl delete deployment <deployment-name>
やってみた感想
全くプログラミングを触れずに来た人でも社内のKubernetesの勉強会を通じて、チーム制であれば、記事に記載された一通りの内容を実施することができました!
触れる前はターミナルを開く機会もあまりなく抵抗感がありましたが、実際に触れてみるとよりKubernetesがどのようなシステムなのかを理解することができ、とても勉強になりました!