Kubernetesを学ぶ際に良い教材

司会者:ではみなさんからの質問に回答していければと思っています。「Kubernetesを学ぶ際に良い教材がありましたら教えてください」。

浅野大我氏(以下、浅野):まずKubernetesは移り変わりがすごい激しくて、例えば日本語の書籍でもKubernetesの本はいろいろ出ています。

司会者:解説書みたいな。

浅野:解説書みたいなものが出てはいますが、だいたいそれは1年ぐらい前の本で、その間にバージョンは2つとか3つとか進んじゃうことがけっこうあるんですね。次のバージョンではこれを廃止します、みたいなことも決めていたりするので。

けっこう最新の情報を追いたいのであれば、書籍ではなくてKubernetesのSlackなどもありますし、KubernetesのGitHubのリポジトリも kubernetes/kubernetes というKubernetesのリポジトリがあるので、そこなどをみて最新情報をつかんでいく。

もしKubernetesをイチから学びたい場合は、kubernetes.ioというKubernetesの公式サイトがあってドキュメントがありますが、そのドキュメントはもちろん最新のものがあるので、そこを参考にクラスタを構築する際なども参考にしていくといいんじゃないかなというのは1つあります。

司会者:それは情報としてキャッチアップするのはSlackを見たり。

浅野:GitHubのリポジトリを直接覗いてみたり。

司会者:もしくは公式のもの。

浅野:公式のですね。公式のドキュメントもかなり充実しているので、英語もありますが、もちろん日本のコミュニティのほうで翻訳をしているものもあるので、そういうのを参照してみて、気になったことがあれば検索したりするのが一番いいかなと思いますね。

司会者:決して書籍ではダメというわけではないですよね?ただ、どうしてもちょっとタイムラグが出てしまうので。

浅野:そうです。なのでKubernetesの基本的なことを学びたいという場合であれば『Kubernetes完全ガイド』という本が出ていると思いますが、それが一番参考になるのかなと思います。例えば先ほどコントローラーがあって、といった話をしたと思いますが、そのコントローラーもビルトインで書いている。

Kubernetesのコントローラーはけっこういろいろな種類がありますが、それの解説なども載っているので、それも参照したらいいんじゃないかなと。本を1回読んで理解をしてみて、詳しく見たい場合は、そこに書いてあるセクションとkubernetes.ioの公式ドキュメントを探すと意外と載っていたりするので、そこを参照するのがいいんじゃないかな、と。

司会者:なるほど。そうなると書籍を用意しつつ、最新情報はこちらでキャッチアップしに行ったり、もっと最新版を知りたいとかであれば公式を見に行ったり、GitHubのリポジトリを見に行ったりなどのかたちが良いと。

浅野:良いかもしれないです。

実際にデプロイしてみるのも大事

司会者:ちなみに浅野さんはどうやってキャッチアップや勉強などをされているんですか?

浅野:そうですね。最初に『モンスターストライク』でKubernetesを導入していた時に、わりと基礎的な部分をサラッと頭の中に入れたんですよね。

司会者:その基礎的な部分は、どうサラッと入っていったんですか?

浅野:なんだろう(笑)。実際にKubernetesを学ぶ時に本を読むのもいいんですが、実際にそのマネージドでもいいので、クラスタに何かデプロイしてみるのも大事で。実際にPodをデプロイしたり削除したり変更したりして、どういう動きをするのかを観察して、気になったら実際にKubernetesのコードとKubernetesのGitHubのリポジトリにコードがあるので、このへんがどうなっているのかを見たりしていて。学習していた時はそんな感じでしたね。

司会者:そうなると、例えば今ご自身が携われているプロダクトサービスにKubernetesを使われていないケースもあると思いますが、その場合はもう自分で1回やってみると。

浅野:それをKubernetesにすることで得られるメリット・デメリットというのがあると思っていて、Kubernetesはけっこう良い技術なのですが、あらゆるものを抽象的に扱っているのと、先ほども言ったようにKubernetesのリソースはけっこう自由が利いてしまうので、その自由が利くというところを、逆にプロダクトの規模感や要件によっては合わない場合があるんですね。

できればマネージドをしてほしいという場合だと、例えばGoogle Cloud RunだったりやAWSのFargateなどがけっこう選択肢に上がってくるんじゃないかなと思っていて、要件次第ではKubernetesを使わないほうが良い場合というのもけっこうあるんですよね。

