コンテンツにスキップ

コマンド@Minikube

はじめに

本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。


01. minikubeコマンド

addons

▼ addonsとは

Minikubeのアドオンを操作する。

▼ enable

アドオンを有効化するか否かを設定する。

*例*

開発環境専用のIngress Controllerとして、Nginx Ingress Controllerを有効化するか否かを設定する。

本番環境では、同じくNginx Ingress Controllerや、クラウドプロバイダーのロードバランサーなどを使用する。

$ minikube addons enable ingress


# IngressClassがNginxのIngressが作成されている。
$ kubectl get ingress

NAME          CLASS   HOSTS   ADDRESS        PORTS   AGE
foo-ingress   nginx   *       <IPアドレス>    80      12m

▼ list

有効できるアドオンの一覧を取得する。

$ minikube addons list

|-------------------------------|------------|----------------|-------------------------|
| ADDON NAME                    | PROFILE    | STATUS         | MAINTAINER              |
|-------------------------------|------------|----------------|-------------------------|
| ambassador                    | minikube   | disabled       | unknown (third-party)   |
| auto-pause                    | minikube   | disabled       | google                  |
| csi-hostpath-driver           | minikube   | disabled       | kubernetes              |
| dashboard                     | minikube   | enabled       | kubernetes              |
| default-storageclass          | minikube   | enabled       | kubernetes              |
| efk                           | minikube   | disabled       | unknown (third-party)   |
| freshpod                      | minikube   | disabled       | google                  |
| gcp-auth                      | minikube   | disabled       | google                  |
| gvisor                        | minikube   | disabled       | google                  |
| helm-tiller                   | minikube   | disabled       | unknown (third-party)   |
| ingress                       | minikube   | enabled       | unknown (third-party)   |
| ingress-dns                   | minikube   | disabled       | unknown (third-party)   |
| istio                         | minikube   | disabled       | unknown (third-party)   |
| istio-provisioner             | minikube   | disabled       | unknown (third-party)   |
| kubevirt                      | minikube   | disabled       | unknown (third-party)   |
| logviewer                     | minikube   | disabled       | google                  |
| metallb                       | minikube   | disabled       | unknown (third-party)   |
| metrics-server                | minikube   | disabled       | kubernetes              |
| nvidia-driver-installer       | minikube   | disabled       | google                  |
| nvidia-gpu-device-plugin      | minikube   | disabled       | unknown (third-party)   |
| olm                           | minikube   | disabled       | unknown (third-party)   |
| pod-security-policy           | minikube   | disabled       | unknown (third-party)   |
| portainer                     | minikube   | disabled       | portainer.io            |
| registry                      | minikube   | disabled       | google                  |
| registry-aliases              | minikube   | disabled       | unknown (third-party)   |
| registry-creds                | minikube   | disabled       | unknown (third-party)   |
| storage-provisioner           | minikube   | enabled       | kubernetes              |
| storage-provisioner-gluster   | minikube   | disabled       | unknown (third-party)   |
| volumesnapshots               | minikube   | disabled       | kubernetes              |
| ----------------------------- | ---------- | -------------- | ----------------------- |


cni

使用するCNIを設定する。

$ minikube start --cni=auto
$ minikube start --cni=bridge
$ minikube start --cni=cilium


config

▼ configとは

minikubeコマンドに関するパラメーターを操作する。

▼ set

kubectlコマンド実行時のデフォルト値を設定する。

*例*

デフォルトのドライバーを設定する。

$ minikube config set driver virtualbox

CPUサイズの上限値を設定する。

$ minikube config set cpus 4

メモリサイズの上限値を設定する。

$ minikube config set memory 16384

Kubernetesのバージョンのデフォルト値を設定する。

$ minikube config set kubernetes-version=v1.23.0


dashboard

▼ dashboardとは

Kubernetesのダッシュボードを開発環境に作成する。

*例*

$ minikube dashboard

🤔  Verifying dashboard health ...
🚀  Launching proxy ...
🤔  Verifying proxy health ...
🎉  Opening http://127.0.0.1:55712/*****/ in your default browser...


