ミクシィには、探究心溢れるエンジニアがたくさん在籍しています。
その探究心は業務で扱う技術にとどまらず、趣味で書いているプログラムだったり、個人的に研究している言語だったりと、自身の気になった技術への追求も留まることを知りません。
そこで、社内のエンジニアに“好きな技術”について、思う存分に語ってもらうシリーズを始めました。
ルールはこの通り。
・業務で使っている技術でも、使われていない技術でもOK
・あくまでも個人的な見解で
・その技術のどこが面白いのか
・愛を込めて語り尽くしてもらう
第2回目は、システム運用を自動化できるのではないかと期待されている「Kubernetes」について、サーバーエンジニアの浅野に語ってもらいました。
コンテナ技術の進化版「Kubernetes」
──今日語っていただくのはどんな技術ですか?
ソフトウェアであり、プラットフォームでもある概念チックな「Kubernetes」についてです。今までコマンドを叩いてやっていたことや、Linuxのあまり知られていなかった機能をわかりやすくしたものと言えば、使い勝手の良さが伝わるでしょうか。
──それは画期的ですね。具体的にどういう場面で使われているのでしょうか?
複数のサービスを提供しているIT企業や機械学習の技術開発を行っている企業など、サーバーを多く抱えているところで導入が進んでいます。ミクシィ社内でいうと、『モンスターストライク(以下モンスト)』のフレンド通知機能やデータをテストするツールは、Kubernetesで動いているんですよ。
今はまだ部分的にしか導入されていませんが、将来的に、モンストをKubernetes上で動かせるようになれば、トラフィックに合わせてサーバの台数を自動で増減させたり、障害に対応したりできるのではないかと考えています。アニメや漫画作品とコラボするときにやっている、サーバの台数が足りなくならないように調達してきてセットアップする、一連の作業を省けるようになるかもしれません!
──趣味としてはどういう風に使っているのでしょうか?
自宅の温度を管理するシステムをKubernetesで作りました。Raspberry Piで作った温度計で室内の温度を計測していて、一定の気温になるとKubernetesが検知、グラフに表示される仕組みです。もちろんこの機能自体は、ほかの技術でも実装できます(笑)。僕の場合は、Kubernetesを使ってPC3台で組んでいるので、データを保存するマスターのPCが壊れない限り、温度の監視が止まることはありません。冗長設計もバッチリな仕様になってます!
──Kubernetesを使いこなしているんですね。きっかけは何だったんですか?
物理マシンが好きだったので、高校生だった2010年代の始めから自分でマシンを用意して、作ったWebアプリケーションを動かしてみていました。その流れで、必要な設定やファイルをひとまとめにした「コンテナ技術」を知ったんです。コンテナを上手く扱うのに使う、仮装環境を構築するツール「Docker」をWebアプリから動かせれば便利になると思い研究をしていたんですが…今思えば、これってKubernetesの概念と同じなんですよね…!
──おお!Kubernetesが登場する以前から、同じような設計をしていたと。
…と言われると大げさですが(笑)。でも、そうですね。Kubernetesが登場したのは、その後の2015年頃。ずっと注目していたのですが、なかなか触れる機会がなくて(苦笑)。初めて触ったのは、2018年、ミクシィの内定者アルバイトの時です。教えてもらいながら、モンストのテストに使うツールを外部の仮想マシンからKubernetesに移行する作業を担当しました。それで、コンテナ技術やLinuxを上手く使いこなせるKubernetesにすっかりハマってしまいました!当時はDockerの方が注目されていたし、Kubernetesは資料が全然なかったので、絶好のチャンスだったと思っています。
──Kubernetesはシステムの自動化やセキュリティの強化が実現できるとのことでした。具体的に言うと、どういう仕組みで動いているんでしょうか?
Kubernetes自体はAPIサーバで、機能を拡張する「コントローラー」と呼ばれるコンポーネントを組み合わせて、全体のシステムを動かしています。APIサーバの部分は、クラウドサービスを利用するのが一般的なので、バックアップを気にかける必要はないですし、アプリケーションの部分に集中できるので便利です。
──どのようなコントローラーがありますか?
いくつも種類があるんですが、代表的なのは、僕の自宅の温度管理機能にも使っている「リコンサイルループ(調整ループ)」です。これは、データベースの中にファイルが置かれたのをKubernetesが検知すると作動して、特定の状態を保ち続ける機能です。
ポイントは、宣言しておいた状況から変わっても自動的に戻しておいてくれること! 例えば、障害が起こってサーバの台数が減っても、対処法を決めておけば自動的に対処してくれるので、サーバの運用工数を削減できます。このほかにも、システムを動かす「デプロイメントコントローラー」やネットワークに繋げる「サービスコントローラー」などのコントローラーがあります。ちなみに、ソースコードは公開されているので、参考にしながらコントローラーを自作して遊んでいます(笑)。
──システムに必要な機能を抽象化して、コントローラーにしているんですね。
そうです! 人がやっていた手続き的な作業を、細かく分割して、抽象化しています。そのほかにも、複数のコンテナをそれぞれの役割を保ったまま、まとめて動かす「コンテナオーケストレーション」という機能もあります。ほかの技術でも研究されていたのですが、今ではKubernetesが圧倒的なシェアを占めていると思います。それから、分散合意に「Raft」を使っているのもKubernetesの特徴ですね。
──マシンが多数決?
はい。Kubernetesを動かすマシンは、データを保存する「マスターノード」とタスクを処理する「ワーカーノード」の2種類が必要です。マスターノードが壊れてしまったときは、ワーカーノードのマシンが多数決を取って、マスターノードに変わるマシンを選びます。実は、僕の大学での研究テーマは、この分散合意の思想でした。込み入った機能のコントローラーを作るには、分散合意の知識…と言うよりは、“分散合意と向き合う覚悟”が必要なんです! 僕も、どういうアルゴリズムなのか、今でも情報収集を続けています。ブロックチェーンにも使われているので、今後さらに注目されるのではないでしょうか。
──マシンの切り替えも自動でできるんですね。まとめると、Kubernetesはエンジニアにとって嬉しい「自動化パッケージ」と言ったところでしょうか。
そもそも、手動でやっていることを自動化することがエンジニアリングとも言えますが、基本的にはそのとおりです。ここ数年でサーバのクラウド化がトレンドになり、運用の負担が随分と軽減されました。
そこで、次に流行ると感じているのは、クラウドの自動化。今までの技術だと限界があったのですが、Kubernetesを使えば実現できるのではないかと注目されています! Kubernetesのもとになった「Borg」という研究をしていたGoogleでは、すでにクラウドが自動化され始めているかもしれません。
──Kubernetesを使えば、色々なことが自動化されて便利そうですが、何かデメリットはありますか?
そうですね…。弱点を挙げるとすれば、機能が抽象化されているので、何か問題が起こってしまったときに、どこで何が起こっているのか見つけるのが難しいことです。込み入ったものを実装しようとすれば、その分プログラミングの知識も必要ですし…。
──浅野さんくらい使い慣れている方でも難しいんですね。それは解決できることですか?
最近僕が注目しているのが、BPFを拡張したeBPFという、動いているプログラムを止めて、命令を割り込ませられる技術です。ソフトウェアのデバッグやセキュリティ監視に使われています。Kubernetesだと、コンテナがネットワークにアクセスするときに出すLinuxの命令に処理を割り込めるので、コンテナが何をしているのか監視できるようになります。
──eBPFを使えば、Kubernetesの弱点を解決できるんですね。
はい! eBPFは自分が書きやすい言語で実装できるのも魅力です。これまでKubernetesのコンテナを監視しようとすると、C言語をバリバリ書かないといけなかったのでハードルが高かったんですが、eBPFを使えばカジュアルに手を付けられるようになります。
──すると、Kubernetesの裾野も広がると。
そうですね。使い始めてる人もそう少なくないとは思いますが、僕もっと試行を重ねて「社内で最もKubernetesがわかる人」として認識してもらえるくらいにはなりたいですね。