LoginSignup
0
0

More than 5 years have passed since last update.

Startup Tech Talks 仮想マシン、コンテナ、関数、Kubernetes on AWS の活用方法と展望

Last updated at Posted at 2019-03-21

k8s概要

  • Googleのborg
  • コンテナオーケストレーションシステム
  • 2014年公開、2016年にv1.0のproduction ready

なぜk8sを使用するべきじゃないのか -> なぜコンテナなのか

スタートアップの課題

生産性が上がらない。
組織が大きくなると、チーム間の調整コストが高くなり、意思決定の摩擦、プログラミング言語の相違、宗教戦争を持ち出すetc...いろんな人がいる。エンジニアが足りない。人件費が高騰。この流れで、マイクロサービスアーキテクチャ、リモートワークが最近流行っている感じがする。
マイクロサービスアーキテクチャにすると、機能毎ではなくサービス毎に同期し、サービス間はAPIを使用し疎結合にして、チームが独立して働くことが可能になり、上記の解決になるのではないか、そういう文脈で取り上げられている。
リモートワークは分散チームの流れで、Slackやコミュニケーションツールを使用し、Githubだけで開発する会社も出てきた。これらツールが増えてきたおかげで、必ずしも東京にチームがいなくても同じサービスをみんなで作ることが出来るようになった。エンジニアが足りない問題を解決するのではないか?
我々はコンピュータ上でビジネスをしている以上、作ったソフトウェアをコンピュータ上で動作させる事は絶対避けて通れないので、それをどの抽象レイヤーでやるか。
仮想マシン、コンテナ、etcそれらの違いはそもそも何?
バージョンサービスアーキテクチャだと、仮想マシン、コンテナ関数そんな違いがある。
仮想マシンは、物理マシーンで動いているが意識することは少ない。
1マシーンで複数プロジェクトで動かしたりして、複数チームのサービスが1つの仮想マシンにうっかり乗ってしまい、「この機能だけこのサーバーが停止している、個別にスケジューリング出来ると嬉しい」とか、そのようなモチベーションが高まり、コンテナをやりたいとなる。
コンテナはコンテナイメージから作る。仮想マシンと似ている。物理マシーンか仮想マシン上でコンテナは動作する。上記のような事象はコンテナでも起こりうるが、VMと同じように、この機能だけコンテナを分割したいとなる。
その先にあるのは関数。スクリプトやバイナリから関数と呼ばれる単位でデプロイする。それらは、LambdaといったPaaS上で動作する。関数になると上記のような事象はない。
関数をデプロイの単位とした。それまでは違っていた。
マシーンにデプロイしたいのは、application bundle。これまでの悩みが解決される。
PaaSで済むならPaaSがベスト。

何で今更関数ではなく、コンテナなのか

運用ツールの違いからわかる。
仮想マシンはイメージから物理マシンで動作するので、コンフィグレーションマネジメントchef、ansibleを使用してインフラコードで運用する。
コンテナイメージは物理・仮想マシンで動作するので、Docker・ECS・k8sで運用する。
関数は作成してバイナリ化して、動作するのは、仮想マシン、コンテナ、Lambda、OpenFaaS、etc...
関数の管理はどうしたらいいのかわからない。
関数のオーケストレーションシステムの最適解はまだない。
だから個人的にはコンテナを使用している。
ツールが少なくて運用が大変だから。逆にツールが揃ってなくても問題ない小さなマイクロサービスであればどんどん使用するべき。
上記を使用基準にして欲しい。

コンテナオーケストレーションはなぜいるのか