司会者:なるほど。

浅野:もしKubernetesが必要となった時に、自分のサービスをKubernetesでデプロイするにはどうやってデプロイすればいいのかを実際にマニフェストに書いてみるのもいいですし、あとは家でKubernetesのクラスタを作っている、自分みたいなのもいるので(笑)。

GitHubのホームクラスタみたいなので検索すると、家にKubernetesのクラスタを構築している人のマニフェストとかリポジトリとか全部出てくるんですよ。

うやってクラスタをセットアップして、このクラスタにどういうアプリケーションをデプロイして。Continuous Delivery、マニフェストの設定ファイルをデプロイするのにも、今まではKubernetesが出てきた時は手動でKubernetesのコマンドを叩いて、kubectlというコマンドを叩いてマニフェストをデプロイしていましたが、今はわりとマニフェストもGitHubのリポジトリと同期をしていて、リポジトリにデプロイしていく。

デプロイもreconcileループになっているんですよね。載せようというのがCD、Continuous Delivery。それをしているようなツールにはいろいろなものがありますが、それをどういうのを使ってデプロイするかをホームクラスタの人たちはいろいろなやり方でやっているので。

家でKubernetesを立てている人を見るのが、自分は楽しくて参考にもしている。これはもう本当に先人の知恵としてけっこう役に立つところ。

設定ファイルなどはもちろんですが、プロダクトを作っている人からするとセンシティブなデータなので、なかなかこういうデプロイをこういうマニフェストを書いてデプロイしています、みたいなものを公開している会社は少ない。

それが設定ファイルなので公開している会社は少ないと思いますが、ホームクラスタの人はけっこうパブリックにしていることが多くて、自分も最近はパブリックにしています。パブリックにしても、例えばシークレット、機密情報はもちろん出ないようにしないといけなくて、そのへんの気を付け方もそこに凝縮させているんです。Kubernetesクラスタを立てたら何をやればいいのかみたいなものが載っているので。

司会者:注意ポイントみたいなものも書いてありますか?

浅野:書いてあるというか、もうそれを読み取って「なるほどね。こうやってこういうディレクトリ構造にしていくのね」とか、参考になる部分が多いです。自分は今まではそれにあやかっていたので、(今後は)公開していこうかなと思って最近公開しました。

(一同笑)

司会者:ぜひそちらも探してもらえば見つかるということですね。具体的にどうやって探したら良いですか?

浅野:GitHubを見てもらえれば。最近のリポジトリなので。

Kubernetesとの付き合いは長い

司会者:そうなると浅野さんのKubernetesとのお付き合いは、なかなか長くなってきましたよね。入社してからすぐからなので。

浅野:入社してからは、わりとKubernetes関連の『モンスターストライク』でのデプロイの仕方のフローを整えたりしていたのと、あとは本番でも一応『モンスターストライク』でKubernetesを使っていて、本番に導入しているリアルタイムのメッセージング・サーバーがありますが、それもデプロイしているので、サーバーチームとしてそのメンテナンスをしたりしていますね。

リアルタイムのメッセージング・サーバーは、すべての『モンスターストライク』のクライアントがつなぎに来るというのもあって。それに機能を追加しないといけなくて負荷試験をするとなった時に、負荷試験もKubernetesのクラスタを別に作って、そのクラスタから『モンスターストライク』のリアルタイムメッセージング・サーバーに負荷試験をするようなシナリオを自分で書いて、デプロイして負荷試験をしたり。

実際に運用をしてみて、メトリクスを取ってログを見たり、メトリクスを取って監視したり整えたりしているので、けっこう付き合いは長いのかなと思っていて。それもあってわりとアップデート情報を見ていますが、なかなかプロダクションに入っているものだと、入れたいものとけっこう離れているので、新しいことを試したいなと思ったら、自分の家で試したりしているのは、けっこう良い状態ですかね。

ミスなく正常に導入するためのアドバイス

司会者:では、私から質問したいと思います。記事の中にもあったのかもしれませんが、Kubernetesの導入の際に、例えばプロダクトでやっていこうと思った時に、このへんは特に気を付けないと落ちるかも、ミスるかもみたいなところがあるかと思っていて。そのへんのミスなく正常に導入するためのアドバイスを何かいただければと思いますが、いかがでしょうか。

