テックコミュニティの運営側で、その技術分野を常に追いかけているエンジニアの方々にお話をうかがうインタビュー企画。ホストは関満徳が務めます。新型コロナ禍のさなか対面での取材を避け、リモートで行います。第3回目のゲストとしてお迎えしたのは、ソリューションアーキテクトとして活躍する太田航平氏です。
太田氏は、ソリューションアーキテクトとして従事する傍( かたわ ) ら、Docker Meetup Tokyo運営、CloudNative Days(旧Japan Container Days)実行委員会メンバーなどコンテナに関わる活動を精力的にされています。
関: コンテナ技術と出会ったのはいつぐらいなのでしょうか?
太田: 2016年の夏にWeb開発の小さい企業に転職した際、開発環境がDockerで作られており、そこで触ったのが初めてでした。
それまではVPS(Virtual Private Server 、仮想専用サーバ)を立てて、手でコマンドを打って作っていましたが、ミス発生時の対応が面倒でした。Dockerはとても便利なことに気付き、仕事だけでなく日常でも使うようになり、コミュニティを知った翌年には発表するに至り、気が付いたら運営をする側になっていました。
関: コンテナ技術やDocker、Kubernetesの関係を説明いただけますか?
太田: コンテナとは、アプリケーションの実行に必要な環境を、一つのパッケージにまとめた仮想的な単位です。その中でもDockerは、dotCloud社(Docker社の前身)が自社のPaaS(Platform as a Service )を作るために開発した、コンテナ型仮想化のアプリケーション実行基盤となります。既存のVM(Virtual Machine 、仮想マシン)型仮想化に比べて起動が非常に高速という特徴を持ちます。
最近は、耐障害性を上げるために単一のサーバで運用するよりも、複数のサーバで運用することが増えてきました。1台1台のサーバで動くアプリケーションはDockerで管理し、それらを管理するためのしくみがKubernetes、という関係だと理解するとよいです。
関: オンプレを支えたコンテナ技術がクラウドでも使われるようになった結果、アプリケーションに求められるようになったものは何でしょうか?
太田: オンプレは、クラウドに比べて変化に弱い傾向にあります。オンプレはマシンリソースの確保を含め、時間や金銭面でコストが大きいのに対し、クラウドは欲しいときに簡単に払い出すことができるうえに、APIも使えるようになります。AWS(Amazon Web Services )やAzure、GCP(Google Cloud Platform )などのクラウドサービスは、コマンドラインでの操作だけでなく、AnsibleやTerraformのような構成管理ツールを使うことができます。突然大きなトラフィックが発生した場合でも柔軟にスケールできるのは、クラウドのメリットでもあります。
ところで、インフラはスケール対応が比較的容易なのに対し、アプリケーションはそのままでもよいのでしょうか。そんなことはなく、アプリケーションも変更を加える必要があります。
アプリケーションが動くインスタンスが1台だけであれば問題ありません。しかし、コンテナや仮想マシンが並列で起動・シャットダウンするなど、インスタンスが増えたり減ったりする場合、複数で動かすための考慮が必要です。動的なインフラの上でもエラーなく処理を続行できる、つまりアプリケーションがステートレスな作りになっていることが重要です。
たとえばインメモリのデータベースに1つのアプリケーションとして作り込まれているケースというのは、ステートフルなアプリケーションなので、クラウドネイティブとは言えません。なぜなら、メモリの中のステートに依存しているアプリケーションは、再起動するとメモリに記録していた内容がすべて消えてしまうからです。このようにインメモリのままではまずいので、ステートレスな作りにする必要があります。
また、全部のリクエストを処理してからシャットダウンする機能(グレースフルシャットダウン)が必要です。たとえば、JavaのSpring Bootを使うと、フレームワークで用意されたグレースフルシャットダウンを利用できます。
このようにスケーリングに強いアプリケーション、いわゆるマイクロサービス間の依存性を小さくしていくことが、クラウドネイティブへの第一歩でもあります。
クラウドネイティブという考え方
太田: クラウドネイティブとは、疎結合なシステムで、復元力があって管理しやすいなどの特性を持った基盤をオープンなテクノロジを使って実現すること、また、それをできるように組織に力を与えることを指します。
クラウドネイティブをより厳密な定義に言及した文書としては、CNCF(Cloud Native Computing Foundation )が公開している「CNCF Cloud Native Defi nition v1.0 」などがあります。
関: クラウドネイティブの考え方を実践するにはどうすればよいですか?
太田: エコシステムはそろいつつありますので、モダンなWeb アプリケーションとしてあるべき姿を12のベストプラクティスにまとめた方法論[1] などを参考に、コンテナを使う、あるいはAWS Lambda、Google Apps Engine、Azureなどクラウドネイティブに対応したクラウドサービスが要求するお作法に従えば、スケールに対応した、いわゆるクラウドネイティブアプリケーションを開発することができます。
仮想マシンではわりとモノリシックなアプリケーションの書き方をすることが多かったと思いますが、コンテナやKubernetes を使うと、マイクロサービスや、マイクロサービスまではいかなくてもロールごとに機能を分けて作られていることが多いので、特定の機能だけを高速に起動してスケールさせることもできます。
DockerやKubernetesをこれから学習する方へ
関: DockerやKubernetesをこれから学ぶには、どうすればよいでしょうか?
太田: 自分で頑張って勉強する方法と、コミュニティの力を借りる方法の2つがあります。私は後者を推奨していますが、ハイブリッドで使い分けるのもよいでしょう。いずれにしても、いきなり大きいものを作るのではなく、まずは小さなものから始めましょう。小さいアプリケーションを作り、テストを書いて継続的インテグレーション(CI)で回す。テストが通ったあとは、テストが自動で回り、アプリケーションが自動でデプロイされるしくみにし、開発サイクルをそれにあわせます。ブランチ戦略やCI/CDパイプラインを整備し、手動でデプロイスクリプトを作らなくてよくします。コンテナを用意し、何かあったときにロールバックが簡単にできるようにしていきます。このような手順で進めれば、KubernetesやDockerを活用したスケールするアプリを作れるようになります。
関満徳 氏
関: Kubernetesをこれから始めたい人は、何からすればよいでしょうか?
太田: Minikube を使用してローカル環境でKubernetesを動かすか、Docker DesktopのオプションからKubernetesを有効にするかのどちらかがよいでしょう。Kubernetes 上では、AWSやGCP、Azureの違いを気にする必要はなく、各クラウドプロバイダのAPIの違いを吸収してくれるため、Kubernetesのコマンドやお作法を勉強するとよいです。ベースのしくみとしては基本的にはLinuxとなるため、どんな仮想マシンであっても、Linuxが動けば動くようになっています。
関: DockerやKubernetesを学ぶときに使うツールでお勧めはありますか?
太田: ブラウザだけでハンズオン形式に学ぶことができたり、使い捨て環境で自由に遊ぶことができるKatacoda というサイトが、DockerやKubernetesのイントロダクションを提供しているので、まずはそちらで試していただくとよいです。
コマンドに慣れてきたら、MacであればターミナルとVisual Studio Code、Windows 10であればWSL 2(Windows Subsystem for Linux 2 )とDocker Desktop for WindowsとVisual Studio Codeの組み合わせで使うとよいです。
Microsoft StoreからUbuntuをダウンロードし、WSL 2を起動するとLinuxのコマンドが使えるようになります。WSL 2には、Visual Studio CodeとDockerのインテグレーションがあるので、組み合わせて導入するとVisual Studio CodeでPythonのファイルを編集し、code-serverをインストールしてLinuxとつなぎ、LinuxのGitでファイルを管理し、そこで書いたコードをDocker Desktopで動かしていく、というやり方ができます。
Kubernetesのアップデート状況
関: Kubernetesのバージョンアップは、どのような状況でしょうか?
太田: Kubernetesは、3ヵ月に1回マイナーバージョンが出ており、2020年8月に1.19が正式リリースされました。バージョンアップで変わるのは主に基盤部分です。
ここ1年間は機能の拡張性を高めることに注力していました。どういうことかというと、クラウドサービスと言えども、AWSとGCPとAzureとではいろいろと違いがあり、それぞれ新機能や改善も発生します。当然、これらのクラウドサービスとKubernetesの間にはクラウドプロバイダのAPIによるやりとりがあり、クラウドサービスの機能を使う部分の変更がKubernetesのバージョンアップに反映される、という構図になっています。
関: 利用者側もたいへんそうですが、Kubernetes側もクラウドプロバイダ側もたいへんそうですね。
太田: 拡張性がないと、クラウドホスティング会社や、ある仮想マシンの機能を提供している会社が、新しい機能をKubernetes経由で使えるようにしたいとなった場合、コアのソースコードにコミットする必要があり、とてもたいへんになってきます。なぜなら、その変更がバグの温床にならないか、なぜ必要なのかを考えないといけないからです。そこで最近では、拡張用のコンポーネントは外に切り出して、拡張性を高めるためのAPIを用意し、コアのソースコードと拡張するソースコードを分離するようになりました。メインの機能には影響がないように守りながら、各クラウドプロバイダーの都合で外で開発できるようにしました。
関: その場合、クラウドプロバイダや利用者はどのような対応をすることになるのでしょうか。
太田: たとえば、あるベンダーが新しいストレージ製品を出したとします。しかしそれをKubernetesで使うにはコード修正が必要で、マージまで時間がかかり、顧客満足度が下がってしまいます。それがこの改善によって、ストレージを作った側がKubernetes経由で使えるソースコードを作成してGitHubで公開し、インストール方法を記載する、という対応をすればよくなりました。
今後は、KubernetesのLTS(Long Term Support )を作ろうという動きもでています。リリースサイクルを年4回から年3回に減らそう、という提案をしている方々もいます。今後はリリースサイクルにも動きがあるかもしれませんね。
Kubernetesのコミュニティ状況
関: Kubernetesコミュニティで共有される情報には、どのようなものがあるのでしょうか?
太田: 事例ベースの発表が多いです。Kubernetesはオープンソースなので「こういうプラグインを作りました」とか「既存のしくみだとここがかゆくて手が届かないので、拡張して便利なものを作りました。APIを使って拡張しました」というものですね。それ以外に、最新機能の紹介やストレージに着目した内容の紹介。Kubernetes自体は複数のマシンプールを大きな一つのプールに見立てる技術なので、開発者は関知しないけど管理者側からすれば負荷分散したい、リソースを均等に使いたい、という内容やしくじり先生的なもの、ハンズオン形式のイベントもなんかも結構好まれる傾向にありますね。
関: 昨今のコロナ禍の状況で、オンライン化が進んだのでしょうか?
太田: はい。Kubernetes Meetup Tokyo は完全にオンラインで開催されるようになりました。Kubernetes Novice Tokyo は、初回からオンライン開催でした。CloudNative Days Tokyo 2020は完全オンライン開催でしたし、次回もオンライン開催の予定です。Google Cloud Next '20のようなクラウドプロバイダ主催のものもオンライン開催でした。Open Source Summit Japanもオンライン開催が決まったようです。
関: Kubernetesの最新情報を得るにはどうしたらよいですか?
太田: Kubernetesのドキュメントはかなりの頻度で更新されるため、そちらをチェックするとよいでしょう。また、KubernetesにはオフィシャルSlack があり、#jp-users-noviceチャンネルでは気軽に質問できるようになっています。
写真1 太田さん(左)にはリモートで対応いただきました
読者へのメッセージ
関: 最後に、本誌読者のみなさんへのメッセージをいただいてもよいでしょうか?
太田: コンテナ技術やクラウドネイティブは、初心者に優しい部分と難しい部分がはっきり分かれており、コンセプトはわかりやすいが触ると難しい面もあります。もし何かわからないことがあれば、コミュニティをどんどん頼ってください。もしコミュニティで質問するのがハードルが高いようであれば、直接連絡いただけたらうれしいです。
特集1
イミュータブルデータモデルで始める
実践データモデリング
業務の複雑さをシンプルに表現!
特集2
いまはじめるFlutter
iOS/Android両対応アプリを開発してみよう
特集3
作って学ぶWeb3
ブロックチェーン、スマートコントラクト、NFT