delete

▼ deleteとは

Minikubeのコンポーネントを削除する。

▼ --profile

$ minikube delete --profile foo

▼ all --purge

全てのコンポーネントを削除する。

$ minikube delete --all --purge


docker-env

▼ docker-envとは

ホストでdockerコマンドを実行した時に、ホスト側のdockerデーモンでなく、ゲスト仮想環境内のNodeのdockerデーモンにリクエストを送信できるように環境変数を設定する。

バージョンタグ名がlatestであると、仮想環境外に対してイメージをプルしてしまうことに注意する。

*例*

$ minikube docker-env

export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://127.0.0.1:52838"
export DOCKER_CERT_PATH="/Users/*****/.minikube/certs"
export MINIKUBE_ACTIVE_DOCKERD="minikube"

# To point your shell to minikube's docker-daemon, run:
# eval $(minikube -p minikube docker-env)

$ eval $(minikube -p minikube docker-env)

これにより、以下の環境変数が追加される。

$ env | grep DOCKER

DOCKER_TLS_VERIFY=1
DOCKER_HOST=tcp://*.*.*.*:2376
DOCKER_CERT_PATH=/Users/hiroki.hasegawa/.minikube/certs
MINIKUBE_ACTIVE_DOCKERD=minikube

もし、 Makefileのターゲット内でこれを実行する場合は、$(shell ...)とする。

docker-env:
    eval $(shell minikube -p minikube docker-env)

▼ -u

ホスト側のdockerデーモンを指定できるように、元に戻す。

$ eval $(minikube docker-env -u)


ip

▼ ipとは

ゲスト仮想環境内のNodeのIPアドレスを取得する。

$ minikube ip

192.168.49.2


kubectl

▼ kubectlとは

Minikubeのkube-apiserverをコンテキストとするkubectlコマンドを実行する。

ローカルマシンにkubectlコマンドがインストールされていなくとも、Minikubeに対してこれを実行できる。ClientとServerのバージョンが自動的に揃えられる。

$ minikube kubectl -- version

# kubectlコマンドのバージョン
Client Version: version.Info{
  Major:"1",
  Minor:"22",
  GitVersion:"v1.22.3",
  GitCommit:"*****",
  GitTreeState:"clean",
  BuildDate:"2021-11-17T15:41:42Z",
  GoVersion:"go1.16.10",
  Compiler:"gc",
  Platform:"darwin/amd64"
}

# kube-apiserverのバージョン
Server Version: version.Info{
  Major:"1",
  Minor:"22",
  GitVersion:"v1.22.3", # AWS EKSであれば、『v1.22.10-eks-84b4fe6』になっている。
  GitCommit:"*****",
  GitTreeState:"clean",
  BuildDate:"2021-11-17T15:41:42Z",
  GoVersion:"go1.16.9",
  Compiler:"gc",
  Platform:"linux/amd64"
}


node

▼ add

Nodeを1個だけ追加する。

▼ --control-plane

コントロールプレーンNodeを追加する。

$ minikube node add --control-plane

▼ --worker

ワーカーNodeを追加する。

$ minikube node add --worker

追加したワーカーNodeに.metadata.labelesキーを追加すれば、node affinityやnode selectorを検証できる。

# minikube-m01 はコントロールプレーンNodeのため、ラベルづけ不要である。
# ArgoCDを作成するワーカーNodeの場合
$ kubectl label node minikube-m02 node-type=deploy --overwrite
$ kubectl label node minikube-m02 node-role.kubernetes.io/worker=worker --overwrite
# IngressやIngressGatewayを作成するワーカーNodeの場合
$ kubectl label node minikube-m03 node-type=ingress --overwrite
$ kubectl label node minikube-m03 node-role.kubernetes.io/worker=worker --overwrite
# アプリケーションを作成するワーカーNodeの場合
$ kubectl label node minikube-m04 node-type=app --overwrite
$ kubectl label node minikube-m04 node-role.kubernetes.io/worker=worker --overwrite


mount

▼ mountとは

ホスト側のファイルまたはディレクトリを、ゲスト仮想環境の指定したディレクトリにマウントする。

