Dockerなどのコンテナ技術を使ったクラスタ環境構築ツールとして広く使われているのが「Kubernetes」だ。しかし、Kubernetes環境を自前で構築するのにはやや骨が折れる。そこで今回は、仮想化技術を使って開発・テスト向けのKubernetes環境を構築するツール「Minikube」を紹介する。

Windows/macOS/LinuxでKubernetesのテスト環境を構築

Kubernetesはオープンソースで開発されているコンテナクラスタ構築ツールだ。Googleが積極的に推進していることもあり、昨今では広く使われるようになっている(図1)。

図1 KubernetesのWebサイト
図1 KubernetesのWebサイト

この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)。

図2 Windows環境では「システムのプロパティ」から環境変数の設定を行える
図2 Windows環境では「システムのプロパティ」から環境変数の設定を行える

次にkubectlをダウンロードし、パスの通ったディレクトリにコピーする。kubectlのダウンロードURLはKubernetesの「Install and Set Up kubectl」ページに掲載されている。。

MinikubeについてはGitHubのMinikubeリポジトリページに実行ファイル(バイナリ)のダウンロードリンクが掲載されているので、そこからバイナリをダウンロードし、ダウンロードしたファイルをkubectlと同様にパスの通っているディレクトリにコピーし、「minikube.exe」にリネームする。以上で最低限必要なファイルの準備は完了だ。

MinikubeでKubernetesクラスタを作成する

必要な設定の完了後、コマンドプロンプトを開いて「minikube start」コマンドを実行することで、Kubernetes環境がインストールされた仮想マシンが起動される。このとき、必要に応じてイメージファイルのダウンロードやファイルのコピーなども行われる(図3)。

図3 Minikubeを実行すると必要な環境設定が自動で行われる
図3 Minikubeを実行すると必要な環境設定が自動で行われる

なお、デフォルトでは最新安定版のKubernetes環境が自動的に構築されるが、「–kubernetes-version <バージョン番号>」オプションを指定することで特定のバージョンを指定することもできる。選択できるバージョンは「minikube get-k8s-versions」コマンドで確認できる(図4

図4 「minikube get-k8s-versions」コマンドで選択できるバージョンを確認できる
図4 「minikube get-k8s-versions」コマンドで選択できるバージョンを確認できる

「minikube start」コマンドを実行すると仮想マシンがバックグラウンド(Headless)で起動され、Kubernetesクラスタが利用可能となる。このときウィンドウは表示されないが、VirtualBoxのGUIからはその存在が確認できる(図5)。

図5 VirtualBoxのGUIからminikube環境が実行されていることを確認できる
図5 VirtualBoxのGUIからminikube環境が実行されていることを確認できる

この状態でコマンドプロンプトから「kubectl cluster-info」コマンドを実行すると、ローカルネットワーク上でKubernetesのマスターノードが稼動していることが分かる(図6)。「kubectl get node」コマンドでノードを確認すると、「minikube」というノードが動いていることも確認できる。

図6 kubectlでminikube環境の情報を取得できる
図6 kubectlでminikube環境の情報を取得できる

「minikube dashboard」コマンドを実行すると、WebブラウザでKubernetesのGUIコンソールにアクセスできる(図7、8)。

図7 「minikube dashboard」コマンドを実行するとKubernetesのダッシュスボードにアクセスできる
図7 「minikube dashboard」コマンドを実行するとKubernetesのダッシュスボードにアクセスできる
図8 minikube環境で提供されるKubernetesのダッシュボード
図8 minikube環境で提供されるKubernetesのダッシュボード

このダッシュボードでは実行中のコンテナに関する情報や設定情報などクラスタに関するさまざまな情報を閲覧できるとともに、設定変更やコンテナの起動といった操作もここから行える。

ちなみに、このダッシュボードはKubernetes内の「kube-system」というネームスペース内で実行されている「kubernetes-dashboard」というdeploymentによって提供されている。kube-systemネームスペース内ではこれに加え、Kubernetesクラスタ内でDNSを提供する「kube-dns」も実行されている(図9)。

図9 Kubernetesクラスタ内ではDNSやダッシュボードを提供するコンテナが実行されている
図9 Kubernetesクラスタ内ではDNSやダッシュボードを提供するコンテナが実行されている

また、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)。

図10 Minikube環境内のDockerにアクセスするための設定コマンドが表示される 
図10 Minikube環境内のDockerにアクセスするための設定コマンドが表示される 

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)。

図11 「docker version」
図11 「docker version」

また、次のように「docker ps」コマンドを実行すればMinikube環境内で動いているコンテナを確認できる(図12)。

図12 「docker ps」コマンドを実行するとMinikube環境内で動いているコンテナを確認できる
図12 「docker ps」コマンドを実行するとMinikube環境内で動いているコンテナを確認できる

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)。

図13 作成されたコンテナは「kubectl get pod」コマンドで確認できる
図13 作成されたコンテナは「kubectl get pod」コマンドで確認できる

また、前述したダッシュボードからも確認が可能だ(図14)。

