「え?今さら?」と思う方もいるかもしれませんが、最近(2020年4月)になってようやくKubernetesデビューすることになりそうです。
今までのプロジェクトではクラウドとはまったく縁がなく、また自発的に覚えようともしてこなかったのですが、今回、某国の政府系組織のクラウド移行プロジェクトの片隅で仕事をすることになり、そこがAmazonプライベートクラウド上でKubernetesを使うそうなので勉強を始めてみました。
最終的にはJavaのWebサービスを作るのが要件で、
- Spring Bootのアプリケーションをdockerコンテナ化する方法
- Kubernetesにデプロイをする方法
を通じてKubernetesの基礎を学習しましたので、その手順をチュートリアルとして紹介したいと思います。内容的にはKubernetesに一度も触ったことがない人向けとなります。
作業の大まかな流れは以下の通りです。
- ローカルで動くKubernetes環境(minikube)をインストール
- シンプルなSpring BootのアプリケーションをKubernetes上にデプロイして動作確認
前提条件
紹介する手順は、Mac上で動作を確認しました。Windowsの手順もあわせて掲載していますが、動作確認を行っていませんのでご了承ください。
ソフトウェア要件
- JDK 8
- Maven
ハードウェア要件
- メモリ8GB以上
minikubeの概要
minikubeはローカルPC上に小規模なKubernetes環境を作成するツールです。本来、KubernetesはLinux上で実行するものですが、minikubeはWindowsやMacでも使えるようになっています。
中で動いているのは本物のKubernetesのようですが、PC環境でも動くようにメモリ使用量などを抑えた最小構成となっており、開発環境という位置付けとなっていて、全体イメージは以下のようになっています。
minikubeはVirtualBox以外の仮想マシンもサポートしているようですが、今回はWindowsでもMacでも使えるVirtualBoxを選択します。
minikubeをインストール
全体像を理解したところで、早速minikubeをインストールしていきましょう。
僕はMacなので、HomeBrewを使ってインストールしました。
各プラットフォームでのインストール方法はこちらをご覧ください:https://kubernetes.io/ja/docs/tasks/tools/install-minikube/
インストールが成功したら、ターミナルでminikubeというコマンドが使えるようになっているはずです。
試しにバージョンを表示させてみましょう。
minikube version
僕の環境では以下のバージョンが表示されました。
minikube version: v1.9.0
commit: 48fefd43444d2f8852f527c78f0141b377b1e42a
VirtualBoxをインストール
続いてVirtualBoxをインストールします。
MacでHomeBrewが入っていれば
brew cask install virtualbox
でインストールできます。
それ以外の場合は、https://www.virtualbox.org からダウンロードしてインストールしましょう。
minikubeでKubernetesを起動
minikubeとVirtualBoxのインストールが完了したら、Kubernetesを起動しましょう。
ターミナルから
minikube start --vm-driver=virtualbox
と実行すると、ローカルPC上にKubernetesクラスタが立ち上がります。
このときVirtualBoxを立ち上げると、「minikube」という仮想マシンが立ち上がっていることが分かります。下の画像のminikube以外のVMはもともとあったもので、今回の内容とは関係ないものです、念のため。
Kubernetes Dashboardを見てみる
minikubeが起動したら、Kubernetesダッシュボードを起動してみましょう。
minikube dashboard
を実行すると、
🔌 Enabling dashboard ...
🤔 Verifying dashboard health ...
🚀 Launching proxy ...
🤔 Verifying proxy health ...
🎉 Opening http://127.0.0.1:59020/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/ in your default browser...
と出力され、そのままブラウザが立ち上がりKubernetesのダッシュボードが開きます。
今回はここからは操作を行いませねが、どんな設定項目があるのかをざっと眺めておきましょう。
「hello world」するSpring Bootアプリケーションを作成
続いてシンプルなSpring Bootのアプリケーションを用意しますが、ここではサンプルコードを用意してあるので、こちらからダウンロードしてください。
URL: https://dawaan.com/downloads/kubernetes-hello-world-service.zip
SHA-256:04bc053434c6bed98154bfe9b72166ec1fee4dc4322d3c7eb04191589877e1f5
MD5: 702c1aae0cf1c093c5afdc19122f4313
ファイルを解凍したら、まずはKubernetesではなく、ローカルPC上で実行して動作を確認しておきましょう。
mvn spring-boot:run
アプリケーションが起動したら、http://localhost:8080/greet にアクセスすると下のような画面が開きます。
とりあえずアプリケーションは動いていますね。
hello-world-serviceをKubernetesにデプロイ
では続いて、このアプリケーションをminikubeクラスタにデプロイします。
まずは、以下のコマンドでdockerの環境変数を設定します。
Macの場合
eval $(minikube docker-env)
Windowsの場合 (PowerShellを使用)
minikube docker-env --shell powershell | Invoke-Expression
これはビルド中に作成されたdockerイメージをminikube内で使用可能にするために必要なようです。
そして次のコマンドでアプリケーションをビルドしてデプロイを行います。
mvn clean install fabric8:apply
上記のコマンドを実行すると、以下のことが行われます。
- hello-world-serviceを実行可能形式のjarファイルとして作成
- hello-world-serviceアプリケーションを実行するdockerイメージを作成
- 作成したdockerイメージをminikube内のdockerエンジンから使用できるようにする
- Kubernetes内にhello-world-serviceというサービス用の設定ファイルを作る
- Kubernetes内にhello-world-serviceというデプロイメント用の設定ファイルを作る
- 上のステップで作られたサービスとデプロイメントの設定をKubernetesに反映
- Kubernetesがhello-world-serviceを実行するpodを起動する
ビルドが成功したら、以下のコマンドを実行すると、このサービスにアクセスするためのURLを取得できます。
minikube service hello-world-service --url
すると以下のようなURLが返されます。
http://192.168.99.101:32063
これがminikube内で実行しているhello-world-serviceのURLです。
これをベースURLとして、hello worldを表示する/greetというパスをつけてアクセスしてみると・・・
できました!
何が起こったのか解説を試みる
一通り動作を確認できたところで、先ほどのビルドについて少し補足しておきましょう。
環境変数を設定する理由
ビルドの前に環境変数の設定を行いましたが、これは以下のような環境変数をセットしています。
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.101:2376"
export DOCKER_CERT_PATH="/Users/me/.minikube/certs"
export MINIKUBE_ACTIVE_DOCKERD="minikube"
この192.168.99.101というのはminikubeの仮想マシンのIPです。これらを設定することによって、このターミナル内ではminikube内のdockerを使用するようにしています。
こうすることで、ビルドで作成したdockerイメージがminikube内のdockerレジストリに登録され、あとでKubernetesがpodを作るときにはminikube内でローカルに見つけてくれるようです。
fabric8プラグイン
サンプルコードのpom.xmlを見ると、fabric8というmavenのプラグインを呼び出していることに気づくでしょう。
このプラグインは、KubernetesとOpenShiftに関する操作を提供するプラグインです。ちなみにOpenShiftというのは、RedHatが開発するKubernetesをベースにしたソフトウェアとのことです。
このfabric8プラグインがSpring Bootの実行可能形式のjarファイルをベースにDockerイメージを作成し、続いてsrc/fabric8/app.yml ファイルとpom.xml内の<enricher>の設定をもとにKubernetesのデプロイメントとサービスを作成しています。
作成されたdockerイメージは、ビルドに使用したのと同じターミナルから
docker images
と実行すると確認できます。
REPOSITORY TAG IMAGE ID CREATED SIZE
demo/hello-world-service latest 5495c2b553ab 51 minutes ago 474MB
ここではdemo/hello-world-serviceという名前で作成されています。
そしてtarget/fabric8/applyJsonフォルダ内には
- deployment-hello-world-service.json
- service-hello-world-service.json
という二つのファイルが生成されています。これらのファイルに記述されたでKubernetesに対してデプロイメントとサービスを作成するように指示をしたのでしょう。
続いて、Kubernetes Dashboardをブラウザで確認してみましょう。
Deployment、Service、Podにhello-world-serviceが作られているのが確認できると思います。
Podを選択するとログを確認したりコンテナにbashで接続したりとできるので、ご自身でアクセスしてみて遊んでみましょう。
まとめ
以上の手順で
- Kubernetesがどんなものか
- Spring Bootのアプリケーションをコンテナ化してデプロイする方法
を理解していただけたと思います。
Kubernetesの主要な概念については公式ドキュメントが非常に役に立つので、ぜひご覧ください。
https://kubernetes.io/ja/docs/tutorials/kubernetes-basics/