$ minikube mount /Users/hiroki.hasegawa/projects/foo:/data

📁  Mounting host path /Users/hiroki.hasegawa/projects/foo into VM as /data ...
     Mount type:
     User ID:      docker
     Group ID:     docker
     Version:      9p2000.L
     Message Size: 262144
     Permissions:  755 (-rwxr-xr-x)
     Options:      map[]
     Bind Address: 127.0.0.1:61268
🚀  Userspace file server: ufs starting
✅  Successfully mounted /Users/hiroki.hasegawa/projects/foo to /data

📌  NOTE: This process must stay alive for the mount to be accessible ...


update-context

Minikubeの認証情報が誤っている場合、正しく修正する。

$ minikube update-context

🎉  "minikube" context has been updated to point to 192.168.64.16:8443
💗  Current context is "minikube"


service

▼ serviceとは

NodePort Serviceを指定し、ホストから仮想サーバーを介して、Node内のServiceにポートフォワーディングを実行する。

http://127.0.0.1:<自動的に発行されたポート番号>の形式でURLが発行されるため、ブラウザやcurlコマンドで接続を確認できる。

$ minikube service <NodePort Service名> -n foo-namespace

🏃  Starting tunnel for service <Service名>.
|-----------|--------------|-------------|------------------------|
| NAMESPACE   | NAME           | TARGET PORT   | URL                                      |
|-------------|----------------|---------------|------------------------------------------|
| default     | <Service名>    |               | http://127.0.0.1:<自動的に発行されたポート番号> |
| ----------- | -------------- | ------------- | -----I-------------------                |

Opening service <Service名> in default browser...

これは、Istio IngressGatewayをNodePort Serviceで作成している場合も使える。

$ minikube service istio-ingressgateway -n istio-ingress

ただし、ポートフォワーディングのポート番号がランダムなため、もしポート番号を固定したい場合は、kubectl port-forwardコマンドでPodを指定すると良い。

# Podに直接的に指定する場合
$ kubectl port-forward pod/<Pod名> <ホストポート番号>:<Podのポート番号>

# Serviceの情報を使用して、Podを指定する場合
$ kubectl port-forward svc/<Service名> <ホストポート番号>:<Podのポート番号>

# ホストポートを介してPodのポートにリクエストを送信する。
$ curl http://127.0.0.1:<ホストポート番号>

ServiceのIPアドレスがNodeのIPアドレスと一致することは、minikube ipコマンドから確認できる。

$ minikube ip

*.*.*.*

補足として、minikube serviceコマンドを使用せずに、sshコマンドでNodeに接続しても、同様にServiceにリクエストを送信できる。

$ minikube ssh

# Nodeの中
$ curl -X GET http://*.*.*.*:57761

▼ list

全てのServiceの情報を取得する。

$ minikube service list

|----------------------|---------------------------|--------------|---------------------------|
| NAMESPACE              | NAME                        | TARGET PORT    | URL                         |
|------------------------|-----------------------------|----------------|-----------------------------|
| default                | foo-service                 | http/80        | http://*.*.*.*:30001        |
| default                | bar-service                 | http/80        | http://*.*.*.*:30000        |
| default                | kubernetes                  | No node port   |                             |
| kube-system            | kube-dns                    | No node port   |                             |
| kubernetes-dashboard   | dashboard-metrics-scraper   | No node port   |                             |
| kubernetes-dashboard   | kubernetes-dashboard        | No node port   |                             |
| ---------------------- | --------------------------- | -------------- | --------------------------- |

▼ --url

Minikube仮想サーバー内のNodeのIPアドレスと、NodePort Serviceのポート番号を取得する。

http://127.0.0.1:<自動的に発行されたポート番号>の形式でURLが発行されるため、ブラウザやcurlコマンドで接続を確認できる。

--urlオプションを使用しない場合とは異なり、ポートフォワーディングを実行しない。

$ minikube service <NodePort Service名> --url -n foo-namespace

http://127.0.0.1:<自動的に発行されたポート番号>

