ローカルKubernetesの開発とテストにminikubeを使用する方法
序章
Kubernetes は、ソフトウェアのデプロイ、スケーリング、管理を自動化するためのオープンソースのコンテナオーケストレーションシステムです。 サーバーリソースの水平スケーリングを促進するためにエンタープライズレベルで非常に人気があり、DigitalOceanを含む多くのクラウドプロバイダーは独自のマネージドKubernetesソリューションを提供しています。
Kubernetesのデプロイは通常、複数のサーバーに依存しているため、Kubernetesスタックを本番環境にデプロイする前に開発とテストを実行するには、リソースを大量に消費する可能性があります。 このため、Kubernetesの作成者は、 minikube と呼ばれるコンパニオンプロジェクトを維持しています。このプロジェクトは、Dockerなどのコンテナーフレームワークと連携して、単一のマシンで実行されているKubernetesクラスターをシミュレートできます。
このチュートリアルでは、minikube
をローカルコンピューターまたはリモートサーバーにインストールします。 また、組み込みのKubernetesダッシュボードにアクセスして、ブラウザーでクラスターを探索します。 クラスターが実行されたら、テストアプリケーションをデプロイし、minikube
を介してクラスターにアクセスする方法を検討します。 このチュートリアルの最後のセクションでは、構成プロファイルを使用して、リモートKubernetesクラスターと一緒にMinikubeを使用する方法について説明します。
前提条件
このチュートリアルに従うには、次のものが必要です。
-
Kubernetesの概念に精通していること。 詳細については、記事Kubernetesの概要を参照してください。
-
minikube
を実行するWindows、Mac、またはLinux環境にインストールされているDockerコンテナフレームワーク。 Linux環境で作業していない場合、インストール手順についてはDockerのドキュメントを参照してください。 LinuxでDockerを使用している場合は、sudo権限なしで動作するように構成されていることを確認してください。 -
Homebrewパッケージマネージャー。 Homebrewは、 macOS 、またはLinux環境にインストールできます。 Windowsを使用している場合は、WSLの下にHomebrewをインストールできます。
-
Minikubeをインストールする環境では、少なくとも2つのCPU、2 GBのメモリ、および20GBのディスク容量を使用できます。
ステップ1—Minikubeのインストールと実行
minikube
は、Homebrewパッケージマネージャーを介してインストールできます。
- brew install minikube
Output…
==> Installing minikube
==> Pouring minikube--1.25.2.x86_64_linux.bottle.tar.gz
==> Caveats
Bash completion has been installed to:
/home/sammy/.linuxbrew/etc/bash_completion.d
==> Summary
🍺 /home/sammy/.linuxbrew/Cellar/minikube/1.25.2: 9 files, 70.0MB
…
注:Windowsでminikube
を使い始めるには、いくつかの注意点があります。 WSL2( Windows Subsystem for Linux の現在のバージョン)で動作しますが、独自のデフォルトのバックエンドではなくDockerを使用するように構成する必要があります。 これには、 WSL2サポートを使用してDockerをインストールし、このドキュメントに従ってminikube
をインストールした後、minikube config set driver docker
を実行する必要があります。
minikube
の使用を開始するには、start
コマンドを使用して実行できます。これにより、複数のDockerコンテナと最近の安定バージョンのKubernetesを使用してローカルKubernetesクラスターが自動的に作成されます。
- minikube start
これには少し時間がかかります。kubectl
が構成されていることに注意して、次のような出力が生成されるはずです。
Output👍 Starting control plane node minikube in cluster minikube
🚜 Pulling base image ...
💾 Downloading Kubernetes v1.23.1 preload ...
> preloaded-images-k8s-v16-v1...: 504.42 MiB / 504.42 MiB 100.00% 81.31 Mi
> gcr.io/k8s-minikube/kicbase: 378.98 MiB / 378.98 MiB 100.00% 31.21 MiB p
🔥 Creating docker container (CPUs=2, Memory=1987MB) ...
🐳 Preparing Kubernetes v1.23.1 on Docker 20.10.12 ...
▪ kubelet.housekeeping-interval=5m
▪ 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: default-storageclass, storage-provisioner
🏄 Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default
注:互換性チェックのためにデフォルト以外のバージョンのKubernetesでminikube
を実行する場合は、たとえば--kubernetes-version v.1.2.3
でminikube start
を実行できます]。
Homebrewを介してminikube
をインストールすると、コマンドラインを介してKubernetesクラスターを管理するための主要なツールであるkubectl
も提供されました。 これで、他のKubernetesクラスターと同じようにkubectl get
を実行して、クラスターで実行されているすべてのポッドを一覧表示できます。
- kubectl get pods -A
-A
引数は、 all名前空間で実行されているポッドを返します。
OutputNAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-64897985d-ttwl9 1/1 Running 0 46s
kube-system etcd-minikube 1/1 Running 0 57s
kube-system kube-apiserver-minikube 1/1 Running 0 61s
kube-system kube-controller-manager-minikube 1/1 Running 0 57s
kube-system kube-proxy-ddtgd 1/1 Running 0 46s
kube-system kube-scheduler-minikube 1/1 Running 0 57s
kube-system storage-provisioner 1/1 Running 1 (14s ago) 54s
これで、Kubernetesクラスターがローカルで実行され、kubectl
などの通常のKubernetesツールを使用して操作できます。 このチュートリアルの次のステップでは、minikube
が提供する追加機能のいくつかを使用して、ローカルのKubernetes構成を監視および変更する方法を学習します。
パート2—Kubernetesダッシュボードへのアクセス
Minikubeは、 KubernetesDashboardをそのまま実装します。 Kubernetesダッシュボードを使用して、クラスターの状態を監視したり、アプリケーションを手動でデプロイしたりできます。 Minikubeをローカルにデプロイした場合は、minikube dashboard
コマンドを実行してダッシュボードにアクセスできます。
- minikube dashboard
このコマンドは、ダッシュボードを自動的に起動し、Kubernetesクラスター内からポートを転送して直接アクセスできるようにし、そのローカルポートを指すWebブラウザーを開きます。
ポートフォワーディングは、アクティブである限り、実行中のターミナルをブロックするため、作業を継続している間は、新しいターミナルウィンドウでこれを実行することをお勧めします。 ポートの転送を停止する場合は、Ctrl+C
を押して、このようなブロッキングプロセスを正常に終了できます。
Webブラウザに簡単にアクセスできないリモートサーバーでminikube
を実行している場合は、--url
オプションを追加してminikube dashboard
を実行できます。 このオプションは、ポート転送プロセスを開始し、ブラウザを直接開くのではなく、ダッシュボードへのアクセスに使用できるURLを提供します。
- minikube dashboard --url
Output🤔 Verifying dashboard health ...
🚀 Launching proxy ...
🤔 Verifying proxy health ...
http://127.0.0.1:34197/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/
システムによって異なるため、このコマンドによって返されたポート番号に注意してください。
ただし、Kubernetesのデフォルトのセキュリティ設定では、リモートマシンでこのURLにアクセスできなくなります。 ダッシュボードのURLにアクセスするには、SSHトンネルを作成する必要があります。 ローカルマシンからサーバーへのトンネルを作成するには、-L
フラグを指定してssh
を実行します。 転送プロセスの出力からメモしたポート番号と、リモートサーバーのIPアドレスを入力します。
- ssh -L 34197:127.0.0.1:34197 sammy@your_server_ip
これで、http://127.0.0.1:34197/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/
のブラウザでダッシュボードにアクセスできるようになります。
完全なKubernetesクラスターのようにminikube
を操作する方法が増えたので、次のステップでは、サンプルアプリケーションをデプロイしてアクセスし、Minikubeクラスターが期待どおりに機能していることを確認します。
パート3—サンプルアプリのデプロイとテスト
kubectl
コマンドを使用して、テストアプリケーションをMinikubeクラスターにデプロイできます。 次のコマンドは、サンプルのKubernetesアプリケーション(この場合はGoogleのhello-app
)を取得してデプロイします。
- kubectl create deployment web --image=gcr.io/google-samples/hello-app:1.0
このコマンドは、Googleのコンテナレジストリであるgcr.io
上のhello-app
というリモートイメージから、クラスタ内でweb
と呼んでいるデプロイメントを作成します。
次に、web
デプロイメントをKubernetes Service として公開し、--type=NodePort
および--port=8080
でアクセスできる静的ポートを指定します。
- kubectl expose deployment web --type=NodePort --port=8080
これで、kubectl get service
コマンドを使用してサービスが実行されているかどうかを確認できます。
- kubectl get service web
Kubernetes NodePortsはランダムなポートを使用するため、出力は異なります。
OutputNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
web NodePort 10.109.254.242 <none> 8080:31534/TCP 10s
これで、minikube
を使用して、コンテナーの外部からアクセス可能なURLを取得できます。 このURLを使用すると、クラスター内のポート8080
で実行されているhello-app
サービスにアクセスできます。 Minikubeをローカルで実行している場合は、この方法を使用してアクティブなポート転送を実行する必要はありません。 サンプルアプリケーションのURLを取得するには、次のminikube service web –url
コマンドを実行します。
- minikube service web --url
Outputhttp://192.168.49.2:31534
これで、そのURLに接続してみることができます。 これを行うには、curl
と呼ばれるコマンドラインプログラムを使用します。これは、さまざまな種類のWeb要求を行うために一般的です。 一般に、特定の接続が理想的な状況でブラウザで機能するかどうかを確認する場合は、常に最初にcurl
でテストする必要があります。
- curl http://192.168.49.2:31534
OutputHello, world!
Version: 1.0.0
Hostname: web-746c8679d4-j92tb
ローカルマシンでminikube
を実行している場合は、ブラウザでこのURLにアクセスすることもでき、同じスタイルのないプレーンテキストが返されます。 リモートマシンで実行している場合、この出力をブラウザで表示する場合は、手順2と同様にSSHトンネリングを再度使用できます。
これで、minikube
を介してデプロイされたアプリケーションの最小限の例ができました。 通常、本番Kubernetesクラスタでは、 Webアクセス可能なエンドポイントへのよりきめ細かいアクセスを提供しますが、これはminikube
固有の機能に依存しません。ここの基本。
このチュートリアルの次のステップでは、Minikubeの組み込みツールのいくつかを使用して、クラスターのデフォルト構成値のいくつかを変更します。
パート4—Minikubeのリソースとファイルシステムの管理
minikube
コマンドは、クラスターの管理に役立ついくつかのサブコマンドを提供します。 たとえば、クラスターで使用可能なメモリの量を変更する必要がある場合は、minikube config
を使用してデフォルトの量を調整できます。 デフォルトでは、この値はMBで提供されるため、minikube config 4096
はクラスターに4GBに相当するものを提供します。
- minikube config set memory 4096
Output❗ These changes will take effect upon a minikube delete and then a minikube start
出力は、変更を有効にするためにクラスターを再デプロイする必要があることを示しています。
注:本番Kubernetesクラスターは通常、メモリなどのリソースを調整するときに完全に再デプロイする必要はありませんが、実行中のKubernetesクラスター内で永続的な変更を行うことを期待しないでください。構成ファイルのみに変更を加えます。 結果として、minikube
クラスターの再デプロイは簡単です。
- minikube delete
Output🔥 Deleting "minikube" in docker ...
🔥 Deleting container "minikube" ...
🔥 Removing /home/sammy/.minikube/machines/minikube ...
💀 Removed all traces of the "minikube" cluster.
- minikube start
minikube
は、ローカルファイルシステムからクラスターにディレクトリを一時的にマウントする機能も提供します。 minikube mount
コマンドを使用して、ディレクトリをクラスタにエクスポートできます。
mount
コマンドの構文は、次の構文を使用します:local_path:minikube_host_path
。 コマンドのlocal_path
部分は、クラスターにマウントするローカルディレクトリです。 コマンドのminikube_host_path
部分は、ファイルにアクセスするMinikubeコンテナまたはVM内の場所です。
このサンプルコマンドは、ローカルホームディレクトリをminikube
クラスターの/host
パスにマウントします。
- minikube mount $HOME:/host
Output📁 Mounting host path /home/sammy into VM as /host ...
▪ Mount type:
▪ User ID: docker
▪ Group ID: docker
▪ Version: 9p2000.L
▪ Message Size: 262144
▪ Options: map[]
▪ Bind Address: 192.168.49.1:43605
🚀 Userspace file server: ufs starting
✅ Successfully mounted /home/sammy to /host
📌 NOTE: This process must stay alive for the mount to be accessible ...
これは、minikube
クラスターからのロギングなどの入力または出力を保持する場合に役立ちます。
ポート転送と同様に、これはCtrl+C
コマンドを送信するまで、この端末でブロッキングプロセスとして実行されます。 次の最後のステップでは、minikube
と完全なリモートKubernetesクラスターを効率的に切り替える方法を学習します。
パート5—(オプション)複数のKubernetesクラスターの操作
複数のKubernetesクラスターをローカルで実行するために、minikube
は複数のプロファイルを設定します。 たとえば、Kubernetesの複数のバージョンを操作してテストする場合は、複数のKubernetesクラスターを作成し、--profile
または-p
フラグを使用してそれらを切り替えることができます。
ある特定のプロファイルでしばらく作業する場合は、minikube profile
コマンドを使用すると、すべてのコマンドで--profile
フラグを指定する代わりに、使用するデフォルトのプロファイルを構成できます。 。
-p
フラグを指定してminikube start
を実行すると、新しいプロファイルでMinikubeを起動できます。
- minikube start -p new-profile
次に、Minikubeのアクティブプロファイルをminikube profile
で変更できます。
- minikube profile new-profile
Output✅ minikube profile was successfully set to new-profile
get profile
コマンドを使用して、作業中の現在のプロファイルを取得することもできます。
- minikube config get profile
OutputNew-profile
複数のプロファイルを使用しているかどうかに関係なく、minikube
は、kubectl
や他のKubernetesツールがそれらを解析できるデフォルトの場所に構成ファイルを自動的に作成します。 たとえば、kubectl get nodes
を実行すると、minikube
クラスター構成が解析され、単一のノードが返されます。
- kubectl get nodes
OutputNAME STATUS ROLES AGE VERSION
minikube Ready control-plane,master 3h18m v1.23.1
kubectl
を実行している場合、デフォルトの~/.kube/config
とは異なるkubeconfig
ファイルへのパスを指定できます。 kubectl
は、デフォルトの代わりに、その構成で指定されたクラスター資格情報を使用します。 たとえば、remote-kubeconfig.yaml
というファイルに別のクラスター構成がある場合、次のコマンドを使用してそのクラスターからノードを取得できます。
- kubectl --kubeconfig=remote-kubeconfig.yaml get nodes
これらの非Minikubeノードはリモートで実行されています。
OutputNAME STATUS ROLES AGE VERSION
pool-xr6rvqbox-uha8f Ready <none> 2d2h v1.21.9
pool-xr6rvqbox-uha8m Ready <none> 2d2h v1.21.9
pool-xr6rvqbox-uha8q Ready <none> 2d2h v1.21.9
Kubernetesは通常、クラスターごとに1つの構成ファイルで動作するように設計されているため、実行時にkubectl
やその他のコマンドに渡すことができます。 構成をマージすることは可能ですが、ベストプラクティスは、Kubernetesの使用方法によって異なり、その必要はありません。 KubectlプラグインのパッケージマネージャーであるKrewを使用して調査することもできます。
結論
このチュートリアルでは、Minikubeをインストールし、アプリケーションを監視およびデプロイするために組み込みのKubernetesダッシュボードを構成しました。 また、Minikubeプロファイルとkubectl --kubeconfig
フラグを使用して、minikube
のローカルテストインスタンスとリモートKubernetesインスタンスを同時に操作するためのいくつかのベストプラクティスについても説明しました。 minikube
をローカルで使用してKubernetes構成をテストおよび評価することは、Kubernetesを本番環境にデプロイする準備ができているかどうかを判断するのに非常に役立ちます。
次に、継続的デプロイの場合は ArgoCD 、可観測性の場合は TOBS など、スケーラブルなアプリケーションをKubernetesにデプロイする方法を学習することをお勧めします。