DUICUO

KubernetesオーケストレーションツールであるMinikubeを1つの記事で理解する

皆さん、こんにちは。Lugaです。今日は、クラウドネイティブ・エコシステムの中核技術であり、KubernetesのオーケストレーションツールでもあるMinikubeについてお話します。

Minikube ツールはなぜ必要なのでしょうか?

コンテナ技術の急速な発展と広範な応用により、Kubernetesは企業において重要な役割を果たしています。一般的にKubernetesは、「Linuxコンテナクラスターを単一のシステムとして管理することで、開発を加速し、メンテナンスを簡素化する」と説明されています。エンタープライズアプリケーションサービスのコンテナ化において、Kubernetesの学習と活用は不可欠な要素となっています。

しかし、このシステムに不慣れなDevOps担当者にとって、完全なマルチノードKubernetesクラスターを環境に導入するのは非常に困難です。このような導入には複雑な構成、ネットワーク設定、リソース管理が伴い、深い理解と関連する経験が求められます。

DevOpsプロフェッショナルがこれらの課題を克服できるよう、Minikube、K3s、Kindといったツールやプラットフォームが登場しました。これらのツールは、簡素化された軽量なKubernetesデプロイメントオプションを提供し、ローカル環境や開発環境で完全に機能するKubernetesクラスターを容易に構築できるようにします。

さらに、クラウドサービスプロバイダーは、Amazon EKS、Google Kubernetes Engine (GKE)、Microsoft Azure Kubernetes Service (AKS) などのマネージドKubernetesサービスも提供しています。これらのマネージドサービスは、基盤となるインフラストラクチャの複雑さを解消し、DevOps担当者が基盤となるKubernetesクラスターの詳細を気にすることなく、アプリケーションのデプロイと管理に集中できるようにします。

そのため、Kubernetesを初めて使用するDevOpsプロフェッショナルにとって、これらのツールとマネージドサービスは、Kubernetesの導入と管理の難しさを軽減するのに役立ちます。経験を積み、さらなる学習を重ねることで、Kubernetesのあらゆる側面を徐々に習得・理解し、実際の本番環境で複雑なマルチノードKubernetesクラスターを導入・管理できるようになります。

要約すると、完全なマルチノード Kubernetes クラスターを環境に導入することは、この分野の初心者である DevOps プロフェッショナルにとって難しい場合がありますが、簡素化された導入ツールとマネージド サービスを使用することでこれらの課題を克服し、エンタープライズ アプリケーション サービスのコンテナー化に対する信頼性の高いサポートを提供できます。

Minikube ツールとは何ですか?

Kubernetesは、Go言語で書かれたDockerコンテナ用のオープンソースオーケストレーションシステムです。コンピューティングクラスター内のノードのスケジューリングを処理し、ワークロードをプロアクティブに管理することで、ユーザーが宣言した意図と一致する状態を実現します。一方、Minikubeは、macOS、Linux、Windowsプラットフォーム上でネイティブKubernetesクラスターを実現するオープンソースの「ネイティブKubernetesエンジン」として詳細に説明されています。Kubernetesが公式に推奨する最高のコラボレーションツールの一つであるMinikubeは、ネイティブKubernetesアプリケーションを開発するためのツールを目指しており、Kubernetesのあらゆる機能をサポートしています。

Minikubeの主な機能は、ローカルマシン上で開発用の単一ノードKubernetesクラスターを実行することです。VirtualBox、Hyper-V、KVM2など、様々な仮想マシンドライバーをサポートしています。Kubernetesの世界では比較的成熟したソリューションであるMinikubeは、ロードバランサー、マルチクラスターサポート、ノードポート、永続ボリューム、Ingress、ダッシュボード、コンテナランタイムなど、豊富な機能をサポートしています。

オープンソースツールのMinikubeをベースにすることで、開発者、運用担当者、DevOpsエンジニアは、ローカルKubernetesシングルノードクラスタ環境を迅速に構築できます。Minikubeはハードウェアとソフトウェアのリソース要件が低いため、技術担当者が学習、実践、そして日々のプロジェクト開発を行うのに便利です。