これは、Istio IngressGatewayをNodePort Serviceで作成している場合も使える。

$ minikube service istio-ingressgateway --url -n istio-ingress


ssh

▼ sshとは

仮想環境内のNodeにSSH公開鍵認証で接続する。

# DockerドライバーによるNodeの場合
$ minikube ssh

# ワーキングディレクトリ
docker@minikube:~$ pwd
/home/docker

# aptコマンドを使用できる。
docker@minikube:~$ sudo apt update -y && apt --help
# VirtualBoxドライバーによるNodeの場合
$ minikube ssh
                         _             _
            _         _ ( )           ( )
  ___ ___  (_)  ___  (_)| |/')  _   _ | |_      __
/' _ ` _ `\| |/' _ `\| || , <  ( ) ( )| '_`\  /'__`\
| ( ) ( ) || || ( ) || || |\`\ | (_) || |_) )(  ___/
(_) (_) (_)(_)(_) (_)(_)(_) (_)`\___/'(_,__/'`\____)


# ワーキングディレクトリ
$ pwd
/home/docker
# HyperKitドライバーによるNodeの場合
$ minikube ssh
                         _             _
            _         _ ( )           ( )
  ___ ___  (_)  ___  (_)| |/')  _   _ | |_      __
/' _ ` _ `\| |/' _ `\| || , <  ( ) ( )| '_`\  /'__`\
| ( ) ( ) || || ( ) || || |\`\ | (_) || |_) )(  ___/
(_) (_) (_)(_)(_) (_)(_)(_) (_)`\___/'(_,__/'`\____)


# ワーキングディレクトリ
$ pwd
/home/docker

# Minikube内で使用できるユーティリティ
$ busybox --list

addgroup
adduser
ar

...

xzcat
yes
zcat

Nodeの中ではdockerコマンドを実行でき、コンテナイメージもデバッグできる。

$ minikube ssh

# Nodeの中
$ docker run --rm -it <ビルドに失敗したコンテナイメージID> /bin/bash

# コンテナの中
[root@<コンテナID>:~] $ ls -la

-- (ハイフン2つ)

NodeにSSH公開鍵認証で接続し、任意のコマンドを実行する。

*例*

$ minikube ssh -- ls -la

total 4
drwxr-xr-x 3 docker docker  80 Mar 15 09:30 .
drwxr-xr-x 3 root   root    60 Oct 27 23:07 ..
-rw------- 1 docker docker 126 Mar 15 10:10 .bash_history
drwx------ 2 docker docker  80 Jan  1  1970 .ssh


start

▼ startとは

ゲスト仮想環境を作成し、仮想環境内にNodeを作成する。

*例*

$ minikube start

😄  minikube v1.24.0 on Darwin 11.3.1
✨  Automatically selected the docker driver. Other choices: virtualbox, ssh
👍  Starting control plane node minikube in cluster minikube
🚜  Pulling base image ...
💾  Downloading Kubernetes v1.22.3 preload ...
    > preloaded-images-k8s-v13-v1...: 501.73 MiB / 501.73 MiB  100.00% 2.93 MiB
    > gcr.io/k8s-minikube/kicbase: 355.78 MiB / 355.78 MiB  100.00% 1.71 MiB p/
🔥  Creating docker container (CPUs=2, Memory=7911MB) ...
🐳  Preparing Kubernetes v1.22.3 on Docker 20.10.8 ...
     Generating certificates and keys ...
     Booting up control plane ...
     Configuring RBAC rules ...
🔎  Verifying Kubernetes components...
     Using image gcr.io/k8s-minikube/storage-provisioner:v5
🌟  Enabled addons: storage-provisioner, default-storageclass
🏄  Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default

コントロールプレーンNodeが作成されていることを確認できる。

$ kubectl get node

NAME       STATUS   ROLES                  AGE   VERSION
minikube   Ready    control-plane,master   14m   v1.22.3

▼ --container-runtime

コンテナランタイムを指定する。

コンテナランタイムごとに他にもオプションが必要になる。

