教えて! 最新技術―テックコミュニティの現場から

第3回 コンテナ技術やクラウドネイティブのこれまでとこれから

この記事を読むのに必要な時間:およそ 3.5 分

テックコミュニティの運営側で,その技術分野を常に追いかけているエンジニアの方々にお話をうかがうインタビュー企画。ホストは関満徳が務めます。新型コロナ禍のさなか対面での取材を避け,リモートで行います。第3回目のゲストとしてお迎えしたのは,ソリューションアーキテクトとして活躍する太田航平氏です。

太田氏は,ソリューションアーキテクトとして従事するかたわら,Docker Meetup Tokyo運営,CloudNative Days(旧Japan Container Days)実行委員会メンバーなどコンテナに関わる活動を精力的にされています。

画像

太田 航平(OTA Kohei)さん

ヒューレット・パッカード・エンタープライズにて,ソリューションアーキテクトとして勤務。クラウドネイティブ道を極めるべく日々修行の毎日を送っている。

GitHub:inductor
Twitter:@_inductor_
URL:https://inductor.me/

関:コンテナ技術と出会ったのはいつぐらいなのでしょうか?

太田:2016年の夏にWeb開発の小さい企業に転職した際,開発環境がDockerで作られており,そこで触ったのが初めてでした。

それまではVPSVirtual Private Server仮想専用サーバ)を立てて,手でコマンドを打って作っていましたが,ミス発生時の対応が面倒でした。Dockerはとても便利なことに気付き,仕事だけでなく日常でも使うようになり,コミュニティを知った翌年には発表するに至り,気が付いたら運営をする側になっていました。

関:コンテナ技術やDocker,Kubernetesの関係を説明いただけますか?

太田:コンテナとは,アプリケーションの実行に必要な環境を,一つのパッケージにまとめた仮想的な単位です。その中でもDockerは,dotCloud社(Docker社の前身)が自社のPaaSPlatform as a Serviceを作るために開発した,コンテナ型仮想化のアプリケーション実行基盤となります。既存のVMVirtual Machine仮想マシン)型仮想化に比べて起動が非常に高速という特徴を持ちます。

最近は,耐障害性を上げるために単一のサーバで運用するよりも,複数のサーバで運用することが増えてきました。1台1台のサーバで動くアプリケーションはDockerで管理し,それらを管理するためのしくみがKubernetes,という関係だと理解するとよいです。

関:オンプレを支えたコンテナ技術がクラウドでも使われるようになった結果,アプリケーションに求められるようになったものは何でしょうか?

太田:オンプレは,クラウドに比べて変化に弱い傾向にあります。オンプレはマシンリソースの確保を含め,時間や金銭面でコストが大きいのに対し,クラウドは欲しいときに簡単に払い出すことができるうえに,APIも使えるようになります。AWSAmazon Web ServicesやAzure,GCPGoogle Cloud Platformなどのクラウドサービスは,コマンドラインでの操作だけでなく,AnsibleやTerraformのような構成管理ツールを使うことができます。突然大きなトラフィックが発生した場合でも柔軟にスケールできるのは,クラウドのメリットでもあります。

ところで,インフラはスケール対応が比較的容易なのに対し,アプリケーションはそのままでもよいのでしょうか。そんなことはなく,アプリケーションも変更を加える必要があります。

アプリケーションが動くインスタンスが1台だけであれば問題ありません。しかし,コンテナや仮想マシンが並列で起動・シャットダウンするなど,インスタンスが増えたり減ったりする場合,複数で動かすための考慮が必要です。動的なインフラの上でもエラーなく処理を続行できる,つまりアプリケーションがステートレスな作りになっていることが重要です。

たとえばインメモリのデータベースに1つのアプリケーションとして作り込まれているケースというのは,ステートフルなアプリケーションなので,クラウドネイティブとは言えません。なぜなら,メモリの中のステートに依存しているアプリケーションは,再起動するとメモリに記録していた内容がすべて消えてしまうからです。このようにインメモリのままではまずいので,ステートレスな作りにする必要があります。

また,全部のリクエストを処理してからシャットダウンする機能(グレースフルシャットダウン)が必要です。たとえば,JavaのSpring Bootを使うと,フレームワークで用意されたグレースフルシャットダウンを利用できます。

このようにスケーリングに強いアプリケーション,いわゆるマイクロサービス間の依存性を小さくしていくことが,クラウドネイティブへの第一歩でもあります。

クラウドネイティブという考え方

太田:クラウドネイティブとは,疎結合なシステムで,復元力があって管理しやすいなどの特性を持った基盤をオープンなテクノロジを使って実現すること,また,それをできるように組織に力を与えることを指します。

クラウドネイティブをより厳密な定義に言及した文書としては,CNCFCloud Native Computing Foundationが公開しているCNCF Cloud Native Defi nition v1.0などがあります。

関:クラウドネイティブの考え方を実践するにはどうすればよいですか?

太田:エコシステムはそろいつつありますので,モダンなWeb アプリケーションとしてあるべき姿を12のベストプラクティスにまとめた方法論注1などを参考に,コンテナを使う,あるいはAWS Lambda,Google Apps Engine,Azureなどクラウドネイティブに対応したクラウドサービスが要求するお作法に従えば,スケールに対応した,いわゆるクラウドネイティブアプリケーションを開発することができます。

仮想マシンではわりとモノリシックなアプリケーションの書き方をすることが多かったと思いますが,コンテナやKubernetes を使うと,マイクロサービスや,マイクロサービスまではいかなくてもロールごとに機能を分けて作られていることが多いので,特定の機能だけを高速に起動してスケールさせることもできます。

注1)
Twelve-Factor App:https://12factor.net/ja/

著者プロフィール

関満徳(せきみつのり)

グロース・アーキテクチャ&チームス㈱でプロダクトオーナー支援スペシャリスト,ディスカバリーコーチとして,エンタープライズ領域の企業にDX化のコンサルティングサービスを提供。

GitHub:fullvirtue
Twitter:@fullvirtue
URL:https://fullvirtue.com/