まとめると、KubernetesとMinikubeは、コンテナ化されたアプリケーションの開発とデプロイを強力にサポートします。Kubernetesは分散システムのオーケストレーションツールとして、コンテナ化されたアプリケーションの管理とスケジュール設定が可能で、Minikubeはローカルマシン上でKubernetesクラスターを構築・管理するためのシンプルで実用的な方法を提供します。これらのツールを活用することで、開発者はアプリケーションの開発、テスト、デプロイをより効率的に行うことができ、アプリケーションデリバリーのスピードと品質を向上させることができます。

異なるMinikubeテクノロジースタックを知る

Minikube の機能に基づいて、次の図に示すように、オペレーティング システム (OS)、CPU アーキテクチャ、ハイパーバイザ テクノロジ、コンテナ ランタイム (CRI)、コンテナ ネットワーク インターフェイス プラグイン (CNI) など、複数の観点から Minikube がサポートするテクノロジ スタックについて簡単に説明します。

1. オペレーティングシステム(OS):

Minikube は、次のようなさまざまなオペレーティング システムでの実行をサポートしています。

  • macOS: Minikube は macOS 上で実行でき、便利なローカル開発およびテスト環境を提供します。
  • Linux: Minikube はさまざまな Linux ディストリビューションでの実行をサポートしており、開発者はローカル マシン上に Kubernetes クラスターを構築できます。
  • Windows: Minikube は Windows プラットフォーム上で実行でき、Windows ユーザーにローカライズされた Kubernetes 開発環境を提供します。

2. CPUアーキテクチャ:

Minikube は、次のようなさまざまな CPU アーキテクチャに適応できます (ただし、これらに限定されません)。

  • x86 アーキテクチャ: Minikube は、現在最も一般的なデスクトップおよびサーバー プロセッサ アーキテクチャである x86 アーキテクチャ プロセッサをサポートしています。
  • ARM アーキテクチャ: Minikube は、組み込みデバイスやモバイル デバイスで一般的に使用されるプロセッサ アーキテクチャである ARM アーキテクチャもサポートしています。

3. ハイパーバイザー技術:

Minikubeは仮想化マネージャーを利用して仮想マシンを作成・管理し、マルチノードKubernetesクラスターをシミュレートします。Minikubeは、以下を含む様々な仮想化マネージャーテクノロジーをサポートしています。

  • VirtualBox: Minikube は、VirtualBox を仮想化マネージャーとして使用して、ローカル マシン上に仮想マシンを作成および管理できます。
  • HyperV: Windows プラットフォームの場合、Minikube は HyperV を仮想化マネージャーとして使用することをサポートし、ローカライズされた Kubernetes 環境を提供します。
  • KVM2: Linux プラットフォームでは、Minikube は KVM2 を仮想化マネージャーとして使用して、ローカル Kubernetes クラスターを構築および管理できます。

4. コンテナランタイム(CRI)

Minikubeは、ローカルマシン上でコンテナ化されたアプリケーションを実行および管理するための様々なコンテナランタイムをサポートしています。Minikubeがサポートする一般的なコンテナランタイムを以下に示します。

  • Docker: 最も人気のあるコンテナ ランタイムの 1 つである Minikube は、Docker を使用してコンテナを作成および管理することをサポートしており、アプリケーションをローカル Kubernetes クラスター内でコンテナとして実行できるようにします。
  • containerd: Minikube は、コンテナ ランタイムとして containerd の使用もサポートしています。containerd は、Kubernetes にコンテナ管理機能を提供する軽量のコンテナ ランタイムです。

5. コンテナ ネットワーク インターフェイス プラグイン (CNI):

Minikubeは、コンテナ間のネットワーク通信と接続を可能にするために、さまざまなコンテナネットワークインターフェースプラグインをサポートしています。以下は、Minikubeでサポートされている一般的なコンテナネットワークインターフェースプラグインです。

  • Calico: Minikube は、Calico をコンテナ ネットワーク インターフェイス プラグインとして統合し、ネットワーク ポリシーとセキュリティ機能を提供できます。
  • flannel: Minikube は、コンテナ ネットワーク インターフェイス プラグインとして flannel を使用することもサポートしています。flannel はシンプルで効率的なネットワーク オーバーレイを提供し、コンテナ間の通信を可能にします。