$ minikube start --container-runtime=auto
$ minikube start --container-runtime=docker
$ minikube start --container-runtime=containerd
$ minikube start --container-runtime=cri-o

▼ --cpus、--memory

Minikubeの各Nodeのハードウェアリソースを設定する (これはMinikubeクラスターの上限ではない) 。

そのため、DockerDesktopの上限を高く設定しておかないと、ホストOSがMinikubeクラスターに割り当てられるハードウェアリソースが足りなくなり、MinikubeのNodeがNotReadyになる。

また、Nodeを増やすとMinikubeクラスター全体のハードウェアリソースの要求量が増える。

つまり最適解は、適度なハードウェアリソースを割り当てたNodeを最低限冗長化することである。

CPU4コアとメモリ7168MiBを持ったNodeが3台作られる。

$ minikube start --cpus=4 --memory=16384 --nodes 3

実際に設定されたハードウェアリソースは、Minikubeクラスター内から確認できる。

$ minikube ssh

# CPUとメモリを確認する。
$ top

top - 09:28:27 up 43 min,  0 users,  load average: 19.16, 13.99, 13.93

Tasks:  31 total,   1 running,  30 sleeping,   0 stopped,   0 zombie

# CPU
%Cpu(s): 61.8 us, 22.7 sy,  0.0 ni,  4.7 id,  2.6 wa,  0.0 hi,  8.2 si,  0.0 st

# メモリ
# Dockerドライバーの場合、total値はDockerプロセスの全体量である。ここから、cpuとmemoryの上限値しか使えない
MiB Mem :   8931.8 total,    163.0 free,   7356.1 used,   1412.7 buff/cache # メモリ
MiB Swap:   1024.0 total,    844.3 free,    179.7 used.   1298.8 avail Mem

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
    991 root      20   0 1856264 581988  28852 S  27.8   6.4   6:35.21 kube-apiserver
    579 root      20   0 2486572  78828  18660 S  10.6   0.9   2:36.03 kubelet
...
$ minikube ssh

# メモリを確認する。
$ free -m
              total        used        free      shared  buff/cache   available
Mem:           7951        1853        3080         333        3017        5594
Swap:          1023           0        1023

metrics-serverを入れて、kubectl top nodeコマンドを実行してもよいが、Minikubeクラスター全体であればminikube sshコマンドでMinikubeクラスターに入って確認した方が良い。

▼ --docker-env

別にdocker-envコマンドを実行しつつ、startコマンドを実行する。

*例*

$ minikube start --docker-env

▼ --ha

コントロールプレーンNodeを3個に冗長化する。

kube-apiserverは負荷が高まりクラッシュしやすいため、対策になる。

ただ、ワーカーNode以外のNode数が増える。

ため、DockerDesktopの上限を高く設定しておかないと、ホストOSがMinikubeクラスターに割り当てられるハードウェアリソースが足りなくなり、MinikubeのNodeがNotReadyになる。

$ minikube start --ha

NAME      STATUS   ROLES           AGE   VERSION
foo       Ready    control-plane   95s   v1.32.3
foo-m02   Ready    control-plane   85s   v1.32.3
foo-m03   Ready    control-plane   75s   v1.32.3

個別にコントロールプレーンNodeを追加しても良い。

$ minikube node add --control-plane

▼ --driver

ゲスト仮想環境のドライバーを指定し、startコマンドを実行する。

ホストごとに標準の仮想環境が異なり、MacOSはDockerドライバーがデフォルトである。

ドライバーの使用前に、これをインストールしておく必要があることに注意する。

*例*

# 事前にVirtualBoxのダウンロードが必要。
$ minikube start --driver=virtualbox

▼ --kubernetes-vsersion

Minikubeで稼働させるKubernetesのバージョンを指定しつつ、startコマンドを実行する。

$ minikube start --kubernetes-version=v1.23.0

▼ --listen--address

Kubernetes Clusterに、ホストPC以外の外部から接続できるようにする。

$ minikube start --listen-address=0.0.0.0

▼ --mount、--mount--string

ホストとゲスト仮想環境間のマウントディレクトリを指定しつつ、startコマンドを実行する。

*例*

