簡単にローカルKubernetes環境を構築できるツール「Minikube」
Dockerなどのコンテナ技術を使ったクラスタ環境構築ツールとして広く使われているのが「Kubernetes」だ。しかし、Kubernetes環境を自前で構築するのにはやや骨が折れる。そこで今回は、仮想化技術を使って開発・テスト向けのKubernetes環境を構築するツール「Minikube」を紹介する。
Windows/macOS/LinuxでKubernetesのテスト環境を構築
Kubernetesはオープンソースで開発されているコンテナクラスタ構築ツールだ。Googleが積極的に推進していることもあり、昨今では広く使われるようになっている(図1)。
このKubernetesを使ったクラスタ環境の構築については以前の記事でも紹介しているが、Linux環境が必須であるほか、実運用環境に近い構成にしようとするとさまざまな設定が必要になる。Kubernetesではやや複雑なネットワーク設定を用いるため、ネットワーク関連の設定でトラブルに遭遇することも多い。そのため、Kubernetesでは手軽に開発・検証用のKubernetes環境を構築できる「Minikube」というツールを公開している。今回はこのMinikubeを使ってKubernetesの検証環境を作る手順を紹介していこう。
Minikubeの仕組みと提供する機能
KubernetesはLinux上でコンテナクラスタを構築するためのソフトウェアであり、基本的にはLinux上でしか動作しない。いっぽう、Minikubeでは仮想化ソフトウェアを使ってLinuxがインストールされた仮想マシンを作成し、そこでKubernetesクラスタを動作させる仕組みになっている。そのため、仮想化ソフトウェアさえ用意すればWindowsやmacOS上でも利用できる。対応する仮想化ソフトウェアは以下の通りだ。
- Windows環境:VirtualBoxもしくはHyper-V
- macOS環境:VirtualBoxもしくはVMware Fusion、HyperKit
- Linux環境:VirtualBoxもしくはKVM
ちなみにVirtualBoxはオープンソースで開発・公開されている仮想化ソフトウェアだが、USB 2.0/3.0サポートなどの一部コンポーネント(Oracle VM VirtualBox Extension Pack)はオープンソース化されておらず、これらの商用利用には制限があるので注意したい。
Minikubeでは、仮想マシンのインストールや管理、Kubernetesクラスタの設定をホストから行うための「minikube」コマンドを使って各種操作を行う。さらに、このminikubeコマンド経由でさまざまな「アドオン」機能をKubernetesクラスタ内にインストールすることもできる。アドオン機能で提供される機能としてはKubernetesクラスタ内で利用できるDNSやWebブラウザでKubernetesクラスタを管理できるダッシュボード、コンテナイメージを格納するDockerレジストリなどがある。Kubernetesを一からインストールする場合、これらは別途手動でインストールする必要があるが、Minikubeを利用することで大幅に作業の手間を削減できる。
なお、下記ではWindows環境でVirtualBoxを使用してMinikubeを実行させる流れを紹介するが、基本的な操作の流れはほかのOSを利用する場合も同じだ。
Minikubeのダウンロードとインストール
今回は仮想化ソフトウェアとしてVirtualBoxを使用するので、まずVirtualBoxのダウンロードページからVirtualBoxのインストーラをダウンロードしてインストールしておこう。「Oracle VM VirtualBox Extension Pack」についてはインストールしなくても構わない。
また、MinikubeやKubernetesの各種操作を実行するためのフロントエンド「kubectl」などのコマンドラインツールをインストールするディレクトリも用意しておく。今回はホームディレクトリ以下に作成した「bin」ディレクトリを使用することとした。任意のディレクトリでこれらコマンドが実行できるよう、このディレクトリにはパスを通しておこう。パスの設定については「システムのプロパティ」の「環境変数」から実行できる(図2)。
次にkubectlをダウンロードし、パスの通ったディレクトリにコピーする。kubectlのダウンロードURLはKubernetesの「Install and Set Up kubectl」ページに掲載されている。。
MinikubeについてはGitHubのMinikubeリポジトリページに実行ファイル(バイナリ)のダウンロードリンクが掲載されているので、そこからバイナリをダウンロードし、ダウンロードしたファイルをkubectlと同様にパスの通っているディレクトリにコピーし、「minikube.exe」にリネームする。以上で最低限必要なファイルの準備は完了だ。
MinikubeでKubernetesクラスタを作成する
必要な設定の完了後、コマンドプロンプトを開いて「minikube start」コマンドを実行することで、Kubernetes環境がインストールされた仮想マシンが起動される。このとき、必要に応じてイメージファイルのダウンロードやファイルのコピーなども行われる(図3)。
なお、デフォルトでは最新安定版のKubernetes環境が自動的に構築されるが、「--kubernetes-version <バージョン番号>」オプションを指定することで特定のバージョンを指定することもできる。選択できるバージョンは「minikube get-k8s-versions」コマンドで確認できる(図4)
「minikube start」コマンドを実行すると仮想マシンがバックグラウンド(Headless)で起動され、Kubernetesクラスタが利用可能となる。このときウィンドウは表示されないが、VirtualBoxのGUIからはその存在が確認できる(図5)。
この状態でコマンドプロンプトから「kubectl cluster-info」コマンドを実行すると、ローカルネットワーク上でKubernetesのマスターノードが稼動していることが分かる(図6)。「kubectl get node」コマンドでノードを確認すると、「minikube」というノードが動いていることも確認できる。
「minikube dashboard」コマンドを実行すると、WebブラウザでKubernetesのGUIコンソールにアクセスできる(図7、8)。
このダッシュボードでは実行中のコンテナに関する情報や設定情報などクラスタに関するさまざまな情報を閲覧できるとともに、設定変更やコンテナの起動といった操作もここから行える。
ちなみに、このダッシュボードはKubernetes内の「kube-system」というネームスペース内で実行されている「kubernetes-dashboard」というdeploymentによって提供されている。kube-systemネームスペース内ではこれに加え、Kubernetesクラスタ内でDNSを提供する「kube-dns」も実行されている(図9)。
また、Minikube環境を停止させるには「minikube stop」コマンドを実行すれば良い。
クラスタ内のDockerにアクセスする
Minikube環境内ではKubernetesやDockerが稼動しており、仮想マシンのホストとなる環境(minikubeコマンドを実行した環境)にdockerコマンドがインストールされていれば、そのdockerコマンド経由で仮想マシン内で稼動するDockerを操作できる。
Windows向けのdockerコマンドはDocker Community Edition for Windowsの一部として配布されているが、対象環境はWindows 10 Proとなっている。実際、筆者が試したところWindows 7環境ではインストールできなかった。以前はWindows向けのdockerコマンドが単体でも配布されていたのだが(配布サイト、現時点で最新版のdockerバイナリは配布されていないようだ(有志によるビルドと配布は行われている)。
Kubernetesと組み合わせて利用する場合、必ずしも最新版のdockerコマンドが必要というわけではないので、今回は公式で公開されているDocker CEバイナリの最新版である「docker-17.09.0-ce.zip」に含まれているDockerコマンドを使用した。このバイナリに含まれているdocker.exeを、パスの通ったディレクトリにコピーすればdockerコマンドが利用できるようになる。
ちなみにmacOSやLinux向けではdownload.docker.com上で最新のdockerコマンドが配布されているので、そちらを利用すれば良い(macOS向け、Linux向け)。Linux環境ではディストリビューションが公式に配布しているdockerコマンドを利用することもできる。
さて、コマンドプロンプトで「minikube docker-env」コマンドを実行すると、Minikube環境内のDockerにアクセスするための設定コマンドが表示される(図10)。
Windows環境の場合、これをコピー&ペーストして実行する、もしくは注釈として表示されているように次のコマンドを実行すれば、ホスト上のdockerコマンドからMinikube環境内のDockerにアクセスできるようになる。
@FOR /f "tokens=*" %i IN ('minikube docker-env') DO @%i
この設定が完了すると、ローカルのDockerに対し操作を行うのと同様にしてdockerコマンドでMinikube環境内のDockerを操作できるようになる。たとえば「docker version」コマンドを実行すると、ホスト上のdockerコマンド(Client)のバージョンとともにMinikube環境内のDockerのバージョンが表示されるはずだ(図11)。
また、次のように「docker ps」コマンドを実行すればMinikube環境内で動いているコンテナを確認できる(図12)。
Minikube環境内でコンテナを実行する
さて、続いてはMinikube環境内でコンテナを実行する方法を説明していこう。と言っても、基本的な手順は一般的なKubernetesの場合と同じであり、kubernetesによるDockerコンテナ管理入門で紹介した方法をそのまま利用できる。
たとえば設定ファイルを用意し、「kubectl create -f <設定ファイル名>」コマンドを実行することで指定したファイルに記述されたリソースを作成できる。たとえば次のような設定ファイルは、Apache HTTP Serverを実行するコンテナイメージ「httpd」を使ってコンテナを作成するものだ。
apiVersion: v1 kind: Pod ←Podに関する設定ファイルであることを指定 metadata: ←メタデータに関する情報を指定 name: httpd ←Podの名前を指定 labels: ←Podに付与するラベルを指定 app: httpd spec: containers: - name: httpd ←コンテナ名を指定 image: httpd ←コンテナを作成する際に使用するイメージを指定 ports: - containerPort: 80
この内容を「httpd.yml」として保存し、次のように実行するとコンテナが作成される。
> kubectl create -f httpd.yml
作成されたコンテナは「kubectl get pod」コマンドで確認できる(図13)。
また、前述したダッシュボードからも確認が可能だ(図14)。
ここでは「Pods」内にある「httpd」が作成されたコンテナだ。このPod名をクリックすると、さらにその詳細を確認できる(図15)。
さらにこの画面内上部にある「EXEC」や「LOGS」、「EDIT」、「DELETE」からはそれぞれシェルの実行、ログの表示、設定の変更、Podの削除を行える。たとえば「EXEC」をクリックするとコンテナ内でシェルが実行され、Webブラウザから操作を行える(図16)。
Podの削除は一覧画面からも行える(図17)。
ここではPodの作成を行ったが、同様にしてDeploymentsやReplica Setsの作成も可能だ。これらについて詳しくは続・KubernetesによるDockerコンテナ管理入門を参照して欲しい。
ダッシュボードからリソースを作成することもできる。ダッシュボード画面最上部にある「+CREATE」をクリックするとテキスト入力フォームが表示されるので、ここにYAMLもしくはJSON形式でリソース定義を記述する、もしくは「CREATE FROM FILE」をクリックしてリソースを定義したYAMLもしくはJSONファイルをアップロードすることで、対応したリソースの作成が可能だ(図18)。
この画面で「CREATE AN APP」をクリックすると表示されるフォームでは、フォームに必要事項を入力することでリソースを作成できる(図19)。
ここで「SHOW ADVANCED OPTION」をクリックすれば、ラベルやネームスペース、環境変数といった設定も行える(図20)。
ここで作成されたリソースはDeploymentとして作成され、自動で対応するPodやReplica Setsが作成される(図21)。
Minikube環境内のコンテナにアクセスする
Kubernetesでは「Service」というリソースを作成することで、特定のPodに対しクラスタ内からアクセスできる固定IPアドレスを割り当てることができる。Minikube環境内のコンテナにアクセスするには、この機能を利用すれば良い。Serviceの作成自体はMinikubeの場合でもkubernetesによるDockerコンテナ管理入門で紹介したものと同じ方法で行える。また、ダッシュボード経由でリソース定義ファイルを送信してServiceを作成することも可能だ。たとえば「app:httpd-test」というラベルを持つPodの80番ポートにアクセスするサービスを作成するには、次のような内容のリソース定義ファイルを用いれば良い(図22)。
apiVersion: v1 kind: Service metadata: name: httpd-service spec: type: LoadBalancer ports: - port: 80 selector: k8s-app: httpd-test
ここでは「selector:」に「k8s-app: httpd-test」と指定しているが、これはダッシュボードの「CREATE AN APP」機能で作成したDeploymentには「k8s-app: <指定したapp名>」というラベルが付けられるためだ。また、「type: LoadBalancer」を指定しているが、MinikubeにはKubernetesで利用できるロードバランサ機能が実装されており、これを指定することで仮想マシンを実行しているホストから直接コンテナにアクセスできるようになる。
さて、作成したServiceはダッシュボードの「Services」画面で確認できる(図23)。
この場合、「10.106.133.7」というIPアドレスがPodに割り当てられている。ただし、このIPアドレスに仮想マシンを実行しているホストから直接アクセスできるわけではない。ホストからこの仮想マシンにアクセスするには、コマンドプロンプトから「minikube service <サービス名>」のように「minikube service」コマンドを実行する。たとえば今回の例ではサービス名として「httpd-service」を指定しているので、次のようになる(図24)。
すると、このServiceに対応するURLがWebブラウザで開かれる(図25)。
この例では、「192.168.99.100:31733」がコンテナの80番ポートにアクセスするためのIPアドレスとポート番号となる。
Minikubeのアドオン機能
最後に、Minikubeの機能を拡張できるアドオン機能についても紹介しておこう。Minikubeではアドオンという仕組みでいくつかの機能が提供されており、たとえばDNS(kube-dns)やダッシュボード(dashboard)などもこのアドオンによって提供されている。有効になっているアドオンは、「minikube addons list」コマンドで確認できる(図26)。
デフォルトでは、アドオンを管理する「addon-manager」や「dashboard」、ストレージ機能を提供する「default-storageclass」や「storage-provisioner」、「kube-dns」が有効となっている。これ以外の機能を有効にするには、「minikube addons enable <アドオン名>」コマンドを実行すれば良い。
たとえば、Minikube環境内でDockerレジストリを実行する「registry」アドオンを利用するには、次のように実行する。
> minikube addons enable registry
アドオンについて詳しくはKubernetesの「Installing Addons」ページなどにまとめられているので、こちらを参照して欲しい。
手軽にKubernetesを試すには便利
さて、このようにMinikubeは少ない手間で簡単にKubernetes環境を用意できるため、まずKubernetesの雰囲気を知りたいという場合や、テスト環境が欲しいという場合に便利だ。特にWindowsやmacOS環境でも仮想化ソフトウェアさえ導入すれば簡単に利用できるため、コンテナベースで稼動させるサービスの開発・テストなどには役立つだろう。
一方で、ここで提供されるKubernetesクラスタ環境はあくまでテスト用であり、デフォルトで稼動するクラスタノードも1つだけだ。実運用されるKubernetesクラスタと違う部分も多くあり、セキュリティ面もほぼ考慮されていない。そのためMinikubeを実運用環境で利用することは現実的ではない点には注意したい。
本記事後編では、ここで作成したMinikube環境を使い、Googleが最近リリースしたKubernetes向けのデプロイツール「skaffold」を使ってコンテナのテストやデプロイを行う方法を紹介しよう。