Kubernetes で始める新しい開発

青山真也 氏:本日は「Kubernetes で始める新しい開発」というテーマでお話しさせていただきたいと思います。

簡単に自己紹介なんですけど、私サイバーエージェントの青山と申します。普段はインフラエンジニアで主業務は主にGKEみたいなKubernetesサーバサービスのプラットフォームやKubernetes関連のアーキテクトも行っております。

コミュニティ活動もしておりまして、Kubernetesなどクラウド系のMeet upの主催をしていたり、あとは本の著者や登壇もしております。

Kubernetes完全ガイド impress top gearシリーズ

このページで何が言いたいかというとKubernetesが超好きです。見てわかる通りなんですけど。

(会場笑)

みなさんKubernetesを知っていますか? 知っている方……。

(会場挙手)

お、けっこう多い。ということはみなさん当然スマホを持っているので、手のひらサイズのKubernetesクラスタも……。

(会場笑)

持っている方……。

(会場挙手)

1人……。どうでしょう。

Kubernetesクラスタを持っていれば、カフェでもオシャレな感じにできますし、飛行機でももちろん使えます。

ちなみに飛行機で使うときは、普通の人が見るとどう見ても爆弾なのでマジで気を付けてください。捕まらないか、すごくヒヤヒヤします。

今年のテーマは「羽化」ですね。Kubernetesはちょうど5周年です。5年間成長してきました。カンファレンスの参加者もどんどん伸びたり、マネージドサービスもほとんどすべてが対応したり、ベンダーも対応したり、非常にデファクトスタンダードなプラットフォームとなってきました。

KubernetesとCLOUD NATIVEとは何か?

今年のテーマは「羽化」ですが、私もこのKubernetesとともに3年間成長してきてKubernetes愛に溢れる人材になったので、今日はKubernetesの話をします。

そもそもKubernetesとCLOUD NATIVEって何か? Kubernetesを管理しているCNCF「CLOUD NATIVE COMPUTING FOUNDATION」という団体があります。

そこがCloud Nativeの定義を行っていて、疎結合性や復元力がある、管理しやすい、可観測である、自動化でアップデートしやすい。そういった特徴を持つシステムをオープンなテクノロジーを使ってスケーラブルに実現することが目的になっています。

なのでCloud NativeというのはKubernetesのためだけのものではなくて、Kubernetesを使うと実現しやすいものではあるんですけど、他にもAWS ECSなどのその他の手段というのもあります。

サイバーエージェントの話でちょっとお話させていただくと、AI tech studioではGKE互換のKubernetes基盤を作っていたり、ただKubernetesクラスタをデプロイをするだけじゃなくてKubernetes自体のソースコードに改良を入れるなどけっこういろいろやっています。GKEが対応しているContaner-nativeロードバランシングという機能も独自実装をするぐらい大好きです。

ちなみにスライド右上のキャラクターのAKE……うちのコンテナ基盤のマスコットキャラクターなんですけど「あくーえ」と言います。……シーンって感じですね。

(会場笑)

あとはAbemaTVでもけっこう早い段階からKubernetesを利用していたり、他にもいろんなプロダクトで使ったりしています。

Kubernetesを使うと何ができるのか

実際問題なんですけどKubernetesを使うと何ができるのかというと、今日お話したいのは主に3つあります。1つ目はたぶんみなさんが一番想像しやすい「コンテナやアプリケーションの実行基盤」としてのKubernetes。もう1つが「X as a Service 基盤」としてのKubernetes。いわゆるマネージドサービス基盤みたいなものですね。

最後にお話したいのが、ここらへんでみなさんは引き気味にこっちを見る感じになると思うんですけど、本当に根本的なことを言うと、「分散システムフレームワーク」としてKubernetesがあるという話を今日はやっていきます。

1つ目の「アプリケーションとコンテナの実行基盤」です。KubernetesではYAML形式のマニフェストを書いて、それをKubernetesに登録すると、コンテナを起動したりロードバランサの設定をしてくれるものになります。

例えば、nginxをスケールして3台に溜めておいてほしいというのは、YAMLを書いて登録をしておくと自動的にやってくれますし、登録を1度しておくと何か起こってもセルフヒーリングして自動的に戻してくれたり、あとはロードバランサと自動的に連携してくれたり、オートスケールしてくれたりします。