$ minikube start --mount=true --mount-string="/Users/hiroki.hasegawa/projects/foo:/data"

▼ --nodes

作成するNode数を指定し、startコマンドを実行する。

マルチNodeのKubernetes Clusterを作成できる。

Minikubeは、同じCPUとメモリを持つNodeを冗長化するため、--nodesオプションでNodeを増やすだけ、Podのリソースに余裕がでる。

*例*

CPU4コアとメモリ7168GBを持ったNodeが3台作られる。

$ minikube start --nodes 3 --cpu 4 --memory 7168

*例*

$ minikube start --nodes 3

# Nodeを確認する。
$ kubectl get node
NAME           STATUS   ROLES                  AGE   VERSION
minikube       Ready    control-plane,master   76s   v1.22.0 # コントロールプレーンNode
minikube-m02   Ready    <none>                 42s   v1.22.0 # ワーカーNode
minikube-m03   Ready    <none>                 19s   v1.22.0
minikube-m04   Ready    <none>                 19s   v1.22.0


# Nodeを確認する。
$ minikube status

minikube # コントロールプレーンNode
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured

minikube-m02 # ワーカーNode
type: Worker
host: Running
kubelet: Running

補足として、コントロールプレーンNodeも単なるNodeの1個なため、Deploymentを作成すると、コントロールプレーンNodeにもPodをスケジューリングさせる。

$ kubectl get pod -o wide

NAME                     READY   STATUS    RESTARTS   AGE   IP           NODE           NOMINATED NODE   READINESS GATES
nginx-deployment-*****   1/1     Running   0          16m   10.244.0.3   minikube       <none>           <none>           # コントロールプレーンNode上にある。
nginx-deployment-*****   1/1     Running   0          16m   10.244.1.3   minikube-m02   <none>           <none>           # ワーカーNode上にある。
nginx-deployment-*****   1/1     Running   0          16m   10.244.1.2   minikube-m02   <none>           <none>

▼ --profile

Kubernetes Clusterに名前をつけ、複数のKubernetes Clusterを作成できる。

Cluster名以外にも、例えば以下に影響する。

  • Nodeのプレフィクス
  • Dockerのネットワーク名
$ minikube start --profile foo

$ kubectl config use-context foo
Switched to context "foo".

$ kubectl get nodes

NAME      STATUS   ROLES           AGE   VERSION
foo       Ready    control-plane   13d   v1.32.0
foo-m02   Ready    worker          13d   v1.32.0
foo-m03   Ready    worker          13d   v1.32.0
foo-m04   Ready    worker          13d   v1.32.0
foo-m05   Ready    worker          13d   v1.32.0
foo-m06   Ready    worker          13d   v1.32.0

注意点として、執筆時点 (2025/02/03) では複数のKubernetes Cluster間を同一のネットワークに接続できない。

異なるネットワークにおいて、ホストOSのドメイン (host.minikube.internal) を介して通信するしかない。

▼ --static-ip

MinikubeのNodeのIPアドレスを固定する。

マルチNodeに対応しておらず、Nodeを一台にしなければならない。

$ minikube start --static-ip 192.168.200.200


tunnel

▼ tunnelとは

LoadBalancerを一時的に作成し、LoadBalancer Serviceに自動的に紐付ける。

紐付けられたLoadBalancer Serviceには『External Endpoints (http://127.0.0.1:80) 』が割り当てられ、ここからLoadBalancer Serviceにリクエストを送信できるようになる。

Node外からPodに通信できるようになる。minikube sshコマンドでNodeに接続しつつ、公開されたServiceにリクエストを送信できる。

*例*

$ minikube tunnel

✅  Tunnel successfully started

📌  NOTE: Please do not close this terminal as this process must stay alive for the tunnel to be accessible ...

❗  The service/ingress <Service名> requires privileged ports to be exposed: [80]
🔑  sudo permission will be asked for it.
🏃  Starting tunnel for service <Service名>.


02. デバッグ

--alsologtostderr

コマンドの詳細な実行ログを標準エラー出力に出力する。

$ minikube start --alsologtostderr