Minikubeツールの基本的な展開とインストール

Minikubeのインストールとデプロイは比較的簡単です。ここではmacOSプラットフォームを例に、簡単に説明します。

 [administrator@JavaLangOutOfMemory ~ ]% brew install minikube
 [administrator@JavaLangOutOfMemory ~ ]% minikube start

もちろん、以下のように起動パラメータをカスタマイズすることもできます。

 [administrator@JavaLangOutOfMemory ~ ]% minikube start --iso-url=https://kubernetes.oss-cn-hangzhou.aliyuncs.com/minikube/iso/minikube-v1.xxiso --registry-mirror=https://registry.docker-cn.com --image-mirror-country=cn --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers --vm-driver=none --memory=4096

デプロイ後、関連する構成パラメータなどを確認します。

 [administrator@JavaLangOutOfMemory ~ ]% kubectl version Client Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.2", GitCommit:"092fbfbf53427de67cac1e9fa54aaa09a28371d7", GitTreeState:"clean", BuildDate:"2021-06-16T12:52:14Z", GoVersion:"go1.16.5", Compiler:"gc", Platform:"darwin/amd64"} Server Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.7", GitCommit:"132a687512d7fb058d0f5890f07d4121b3f0a2e2", GitTreeState:"clean", BuildDate:"2021-05-12T12:32:49Z", GoVersion:"go1.15.12", Compiler:"gc", Platform:"linux/amd64"}
 [administrator@JavaLangOutOfMemory ~ ]% kubectl get node -o wide NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME minikube Ready control-plane,master 15h v1.20.7 192.168.49.2 <none> Ubuntu 20.04.2 LTS 5.10.25-linuxkit docker://20.10.7 [administrator@JavaLangOutOfMemory ~ ]% kubectl get pod -A NAMESPACE NAME READY STATUS RESTARTS AGE kube-system coredns-74ff55c5b-p6dlz 1/1 Running 0 15h kube-system etcd-minikube 1/1 Running 0 15h kube-system kube-apiserver-minikube 1/1 Running 0 15h kube-system kube-controller-manager-minikube 1/1 Running 0 15h kube-system kube-proxy-dcr72 1/1 Running 0 15h kube-system kube-scheduler-minikube 1/1 Running 0 15h kube-system storage-provisioner 1/1 Running 3 15h

一般的なコマンドラインを以下に示します。

 [administrator@JavaLangOutOfMemory ~ ] % minikube --help minikube provisions and manages local Kubernetes clusters optimized for development workflows. Basic Commands: start Starts a local Kubernetes cluster status Gets the status of a local Kubernetes cluster stop Stops a running local Kubernetes cluster delete Deletes a local Kubernetes cluster dashboard Access the Kubernetes dashboard running within the minikube cluster pause pause Kubernetes unpause unpause Kubernetes Images Commands: docker-env Configure environment to use minikube's Docker daemon podman-env Configure environment to use minikube's Podman service cache Add, delete, or push a local image into minikube image Manage images Configuration and Management Commands: addons Enable or disable a minikube addon config Modify persistent configuration values profile Get or list the current profiles (clusters) update-context Update kubeconfig in case of an IP or port change Networking and Connectivity Commands: service Returns a URL to connect to a service tunnel Connect to LoadBalancer services Advanced Commands: mount Mounts the specified directory into minikube ssh Log into the minikube environment (for debugging) kubectl Run a kubectl binary matching the cluster version node Add, remove, or list additional nodes cp Copy the specified file into minikube Troubleshooting Commands: ssh-key Retrieve the ssh identity key path of the specified node ssh-host Retrieve the ssh host key of the specified node ip Retrieves the IP address of the specified node logs Returns logs to debug a local Kubernetes cluster update-check Print current and latest version number version Print the version of minikube options Show a list of global command-line options (applies to all commands). Other Commands: completion Generate command completion for a shell Use "minikube <command> --help" for more information about a given command.