あとはもともとKubernetesというのはGoogleのBorgというものをベースとして作られたオープンソースのソフトウェアになっているので、Googleが長年社内でやってきたクラスタマネジメントやワークロードの管理を行う洗練された自動化が使えるようになります。それによってさまざまなワークロードへ対応することが可能になってきています。

2つ目の「X as a Service 基盤」としてのKubernetesです。Kubernetes自体はプラットフォームのためのプラットフォームという言葉で表現されることもよくあります。例えばKubernetes上にDatabase as a Service基盤を作ったり、Queue as a Service 基盤を作ったり、そういったことが可能になります。例えば「MySQLのクラスタがほしいな」という場合は、マネージドサービスではAWSのRDSとかGCPのCloud SQLとかを起動すると思います。

Kubernetesでも「MySQLのクラスタほしいです」とマニフェストにReplica数やマルチマスタするかの簡単な設定を書くだけで、あとは自動的にMySQLのクラスタを作ってくれる仕組みもあります。万が一、MySQLのノードが1台落ちたとしても自動的に障害から復旧してくれたり、基本的にマネージドな自動化された仕組みを使うことができます。

なのでKubernetesはもうちょっと言い換えると小さなクラウドとしても見ることができます。Kubernetes上にDatabase as a ServiceやQueue as a Serviceなど、いろんなas a Service 基盤のプラットフォームを構築しておくと、デベロッパーがマネージドサービスっぽい基盤のシステムも使えるようになります。

「分散システムフレームワーク」としてのKubernetes

最後に「『分散システムフレームワーク』としてのKubernetesです。Kubernetesのコアが何かというと、宣言的なAPIと分散システムのフレームワークだと思います。ReplicaSeではコンテナを複数個起動しておきます。例えば3つ起動しておくものを登録したら、そのときに3つのコンテナを起動して終わりではなくて、ControllerがKubernetesの中でずっと動いています。

このときControllerは何をしているかというと、ReplicaSetの例だと、登録されている状況を見つつクラスタに対してコンテナを起動したりしています。先ほども言った通り、ただ起動するだけじゃないという話は、Controllerが調整ループなどと言ったりするループプログラムをずっと回していて、あるべき状態に収束させることをやっています。

ループ処理では何をしているかというとObserve・Diff・Actという3つの工程を経ていて、現状を確認するのと、理想を現実の差分を計算して、その差分に対して何か処理をする流れになっています。

例えば2個しか動いていない状態だったら、Observeでは理想を現実を把握します。

それに対してDiffでは差分を計算する、するとコンテナが1つ足りない。

なのでアクションとしてnginxのコンテナを1つ立てるという。という処理をずっと繰り返しています。

結局これは何をしているのかというと、Controllerは運用ナレッジをプログラム化をすることによって自動化しています。ここが自動化されていないとすると、人が監視のアラートを見て「2個しか動いていないから手動で1個立てましょう」となると思うんですけど、そういうものをKubernetesではControllerによって自動化し、そのままノンオペレーションでやることができるようになっています。

Kubernetes内ではこういうControllerが非常にたくさん動いています。このControllerたちがいろいろな役割を担って非同期で動作することによって1つの分散システムを構成しています。

例えばMySQLの例だと「MySQLを立ててほしい」となったときにMySQLのスペシャリストにすべてを任せるじゃないですか。Kubernetesの場合、RDBだったらデータベースのスペシャリストの運用ナレッジから作られたControllerプログラムを使った自動化に任せることができます。そういった自動化の仕組みを使うことによっていろいろできると。

このControllerの仕組みはKubernetesでは拡張して実装できるようになっています。このMySQLを管理するコントローラプログラムもせっかくオラクルさんが作ってくれたものがあるので簡単に利用することができます。また、自分たちのドメイン特化な運用ナレッジを自動化したいとなったときに、自分で実装してControllerを実装することによって、今までやっていた運用を任せることができるのはKubernetesの非常に良いところです。

まとめると、この3つがKubernetesの良いところです。一番下が大事なところなので、雰囲気でもいいのでぜひ覚えていただけると幸いです。

ということで、ご清聴ありがとうございました。

(会場拍手)