浅野:そうですね。Kubernetesを使うにあたって、自分の個人開発ではあるのですが、まず要件を整理して、Kubernetesの話をしておいて何ですけど(笑)、本当にKubernetesが必要かどうかというのを見極める必要があると。実際にけっこうKubernetesを導入するにあたって、Kubernetesの動きみたいなものをキャッチアップする必要があります。

ドキュメントを読んだり、なければコードを読んだりとかして動きがわかっていないといけないので。抽象化してくれるという反面、複雑さがかなりあるので、本当にKubernetesが必要かを見極める必要があると思っていて。

Kubernetesを導入するとなったら、デプロイをして、持続的にPodが増えても、負荷試験をしてみたら意外に増えなかったりとかして、そこのパラメーターなどの調整やコントローラーの動き的に自分のアプリケーションのスパイクがそれには耐えられなかったみたいなこともあるので、その設定を確認するための負荷試験みたいなものも必要だとは思います。

あとは実際に障害が起きた時に、本当にreconcileループが働いて本当に修復をしてくれるのかについてもいろいろなパターンがあるんですよね。なので、実際に予行練習みたいなかたちで、例えばノードにPodがスケジュールされなくなるような設定を入れてみたり、Podを削除して自分のアプリケーションがコンテナに最適化されているかを確認していかないといけない。

それをやって、初めてKubernetesやコンテナを使えると思っているので、そのへんはけっこうコンテナに合わせたアプリケーション作りも必要というのはありますね。

司会者:そこの予行練習はやっておいたほうがいいよねと。

浅野:やらなきゃいけないと思っています。

今熱いk8s関連のOSS「Open Policy Agent」と「Gatekeeper」

司会者:次の質問が「今熱い、注目しているk8s関連のOSSは何かありますか?」ということですが、いかがですか?

浅野:最近見ているのは、Open Policy AgentとGatekeeperというOSS。昔はKubernetesのセキュリティを強化するという意味で、PodSecurityPolicyというコントローラーのようなものがありましたが、それが最近廃止の方向になって。

例えばKubernetesの上でこの権限が付いているとか、特権が付いているコンテナを動かしたくないとか、このPodはネットワークのあたりを触らせたくないとかを指定できるコントローラーが前はあったんですが、今は廃止になってしまって、その代わりに先ほども言ったとおり、Kubernetesのコントローラーで拡張できるんですよね。そのコントローラーを使ったGatekeeperというOSSがあって、それを使ったOpen Policy Agentに注目しています。

Open Policy Agentは、Regoという言語を使ってKubernetesのクラスタに関するセキュリティの設定をして、それに合わせてPodをデプロイするのを止めたり制御したりできるようなOSSで、最近だとわりと導入をしていこうという会社さんが多いと思います。

まだ本番の環境でガッツリ使っているというのは見かけないので、これからやっていかないといけない。これからどんどん成熟していく分野だなと思っていて、コンテナセキュリティの分野はこれから伸びるし熱くなっていって、またいろいろなツールがOPAとかGatekeeperの周りにどんどん出てくるんじゃないかな思っていて、それで注目しているOSSですね。

司会者:そこを浅野さんはキャッチアップしていると。

浅野:キャッチアップはしていて、自分のクラスタにも入れたいなと思いますが、そのOPAとGatekeeperはけっこう曲者で、入れると外から持ってきたものをそのままデプロイしても、ルールに弾かれて使えなかったりしちゃうので、それをイチからやるのは大変です。要はプロダクションに入っているクラスタでそれをやるのもイヤだし、家のクラスタも何回も壊すのはイヤだなと思って(笑)。

司会者:そうですね(笑)。

浅野:一応ちゃんとやろうとは思っていて、家のクラスタが落ち着いたらやろうと思っているところです。

司会者:ということはそこを入れたあともまたブログかTwitterでそういう情報が上がってくるということですね。

浅野:上げます。そのOpen Policy AgentやRegoの基礎的な設定ファイルのチェックであったりについては、こういうのがあるとわかった時点で、『モンスターストライク』のクラスタでconfigのチェックなどをRegoベースでやるようなものを入れていて、それは今でも動いています。

そういったベースの技術は入れていますが、実際にクラスタのセキュリティという点においては、まだ導入していないという感じです。

