次のプロジェクトでは、DockerとKubernetesでクラウドネイティブだ!
……Kubernetesってなんだ?
『Kubernetesは水平スケールを前提としたコンテナアプリケーションのオーケストレーションツールであり、クラウドサービスとAPIによって密に接続し自動化されたインフラストラクチャーの上でワークロードをデプロイできます』
Kubernetesについて調べたアプリケーション開発者の多くは、このような言葉を見かけて首をかしげることでしょう。結局開発者がどう変わる必要があるのだろうか、と。Kubernetesはそのクラスターそのものがメンテナンスすることが難しく、またインフラストラクチャーも複雑です。そのため、世の中にはKubernetesそのものに関する解説書が多数存在しています。しかし、本書ではそういったKubernetesそのものに焦点を置かず、Kubernetesを利用するアプリケーション開発者に焦点を置いています。本書は「どのようにしてアプリケーションをコンテナ化するのか」「どのようにコンテナアプリケーションをデプロイするのか」「どのようにアプリケーションを運用、監視するのか」を学び、開発者がどのように変わるべきか、どのようなことを知っておくべきかを知るきっかけを作ることが目的です。話題のコンテナやKubernetesの上で、自分の開発したアプリケーションをいい感じに動かすためのいろはを学んでいきましょう。そのため、Kubernetesそのものに関する細かい解説はありません。Kubernetesの構築方法や細かい操作方法や運用方法、そのインフラストラクチャーについては本書に記載がないことをご了承ください。
本書はもともと同人誌として出版されていた「Java開発 for Kubernetes」を元に、JavaとSpring BootとKubernetesのバージョンアップとページ数の都合上削除したコンテンツを追加した書籍となっています。
本書ではJava言語やSpring Boot、JVMに特化した話をしますが、一方で多くの章で解説する内容はほかの言語/ランタイムを扱うアプリケーション開発者の方にも参考になる内容をまとめてあります。Kubernetes上でJavaアプリケーションを開発したいという人が、全体概要をつかみ、来たる本番デプロイや本番運用に備えることができると思います。
・Java言語、特にSpring Bootを利用してアプリケーションを開発する人
・DockerやKubernetes上で動かすアプリケーション開発に興味のある人
本書では、下記のソフトウェアバージョンで動作検証をしております。
・Java +17
・Kubernetes 1.23-1.25
・Spring Boot 2.7.4, 3.0.0-M4
本書は4つの章と付録で構成されています。
第1章「「コンテナ」いろはにほへと」
この章ではコンテナやKubernetesについて紹介します。コンテナとはどのような技術なのか、コンテナを使うことでアプリケーションの姿がどのように変わるのか、Kubernetesを利用することでどのようにアプリケーションをデプロイするようになるのかを学びます。
第2章「サンプルJavaアプリケーションのデプロイ」
アプリケーションのサンプルプロジェクトを利用して、JavaアプリケーションをコンテナにしてKubernetes上にデプロイしてみます。この章では実際にサーバーサイドアプリケーションを実装して、アプリケーションを起動するコンテナを作成し、インフラストラクチャを記述してデプロイする、コンテナの世界における一般的な開発フローの全体像を確認します。
第3章「コンテナ向けツールを使った効率のいい開発」
コンテナを利用する開発体験をより効率化するためのツールが、OSSとして公開されています。よりよいコンテナイメージとよりよい開発体験をサポートするためのツール群を紹介し、アプリケーション開発者がコンテナとKubernetesの恩恵を受けるための環境を紹介します。
第4章「運用を見据えた開発のためのナレッジ集」
アプリケーションエンジニアが開発した成果物は、その後長い長い運用フェーズで使われていきます。しかしコンテナやKubernetesの世界ではオンプレミスな運用の世界と大きく異なる部分があるため、アプリケーションそのものをコンテナにする実装を入れる必要が出てきます。この章ではアプリケーションエンジニアの視点だけからは見えにくい、インフラストラクチャー/運用を主とするエンジニアと連携するための概念や実装について紹介します。
付録A「アプリケーション開発者から見たKubernetesの地平線」
Kubernetesはさまざまなコンポーネントが組み合わさって動く、分散アプリケーションです。そのため、アプリケーションやコンテナに問題が起きたときにどこを調査すればいいのかわからなくなることが多々あります。この付録ではアプリケーションエンジニアが大きくかかわることになるKubernetesのさまざまなコンポーネントについて紹介し、知見の幅を広げるとともに、今後の学習のきっかけを作ります。
本書を通してJava/Kubernetesについて学ぶために、次のソフトウェアを用意しておいてください。
JDK(Java 17+)
本書ではJava 17を利用します。
Docker
コンテナを起動するためのソフトウェア、Dockerを使ってアプリケーションのコンテナを操作します。
Kubernetes
Dockerで作成したコンテナをデプロイする環境として利用します。
WindowsやMac、Linux Desktop(Ubuntu Desktopなど)の環境では、Docker Desktopを利用するとDockerとKubernetesの両方を同時にセットアップできるのでお勧めです。1Docker Desktopに限らず、kind(Kubernetes in Docker)やminikubeなどのローカルで起動できるKubernetesクラスタを利用しても問題ありません。
最終的には次のコマンドを実行できるようになっていれば、本書の内容をスムーズに進めることができると思います。
$ java --version
openjdk 17.0.3 2022-04-19 LTS
OpenJDK Runtime Environment Microsoft-32931 (build 17.0.3+7-LTS)
OpenJDK 64-Bit Server VM Microsoft-32931 (build 17.0.3+7-LTS, mixed mode, sharing)
$ docker version
Client:
Version: 20.10.17+azure-1
Server:
Engine:
Version: 20.10.17+azure-1
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"24", GitVersion:"v1.24.2", GitCommit:"f66044f4361b9f1f96f0053dd46cb7dce5e990a8", GitTreeState:"clean", BuildDate:"2022-06-15T14:22:29Z", GoVersion:"go1.18.3", Compiler:"gc", Platform:"linux/amd64"}
Kustomize Version: v4.5.4
Server Version: version.Info{Major:"1", Minor:"24", GitVersion:"v1.24.1", GitCommit:"3ddd0f45aa91e2f30c70734b175631bec5b5825a", GitTreeState:"clean", BuildDate:"2022-05-24T12:18:48Z", GoVersion:"go1.18.2", Compiler:"gc", Platform:"linux/amd64"}
もしIDEにこだわりがないようでしたら、先に「2.1 (オプション) Development Container」を参考に、Visual Studio Codeを利用した開発環境を事前に構築しておくことを推奨します。Visual Studio Codeを「2.1 (オプション) Development Container」の内容と合わせることで、ローカル開発に必要な全機能を簡単に準備できます。
本書で取り上げるJVMのオプションやbuildpacksなどの一部実装やツールは、amd64のみ対応しているものがあります。そのため、AppleシリコンベースのMacやRaspberry Piなどの環境で本書をトレースする場合、一部うまくいかないことがあります。ご了承ください。
本書で取り扱うソースコードは、すべて次にGitHubリポジトリにて公開されています。
https://github.com/RyuSA/java-for-k8s.git
本書に記載された内容は、情報の提供のみを目的としています。したがって、本書を用いた開発、製作、運用は、必ずご自身の責任と判断によって行ってください。これらの情報による開発、製作、運用の結果について、著者はいかなる責任も負いません。
また本書に記載している内容は私自身の見解であり、必ずしも所属する企業や組織の立場、戦略、意見を代表するものではありません。
本書に記載されている会社名、製品名などは、一般に各社の登録商標または商標、商品名です。会社名、製品名については、本文中では©、®、™マークなどは表示していません。
・コンテナの基本概念
・dockerコマンドの基本操作
・Kubernetesの概念
・kubectlの基本操作
コンテナとは、簡単にいえばひとつのプロセスをいい感じに実行するための、独立した実行環境のことです。アプリケーションのコンテナを作成しておくことで、自動化されたインフラストラクチャーの上にコンテナという単位でアプリケーションをデプロイ、柔軟なスケールアウト、バージョンアップを行えます。
本章ではコンテナ関連の基本知識と、Kubernetesとは何か、その基本操作について紹介します。開発者はコンテナがどのようなものなのか、またそれがどのように動くのかを知っておくことで、より使いやすく効率のよい開発を進めることができます。コンテナとは何か、Docker/Kubernetesの基本的な概念を理解している人は本章をスキップしていただいて問題ありません。