図14 Webブラウザからアクセスできるダッシュボードからも作成されたコンテナを確認できる
図14 Webブラウザからアクセスできるダッシュボードからも作成されたコンテナを確認できる

ここでは「Pods」内にある「httpd」が作成されたコンテナだ。このPod名をクリックすると、さらにその詳細を確認できる(図15)。

図15 ダッシュボードからPodの詳細を確認できる
図15 ダッシュボードからPodの詳細を確認できる

さらにこの画面内上部にある「EXEC」や「LOGS」、「EDIT」、「DELETE」からはそれぞれシェルの実行、ログの表示、設定の変更、Podの削除を行える。たとえば「EXEC」をクリックするとコンテナ内でシェルが実行され、Webブラウザから操作を行える(図16)。

図16 「EXEC」をクリックするとシェルが起動され、Webブラウザからコンテナ内にアクセスできる
図16 「EXEC」をクリックするとシェルが起動され、Webブラウザからコンテナ内にアクセスできる

Podの削除は一覧画面からも行える(図17)。

図17 「Pods」画面のPod一覧にある「⋮」をクリックするとメニューが表示される
図17 「Pods」画面のPod一覧にある「⋮」をクリックするとメニューが表示される

ここではPodの作成を行ったが、同様にしてDeploymentsやReplica Setsの作成も可能だ。これらについて詳しくは続・KubernetesによるDockerコンテナ管理入門を参照して欲しい。

ダッシュボードからリソースを作成することもできる。ダッシュボード画面最上部にある「+CREATE」をクリックするとテキスト入力フォームが表示されるので、ここにYAMLもしくはJSON形式でリソース定義を記述する、もしくは「CREATE FROM FILE」をクリックしてリソースを定義したYAMLもしくはJSONファイルをアップロードすることで、対応したリソースの作成が可能だ(図18)。

図18 「CREATE」をクリックすると表示されるリソース作成画面からのリソース作成も可能だ
図18 「CREATE」をクリックすると表示されるリソース作成画面からのリソース作成も可能だ

この画面で「CREATE AN APP」をクリックすると表示されるフォームでは、フォームに必要事項を入力することでリソースを作成できる(図19)。

図19 コンテナイメージやラベル名を入力してリソースを作成することもできる
図19 コンテナイメージやラベル名を入力してリソースを作成することもできる

ここで「SHOW ADVANCED OPTION」をクリックすれば、ラベルやネームスペース、環境変数といった設定も行える(図20)。

図20 「SHOW ADVANCED OPTION」をクリックするとより詳細な設定を行える
図20 「SHOW ADVANCED OPTION」をクリックするとより詳細な設定を行える

ここで作成されたリソースはDeploymentとして作成され、自動で対応するPodやReplica Setsが作成される(図21)。

図21 作成されたリソースの例
図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
図22 リソース定義ファイルをダッシュボードに入力してServiceを作成する
図22 リソース定義ファイルをダッシュボードに入力してServiceを作成する

ここでは「selector:」に「k8s-app: httpd-test」と指定しているが、これはダッシュボードの「CREATE AN APP」機能で作成したDeploymentには「k8s-app: <指定したapp名>」というラベルが付けられるためだ。また、「type: LoadBalancer」を指定しているが、MinikubeにはKubernetesで利用できるロードバランサ機能が実装されており、これを指定することで仮想マシンを実行しているホストから直接コンテナにアクセスできるようになる。

さて、作成したServiceはダッシュボードの「Services」画面で確認できる(図23)。

図23 ダッシュボードの「Services」画面
図23 ダッシュボードの「Services」画面

この場合、「10.106.133.7」というIPアドレスがPodに割り当てられている。ただし、このIPアドレスに仮想マシンを実行しているホストから直接アクセスできるわけではない。ホストからこの仮想マシンにアクセスするには、コマンドプロンプトから「minikube service <サービス名>」のように「minikube service」コマンドを実行する。たとえば今回の例ではサービス名として「httpd-service」を指定しているので、次のようになる(図24)。

図24 ホストから「minikube service」コマンドを実行する
図24 ホストから「minikube service」コマンドを実行する

すると、このServiceに対応するURLがWebブラウザで開かれる(図25)。

図25 WebブラウザでServiceに対応するURLが開かれる
図25 WebブラウザでServiceに対応するURLが開かれる

この例では、「192.168.99.100:31733」がコンテナの80番ポートにアクセスするためのIPアドレスとポート番号となる。

Minikubeのアドオン機能

最後に、Minikubeの機能を拡張できるアドオン機能についても紹介しておこう。Minikubeではアドオンという仕組みでいくつかの機能が提供されており、たとえばDNS(kube-dns)やダッシュボード(dashboard)などもこのアドオンによって提供されている。有効になっているアドオンは、「minikube addons list」コマンドで確認できる(図26)。

図26 「minikube addons list」コマンドで有効となっているアドオンが確認できる
図26 「minikube addons list」コマンドで有効となっているアドオンが確認できる

デフォルトでは、アドオンを管理する「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」を使ってコンテナのテストやデプロイを行う方法を紹介しよう。