コンテナをデプロイするのにsshだけでは済まないから。
コンテナが落ちた時に他のノードに自動移動したい場合、
EC2であればAutoScalingGroupがあるが、コンテナの場合は?
コンテナをロードバランサーにつなぎたい場合、
EC2であればALBがあるが、コンテナの場合は?
サーバーのリソース内でコンテナ数を増やしたい場合、
AWSであれば、小さいEC2インスタンスを並べてASGでオートスケーリング出来るが、コンテナの場合は?
AWSのコンテナオーケストレーションはECSとk8sの2つのソリューションがある。
ECSは、コンテナデプロイだけだったが、今は下記の機能が増えた。
初期にIAMロール対応し、同じインスタンスに違うIAMロールのコンテナが動作可能。
コンテナのヘルスチェック。
サービスディスカバリ(LoadBalancer)。
k8sも同じ。
運用面では違いがある。
ECSでは、AMIがあるので、DockerとかECSエージェントの相性が良いかのデバッグしなくても良いので、ビジネスに集中出来る。
k8sだと自分達で選定しないといけない。
ECSは、大きな会社で大規模なECSクラスタを構築している事例があり、それを運用するOSSツールも公開してくれている、日本でも採用事例が多いので、トラブルシューティングしやすい。機能も少ないのもいい(機能が増えるとアップグレードが大変だから)
k8sは、専用AMIはない、マネージド・サービスもない、日本での採用事例がない、情報が少ないのでデバッグも大変、k8sを使える人材を育てるのも大変。
k8sは、ECSより機能が多い。

k8sの機能

コンテナデプロイ
サービスディスカバリ
ロードバランサー
kubectl: fruentd,sshコマンドみたいなやつ
helm: パッケージマネージャー(wordpressをコマンド1発で入れたり出来る)

k8sを構築するのは大変だが、便利なAPIがたくさんある。
k8sはlinuxに例えられる。
k8sのAPIはlinuxのシステムコール。
k8sのシステムもk8sのAPIをコールするようにGolangで実装されているので、
自分達でAPIを使用してk8sを実装することも可能。
それらをサポートする便利なライブラリもあり(nodejs,java,golang)、
認証やバリデーションやDBにもなりうる。
豊富な周辺ツールもある。
メタコントローラー: bluegreenデプロイ出来るもの
squash: デバッガー(エラーが起きた時どこのコンテナが何でエラーが発生したのか把握するのに便利)

k8sの使い所

コンテナの運用は勝手にやってくれる。
Lambda、ECSより汎用的。
コンテナの運用を自動化したい。
k8sのAPIとSDKがあり、他のクラウドで作成されたツールをそのまま適応出来るので、自分達で作り込まなくてもちょっとしたPaaSみたいなものは作成出来る。
コンテナオーケストレーションというより、分散システムフレームワーク。
k8sで動作するFaaSもある。
PaaSで済まないならk8s上でFaaSを選ぶのもあり。
そのぶん激しく学習コストが高い。
Linuxをすべてわからないのに使用しているのと同じように、k8sを使用するとはそういうレベル。
コンテナをプロセスと見立てると、linuxはk8s。裏でEC2インスタンス何千台あるか不明だが、1つのPCと見立てた時に、OSはk8sで、システムコールはAPI。
躊躇するなら採用はするな。

freeeでの利用例

新規サービスはk8s化。
既存サービスはまずDocker化から、必ずしもk8s化しない。
目的は運用の効率化なので、既存が自動化されているなら、無理にk8sする必要はない。
新規サービスは自動化する暇がないので、最初からk8s化。
しかし、学習コストが高いので、オンボーディング勉強会を開催している。
可能な限り作り込まない。
k8sで動作するPaaSはないので、自動化する余地があるが、ツールを作るリソースはないので、自社で開発することはせず、OSSのメンテナーになるとか、メジャーなOSSを使用するとか、自社で持たず自動化を進めている。

EKS

k8sのコントロールプレーン(etcd,k8sのsystemとか)をマネージドするサービス。
EC2は自分で用意する。
k8sの封鎖された内部ネットワークがVPCでマネージドされる。
GCP、Azureだったらフルマネージする(但しカスタマイズ性が制限される)

未来の話

k8sが規格化されてくる。
k8sクラスタの運用が楽になってくる。
デバッグツールなどが増えてk8s上のアプリの運用が楽になってくる。
我々が求めるものはサーバーレスだけど、裏側はk8sだったりするかも。

まとめ

抽象レベルを意識できるように
正しいツールを選べるように
k8sは銀の弾丸ではない
コンテナだったらコンテナオーケストレーション
ファンクションの運用の選択肢が定まったら...?
将来的にk8sになっていくので、学習目的なら早めにやっといて損はないが、ビジネス利用が計画的に。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0