司会者:なるほど。次の質問です。「DockerとKubernetesはどういう関係なんですか?」と。

浅野:Dockerは、Linux上でコンテナを動かすためのコンテナランタイムと言われるソフトウェアや、周辺のコンテナランタイムを扱うツール群のことをまずは言います。これはDocker,Incという会社が開発して提供しているものになります。

Kubernetesは、Kubernetesというコミュニティが提供しているソフトウェアで、Kubernetes自体にはコンテナを動かすためのコンテナランタイムと言われるソフトウェアは付いていないんですね。

司会者:そうなんですね。

浅野:そのコンテナランタイムと通信する部分が抽象化されていて、そのコンテナランタイムは自由に選ぶことができるので、最近だとcontainerdというものがわりとメジャーになってきていて、その前だとDockerを使うこともできました。

あとはCRI-Oなどいろいろ種類があって、あとはgVisorというGoogleが作っているセキュリティに特化したコンテナランタイムみたいなものもあって、こういったいろいろなコンテナランタイムを使うことができます。

先ほども言った「Linuxの機能を使いやすくしたもの」というのはけっこうそこが真髄で、ネットワークもそうですが、コンテナというのはLinuxのnamespaceであるとかcgroups、要はLinuxのいろいろな機能をフル活用した上でできたのがコンテナなんですね。

そのコンテナをどうやって使っていくようにするかは、そのコンテナランタイムに依存するところが大きくて、Dockerはいわゆるコンテナという言葉を流行らせた人、コンテナランタイムの人なんですね。

そのコンテナランタイムにDockerがあったのですが、そのDockerが出来上がってからDocker社が徐々にコンテナランタイムをDockerから切り離して、Mobyというプロジェクトになっていったんですね。

そういう経緯があって、もちろんDockerをKubernetesのコンテナランタイムとして使えたのですが、どんどんオープンなコンテナランタイムみたいなものが発展していって、今はcontainerdというのがコンテナランタイムとしてKubernetesのメジャーになってきているのが実情ですね。

なのでKubernetesの上でDockerが動くというか、Kubernetesを使ってDockerを操作しているほうがイメージが近いかと。

Kubernetesのアップデートは本当に頻繁にある

司会者:次の質問です。「k8sのアップデートの追従やCNCFのプロジェクトとかかなり多くてキャッチアップがとても大変なんですが、浅野さんはどのような感じでされていますか?」という質問です。

浅野:まずKubernetesのアップデートは本当に頻繁にありますし、いろいろな変更があるので、実際にすべての配信情報のキャッチアップは僕はできていないと思っていて。一応KubernetesのリリースノートなどをSlackに流したり、自分でも読んだりはしていますが、たぶんどこかに抜け漏れがあって、最新になる頃には追いついていないんだろうなと思いつつ。

司会者:そんなに早いんですね。

浅野:早いのと量がけっこう多いので、そこのキャッチアップをKubernetesのコミュニティでやられている方もいて、その方々の記事を読んで「なるほどね」となることも、もちろんあります。なので自分が知らなかったことをコミュニティから教えてもらうこともけっこうあります。

それがまず1つで、もう1つが、CNCFというクラウドネイティブなOSSを管理している団体があって、Kubernetesはその中のプロジェクトでもあるんですが、周辺でいろいろなプロジェクトが走っていて、そのCNCFの下でこういうクラウドネイティブなツールを作りましたみたいなものがあると、それがTwitterで流れてきたりします。

「これがCNCFに入りました」みたいなものがツイートで流れてきたりするのでそれを読んだり、あと最近はちょっとやっていませんが、「Reddit」という海外の掲示板やHacker Newsという海外のフォーラムなどで取り上げられていることがあるので、そこを読んで「これがCNCFに入ったんだ」と、自分の知っているプロジェクトが出てくることがあります。

もともとはOSSで、GitHubでスターを付けていたやつなどが「CNCF入りしました」みたいなことがあったりするので、そういうのから情報を仕入れたり。英語のソースが主になるときがありますね。

司会者:とはいえ、浅野さんも全部が全部追えるかというと、なかなか難しい。だから関連性があるものや興味が高いものは、基本的にキャッチアップできるようにしていると。

浅野:そうですね。ベースとして一応そこらへんの最新情報やリリースノートなどは一応見るようにはしています。だけどすべてを追えているかというと、微妙。