Minikubeツールのアーキテクチャと原則の分析

Minikubeは、ローカル仮想マシン環境をベースにKubernetesクラスターをデプロイします。基本的なアーキテクチャは以下の図に示されています。

具体的な実施原則は次のとおりです。

(1).isoファイルをダウンロードしてローカル環境を利用できるようにします。

Minikubeの起動プロセスでは、まずローカル環境の準備を整えるために、.isoファイルをダウンロードする必要があります。この.isoファイルには、通常、Linuxディストリビューション(通常はboot2docker)と必要なツールおよび依存関係が含まれています。

(2)ダウンロードした.isoファイルからboot2docker.isoイメージファイルを抽出します。

ダウンロードした.isoファイルからboot2docker.isoイメージファイルを抽出します。このイメージは、Minikubeで動作するように特別に設計された軽量Linuxオペレーティングシステムです。

(3)SSH用の動的証明書を作成する

Minikubeでは、SSH経由で仮想マシンと通信するために、動的証明書のペアを作成する必要があります。これらの証明書は、仮想マシンの管理と操作のためのSSH接続を安全に確立するために使用されます。

(4)指定された構成を使用してVirtualBox VMファイルを作成します。

指定された構成情報に基づいて、VirtualBox仮想化ソフトウェアを使用して仮想マシン(VM)ファイルを作成します。このVMは、Minikubeクラスターのノードとして使用されます。

(5) boot2docker.isoファイルをマウントするためのストレージを構成する

仮想マシンのストレージ設定を構成し、boot2docker.iso ファイルを仮想マシンのファイルシステムにマウントします。これにより、仮想マシンはファイルシステムにアクセスし、そこから起動できるようになります。

(6)ネットワーク関連の設定(IP、DHCPなど)を行い、VM内でSSHを設定します。

仮想マシンのネットワーク設定(IPアドレスの割り当てやDHCPの設定など)を行います。さらに、仮想マシン内でSSHを設定し、SSH経由のリモート接続と管理を可能にします。

(7)仮想マシンを起動する

仮想マシンを起動し、起動プロセスが完了するまで待ちます。仮想マシンが正常に起動すると、Minikube クラスターのノードになります。

(8)Dockerコンテナエンジンが正常に起動できるように、/etc/hostname、/etc/hosts、systemd関連ファイルを設定します。

仮想マシン内で、ホスト名(/etc/hostname)の設定、ホスト解決(/etc/hosts)の設定、systemd関連ファイルの設定など、設定操作を実行します。これらの操作は、Dockerコンテナエンジンが仮想マシン内で正常に起動し、機能することを保証するのに役立ちます。

(9)KubernetesやDockerなどの基本的な環境構成を準備する。

仮想マシンでKubernetesとDockerの基本的な環境設定を準備します。必要なソフトウェアパッケージのインストールと設定、環境変数の設定、関連ディレクトリの作成などが必要になる場合があります。

(10)関連するKubernetesファイル(kubelet、kubeadmなど)をすべてダウンロードします。

kubeletやkubeadmなどのツールを含む、関連するすべてのKubernetesファイルを仮想マシンにダウンロードします。これらのツールは、Kubernetesクラスターの管理と運用に使用されます。

(11)Kubernetesに必要なさまざまなパッケージのDockerイメージをプルし、分散ストレージシステムEtcd、スケジューラ、コントローラマネージャ、APIサーバーなどのさまざまなサービスを起動します。

Kubernetesに必要な様々なコンポーネントとサービスのDockerイメージを仮想マシンにプルし、それらのサービスを起動します。これには、Etcdイメージ(分散ストレージシステム用)のプルや、スケジューラ、コントローラマネージャ、APIサーバーなどの主要コンポーネントの起動が含まれる場合があります。

上記の手順に従うことで、Minikube はコンポーネントの起動プロセスを正常に完了し、開発とテストに使用できるローカル Kubernetes クラスター環境をユーザーに提供します。