序章

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パッケージマネージャーを介してインストールできます。

  1. 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クラスターが自動的に作成されます。

  1. 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.3minikube startを実行できます]。

Homebrewを介してminikubeをインストールすると、コマンドラインを介してKubernetesクラスターを管理するための主要なツールであるkubectlも提供されました。 これで、他のKubernetesクラスターと同じようにkubectl getを実行して、クラスターで実行されているすべてのポッドを一覧表示できます。

  1. kubectl get pods -A

-A引数は、 all名前空間で実行されているポッドを返します。

Output
NAMESPACE 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コマンドを実行してダッシュボードにアクセスできます。

  1. minikube dashboard

このコマンドは、ダッシュボードを自動的に起動し、Kubernetesクラスター内からポートを転送して直接アクセスできるようにし、そのローカルポートを指すWebブラウザーを開きます。

Dashboard

ポートフォワーディングは、アクティブである限り、実行中のターミナルをブロックするため、作業を継続している間は、新しいターミナルウィンドウでこれを実行することをお勧めします。 ポートの転送を停止する場合は、Ctrl+Cを押して、このようなブロッキングプロセスを正常に終了できます。

Webブラウザに簡単にアクセスできないリモートサーバーでminikubeを実行している場合は、--urlオプションを追加してminikube dashboardを実行できます。 このオプションは、ポート転送プロセスを開始し、ブラウザを直接開くのではなく、ダッシュボードへのアクセスに使用できるURLを提供します。

  1. 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アドレスを入力します。

  1. ssh -L 34197:127.0.0.1:34197 [email protected]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)を取得してデプロイします。

  1. 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でアクセスできる静的ポートを指定します。

  1. kubectl expose deployment web --type=NodePort --port=8080

これで、kubectl get serviceコマンドを使用してサービスが実行されているかどうかを確認できます。

  1. kubectl get service web

Kubernetes NodePortsはランダムなポートを使用するため、出力は異なります。

Output
NAME 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コマンドを実行します。

  1. minikube service web --url
Output
http://192.168.49.2:31534

これで、そのURLに接続してみることができます。 これを行うには、curlと呼ばれるコマンドラインプログラムを使用します。これは、さまざまな種類のWeb要求を行うために一般的です。 一般に、特定の接続が理想的な状況でブラウザで機能するかどうかを確認する場合は、常に最初にcurlでテストする必要があります。

  1. curl http://192.168.49.2:31534
Output
Hello, 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に相当するものを提供します。

  1. minikube config set memory 4096
Output
❗ These changes will take effect upon a minikube delete and then a minikube start

出力は、変更を有効にするためにクラスターを再デプロイする必要があることを示しています。

注:本番Kubernetesクラスターは通常、メモリなどのリソースを調整するときに完全に再デプロイする必要はありませんが、実行中のKubernetesクラスター内で永続的な変更を行うことを期待しないでください。構成ファイルのみに変更を加えます。 結果として、minikubeクラスターの再デプロイは簡単です。

  1. minikube delete
Output
🔥 Deleting "minikube" in docker ... 🔥 Deleting container "minikube" ... 🔥 Removing /home/sammy/.minikube/machines/minikube ... 💀 Removed all traces of the "minikube" cluster.
  1. minikube start

minikubeは、ローカルファイルシステムからクラスターにディレクトリを一時的にマウントする機能も提供します。 minikube mountコマンドを使用して、ディレクトリをクラスタにエクスポートできます。

mountコマンドの構文は、次の構文を使用します:local_path:minikube_host_path。 コマンドのlocal_path部分は、クラスターにマウントするローカルディレクトリです。 コマンドのminikube_host_path部分は、ファイルにアクセスするMinikubeコンテナまたはVM内の場所です。

このサンプルコマンドは、ローカルホームディレクトリをminikubeクラスターの/hostパスにマウントします。

  1. 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を起動できます。

  1. minikube start -p new-profile

次に、Minikubeのアクティブプロファイルをminikube profileで変更できます。

  1. minikube profile new-profile
Output
✅ minikube profile was successfully set to new-profile

get profileコマンドを使用して、作業中の現在のプロファイルを取得することもできます。

  1. minikube config get profile
Output
New-profile

複数のプロファイルを使用しているかどうかに関係なく、minikubeは、kubectlや他のKubernetesツールがそれらを解析できるデフォルトの場所に構成ファイルを自動的に作成します。 たとえば、kubectl get nodesを実行すると、minikubeクラスター構成が解析され、単一のノードが返されます。

  1. kubectl get nodes
Output
NAME STATUS ROLES AGE VERSION minikube Ready control-plane,master 3h18m v1.23.1

kubectlを実行している場合、デフォルトの~/.kube/configとは異なるkubeconfigファイルへのパスを指定できます。 kubectlは、デフォルトの代わりに、その構成で指定されたクラスター資格情報を使用します。 たとえば、remote-kubeconfig.yamlというファイルに別のクラスター構成がある場合、次のコマンドを使用してそのクラスターからノードを取得できます。

  1. kubectl --kubeconfig=remote-kubeconfig.yaml get nodes

これらの非Minikubeノードはリモートで実行されています。

Output
NAME 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にデプロイする方法を学習することをお勧めします。