(一同笑)

本当に量が多かったりするから。あとはCNCFのプロジェクトと言ってもどのくらい進んでいるかもバラバラだったりするので。一応GitHubのスターを付けて読んだり、あとで読もうと思ったものはけっこうありますが、全部見ているかというと、追えていないというのが現状かなと。

でも例えば、CNCFに入っているプロジェクトなどを試してみた記事がけっこう出ていたりするので、そういうのを見て、こういう使い方があるんだなどについても勉強させてもらったりしていますね。

司会者:続きまして「Kubernetesを自宅で運用してみて辛かった点を教えてください」。これはだいぶ気になります。ぜひ教えてください。

浅野:まず1つはセットアップが大変です。意外と大変。マネージドKubernetesはボタンでKubernetesクラスタを作るボタンを押したら、あとはノードの台数が5台あるいは7台でやればいけますが、自宅のネットワークなどの構成をいじってからKubernetesに合わせてその設定を入れなきゃいけないので、それはけっこう大変。あとは頻繁に壊れます。

(一同笑)

なんかクラスタのPodが急に動かなくなったみたいな。突然死したりしているのもあったりして「え、動いていないじゃん」みたいなのがあったりするのがけっこう辛いところ。

あと1つはストレージがけっこう大変ですね。マネージドKubernetesだと、例えばクラウドインスタンスといってつながっているストレージが透過的になったり、ストレージもコントローラー経由でマウントされていますが、それをあまり意識しないで、今度は10GBのストレージがほしいとか100GBのストレージがほしいみたいなものもやると、勝手にストレージがポンッとできるんですけど、自宅だとそうにもいかないですね。

司会者:そうですね。

浅野:なのでストレージの中でクラスタの分散ストレージを構築しなきゃいけなかったり、自分の家はマス(マスストレージ)があって、家のネットワークストレージにハードディスクが4本刺さっていて、4TBのハードディスクが4本刺さっていて16TBのハードディスクになっていて、そこに写真とかいろいろ入れていたりします。

それにKubernetes用の領域を取ってあって、今はNFSでマウントしていますが共有ドライブとしてマウントしています。それをうまい具合にKubernetesのストレージとして扱えるコントローラーがKubernetesの公式にあって、それを使ってデプロイしたりなど、そのへんも自分でやらないといけないのが辛いところですね。

司会者:それで少し不具合とかが出ちゃうと「えー?」みたいなことになっちゃう。

浅野:家で動かしているとそう。自分のファイルも使えなくなってしまうので辛い(笑)。ペットみたいですね。

司会者:なるほど(笑)。

浅野:ペットみたいに扱って丁寧に手を入れていかないと。盆栽みたいな感じで手がかかる子だなと思います。

司会者:でも、そこを丁寧に扱うというと語弊があるかもしれないですが、やっていくことでそのKubernetesを使った良さみたいなところはどんどん理解できると。

浅野:マネージドKubernetesがやってくれている辛い部分を経験しておくことで、何かそこで不具合が起きた時に家でやっていたことがベースとなって、何か問題解決につながることがあるかもしれないので。そういう点も含めて手はかかっていますが、けっこう勉強になっているかなというところですね。

使う上で中の仕組みを知ることは大切

司会者:というわけでお送りしてきましたミクシル延長戦ですけど、浅野さん本日はいかがでしたか?

浅野:久しぶりの配信でけっこう緊張したんですけど、数年でアプリのデプロイ方法がいろいろ変わってきていてレガシーなものからモダンなものまでクラウドネイティブという時代になってきて、Kubernetesはそこに大きく風穴を開けたOSSだなと思っています。

Kubernetesを使うというのも難しいですが、中の仕組みを知るのはけっこう使う上で重要かなと思っていますし、今後もキャッチアップしていかないと、と思っています。キャッチアップをするのにTwitterやいろいろなSNSを使えるというのがクラウドネイティブ時代の楽しいところではあるので、ぜひみなさんからもいろいろな情報をいただいたり、私も共有できたらいいなと思っているところです。

司会者:なるほど。じゃあフォローをしたらだいたい回答が返ってくるという感じですかね?

浅野:そうですね。自分もフォローをしたいのでフォローしてもらったらフォローします。

司会者:浅野さん、本日はありがとうございました。