Logicky Blog

Logickyの開発ブログです

Windows11でMinikubeを使ってみる

環境

  • Windows11
  • PowerShell
  • Scoop

MinikubeをScoopでインストール

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

kubectlをScoopでインストール

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

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

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

Minikubeをスタートしてみる

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

> 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が動いてるか確認してみる

> 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を適用する

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

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

色々確認する

> 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の画面が表示されました。

スケールアップしてみる

> 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を適用・実行してみる

> 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