この投稿ではインストールを求めたりばかげた呪文を入力させたりはしない。
コンテナオーケストレーションシステムである"Kubernetes"。
dockerを覚えたうえでなぜそんなものまで覚えなければならないのか、
現在まで勉強した結果を私なりにまとめよう。
(途上につき、間違いなどあれば申し訳ありません。ご指摘いただけると幸いです)
なぜKubernetesが必要か
一言でいえば、運用、特に複数台のホストにまたがるサービス運用において課題が出るからと言えます。
dokcer-composeによる複数コンテナを管理でローカルの開発環境についてはほぼ問題はないと思います。
しかし、これらは基本的に開発マシンなどといった1つのホスト内での話です。
実運用においては例えば以下のような課題を考慮し、複数ホスト間での連携も必要となってきます。
- ロードバランシング
- デプロイ時のダウンタイム
- オートスケーリング
- 死活監視(ホスト内のコンテナについて)
しかし、その構築は非常に複雑なものとなります。
こういった複数ホスト、コンテナ間の連携や、サービス実運用に必要な機能をもたらすのがKubernetesとなります。
読み飛ばしてもいいところ
例えばオートスケーリングについて考えてみます。
nginx、phpアプリ、mysqlコンテナが一つずつ稼働しているホストがあり、そのスケールが必要になったとします。
このホストそのものを単純にスケールしてよいものでしょうか?効率的な運用を考えれば、ホストを増やしたうえでそれぞれのホストにどうコンテナをデプロイするか考える必要が出てきそうです。
死活監視についてもそうです。ホストそのものならまだしも、
ホスト内で動いているコンテナすべての死活監視、および必要に応じた自動起動を自前で構築しようとすると難しいのではないでしょうか。
構成
以下大体の構成。デプロイメントあたりから脳が若干受付拒否をしだす。
- クラスタ:以下に挙げるdockerホストなどのリソース集合体
- マスターノード:管理サーバ
- ノード(Node):実際にコンテナがデプロイされるホスト
- ネームスペース(NameSpace):クラスタ内の仮想的なクラスタ
- ポッド(Pod):コンテナの集合(同一ポッド内のコンテナはノードを跨がない)
- レプリカセット(ReplicaSet):ポッドの複製・管理
- デプロイメント(Deployment):レプリカセットの世代管理
- サービス(Service):ポッドの集合&ポートなどの通信規約(書いて字の如くこの単位で一つのサービス)
- イングレス(Ingress):サービスの公開&ルーティング
という感じです。フワッと理解できたら今日はもう優勝して大丈夫です。