INFRA

Windows11でMinikubeを使ってみる

環境

  • Windows11
  • PowerShell
  • Scoop

MinikubeをScoopでインストール

Terminal window
> scoop install minikube
> minikube version
minikube version: v1.34.0

kubectlをScoopでインストール

kubectlというのも必要らしいのでインストールします。

Terminal window
> scoop install kubectl
> kubectl version
Client Version: v1.29.2

Minikubeはk8sの1ノードを簡単に立ち上げられるアプリだそうです。 k8sのほとんどの機能を網羅しているけどノードは1つに限定されていて、インストールも超簡単なので学習・開発に使われるそうです。 kubectlはk8sの各種操作を実行できるCLIのアプリです。

Minikubeをスタートしてみる

Dockerドライバというのでスタートしてみます。

Terminal window
> minikube start --driver=docker
😄 Microsoft Windows 11 Pro 10.0.22631.4602 Build 22631.4602 上の minikube v1.34.0
✨ ユーザーの設定に基づいて docker ドライバーを使用します
📌 root 権限を持つ Docker Desktop ドライバーを使用
👍 Starting "minikube" primary control-plane node in "minikube" cluster
🚜 Pulling base image v0.0.45 ...
💾 ロード済み Kubernetes v1.31.0 をダウンロードしています...
> preloaded-images-k8s-v18-v1...: 326.69 MiB / 326.69 MiB 100.00% 22.72 M
> gcr.io/k8s-minikube/kicbase...: 487.90 MiB / 487.90 MiB 100.00% 12.99 M
🔥 Creating docker container (CPUs=2, Memory=32700MB) ...
❗ Failing to connect to https://registry.k8s.io/ from inside the minikube container
💡 外部イメージを取得するためには、プロキシーを設定する必要があるかも知れません: https://minikube.sigs.k8s.io/docs/reference/networking/proxy/
🐳 Docker 27.2.0 で Kubernetes v1.31.0 を準備しています...
▪ 証明書と鍵を作成しています...
▪ コントロールプレーンを起動しています...
▪ RBAC のルールを設定中です...
🔗 bridge CNI (コンテナーネットワークインターフェース) を設定中です...
🔎 Kubernetes コンポーネントを検証しています...
▪ gcr.io/k8s-minikube/storage-provisioner:v5 イメージを使用しています
🌟 有効なアドオン: storage-provisioner, default-storageclass
❗ C:\Program Files\Docker\Docker\resources\bin\kubectl.exe のバージョンは 1.29.2 で、Kubernetes 1.31.0 と互換性がない かもしれません。
▪ kubectl v1.31.0 が必要ですか? 'minikube kubectl -- get pods -A' を試してみてください
🏄 終了しました!kubectl がデフォルトで「minikube」クラスターと「default」ネームスペースを使用するよう設定されました

kubectlが古いかもよみたいなメッセージがありますね。とりあえず何も分かってないので次に進みます。

kubectlでMinikubeが動いてるか確認してみる

Terminal window
> kubectl get nodes
NAME STATUS ROLES AGE VERSION
minikube Ready control-plane 5m44s v1.31.0

とりあえず動いているようです。

Deploymentを作る

apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-deployment
spec:
replicas: 2
selector:
matchLabels:
app: hello
template:
metadata:
labels:
app: hello
spec:
containers:
- name: hello-container
image: nginx:latest
ports:
- containerPort: 80

Serviceを作る

apiVersion: v1
kind: Service
metadata:
name: hello-service
spec:
selector:
app: hello
type: NodePort
ports:
- protocol: TCP
port: 80
targetPort: 80
nodePort: 30080

DeploymentはどんなコンテナのPodを何個作るかみたいな設定だそうです。 ServiceはPodのネットワーク接続に関する設定だそうです。

Deployment, Serviceを適用する

Terminal window
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml

ファイルの設定を適用する場合 -f オプションを付ける必要があり、-f はファイル名のことだそうです。

色々確認する

Terminal window
> kubectl get pods
NAME READY STATUS RESTARTS AGE
hello-deployment-6c9c7b86b9-2k8cj 1/1 Running 0 5m5s
hello-deployment-6c9c7b86b9-2tgv5 1/1 Running 0 5m5s
> kubectl get nodes
NAME STATUS ROLES AGE VERSION
minikube Ready control-plane 82m v1.31.0
> kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hello-service NodePort 10.105.1.202 <none> 80:30080/TCP 5m11s
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 82m
> minikube ip
192.168.49.2
> wget http://192.168.49.2:30080
wget : リモート サーバーに接続できません。
発生場所 行:1 文字:1
+ wget
+ ~~~~
+ CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest]、WebException
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
> minikube service hello-service
|-----------|---------------|-------------|---------------------------|
| NAMESPACE | NAME | TARGET PORT | URL |
|-----------|---------------|-------------|---------------------------|
| default | hello-service | 80 | http://192.168.49.2:30080 |
|-----------|---------------|-------------|---------------------------|
🏃 hello-service サービス用のトンネルを起動しています。
|-----------|---------------|-------------|------------------------|
| NAMESPACE | NAME | TARGET PORT | URL |
|-----------|---------------|-------------|------------------------|
| default | hello-service | | http://127.0.0.1:61074 |
|-----------|---------------|-------------|------------------------|
🎉 デフォルトブラウザーで default/hello-service サービスを開いています...
❗ Docker ドライバーを windows 上で使用しているため、実行するにはターミナルを開く必要があります。

上記のhttp://127.0.0.1:61074がブラウザで開き、Nginxの画面が表示されました。

スケールアップしてみる

Terminal window
> kubectl scale deployment hello-deployment --replicas=5
deployment.apps/hello-deployment scaled
> kubectl get po
NAME READY STATUS RESTARTS AGE
hello-deployment-6c9c7b86b9-2k8cj 1/1 Running 0 21h
hello-deployment-6c9c7b86b9-2tgv5 1/1 Running 0 21h
hello-deployment-6c9c7b86b9-ckkhk 1/1 Running 0 9s
hello-deployment-6c9c7b86b9-g56kr 1/1 Running 0 9s
hello-deployment-6c9c7b86b9-s5v4n 1/1 Running 0 9s

Jobを作ってみる

Jobは一時的な処理を実行するPodを作ることが出きるそうです。

apiVersion: batch/v1
kind: Job
metadata:
name: test-job
spec:
template:
spec:
containers:
- name: test-job-container
image: busybox
command: ["echo", "Hello from Job"]
restartPolicy: Never

Jobを適用・実行してみる

Terminal window
> kubectl apply -f job.yml
job.batch/test-job created
> kubectl get pod
NAME READY STATUS RESTARTS AGE
hello-deployment-6c9c7b86b9-2k8cj 1/1 Running 0 21h
hello-deployment-6c9c7b86b9-2tgv5 1/1 Running 0 21h
test-job-hb8lq 0/1 Completed 0 27s
> kubectl get jobs
NAME STATUS COMPLETIONS DURATION AGE
test-job Complete 1/1 9s 35s
> kubectl logs test-job-hb8lq
Hello from Job