はじめに
元々Pythonエンジニアだった筆者が、今月からクラウドアプリケーションのDevOps業務に携わることになり、Kubernetesなどコンテナオーケストレーションの基本的な知識を勉強し、その内容を共有したい。そんな思いのままに記事を書かせて頂きます。
対象読者
- インフラやDevOpsエンジニア初心者
- Kubertnetesの概念をざっくりと理解したい方
Kubernetesとは...ざっくりと
公式ホームページより引用
『デプロイやスケーリングを自動化したり、コンテナ化されたアプリケーションを管理したりするための、オープンソースのシステム』
ざっくりと、大量のコンテナを賢く操るシステム、と言い換えることができます。
Kubernetesが生まれた背景
ざっくりとまとめると、インターネットの普及によりWebアプリケーションへのアクセス数が増加し、それを格納する大量のコンテナを面倒を見ることが大変になったからです。
-
軽量でポータブルに動かせるDocker技術の普及
コンテナの概念自体は1970年にはすでに存在していたが、サーバ数やマイクロサービスの増加と共に複数の環境に対して容易に移植できる、スケーリングできるなどの要求が高まり、コンテナ技術が本格的に求められるようになる。2013年にDockerがオープンソースとして公開されており、ちょうどそのころのニーズとマッチした。 -
Borg/Omega:Google社内での実践からの知見
コンテナ技術がめでたく普及したものの、複数サーバにまたがって動かす、スケーリングするなど複数のコンテナを管理するのには手作業が多かった。そんな中、Googleは2000年代前半から、Borgという大規模クラスタ管理システムを使って数万台・数万ジョブ規模の運用をし、その後、Omega というより柔軟なスケジューラ設計が社内で研究された。 -
Google のクラウド戦略およびオープンソースの潮流
これらのノウハウを利用し、「外部にも適用できるオーケストレーションシステムを作ろう」という流れになった。2014年6月にKubernetesが Google によって発表され、オープンソース化された。
オーケストレーションという言葉が出てきましたが、この説明の前にKubernetesを構成する基礎的な概念について理解しておく必要があります。
Kubernetesを構成する概念
Kubernetesは主にクラスタ、ノード、ポッドの3つの概念から構成されています。以下の図がKubernetesシステムの全体構成を示します。上位概念から、 クラスタ > ノード > ポッド と構成されます。では、次にそれぞれの概念について説明していきます。
クラスタ
Kubernetesの頭脳。Kubernetesのコンテナの配置や削除の指示を出すなど、制御と調整の責務を持つ。
ノード
ポッドの実行環境(リソース)を指す。ポッドの稼働でリソースが不足した場合、ノードが追加される。
ノードにはマスターノードとPodをまとめるノードの2種類から構成される。
ノードには以下が含まれる。
- kubelet
ノードの管理役で、クラスターからの指示を基にPodを起動、監視、終了させる。 - コンテナランタイム
Dockerなど。 - kube-proxy
Pod間通信を正しくルーティングする、負荷分散をするなどの役割がある。
ポッド
コンテナをまとめる最小単位。ポッドには以下が含まれる。
- 共有ネットワーク → 同じPod内のコンテナは localhost で通信可能
- 共有ストレージ
- コンテナのイメージバージョンや使用するポートなどの、各コンテナをどう動かすかに関する情報
Kubernetesのコンテナオーケストレーションとは?
では、先ほどのオーケストレーションのお話に戻ります。オーケストレーション(指揮・統率)という言葉からも分かると思いますが、コンテナの動作を指揮監督する、ということです。では、具体的にどうやって指揮するのでしょうか。
-
コンテナの配置を決める
どのノードにどのPodを置くのかを自動で判断します。CPU・メモリの使用量を鑑みて、最も適切なノードはどこなのか、を見ます。 -
コンテナを適切にスケーリングする
負荷が高まればPodを自動で増やして、負荷が下がればPodを減らします。リソースが足らなくなれば、ノードを増やし、過剰のリソースがあると判断するとノードを減らします。 -
コンテナを自己修復させる
コンテナがダウンしてしまったり、間違えて削除してしまった場合でも自動で回復することができます。 -
ロールアウト/ロールバック
新しいアプリのバージョンを段階的に展開(ロールアウト)。不具合が出たら自動で前の状態に戻す(ロールバック)。徐々にアプリケーションを更新することで、無理なく新バージョンをリリースできますね。
まとめ
どうしてクラスタ、ノード、ポッドと言うように、複数の階層で構成されているのかと考えていたのですが、しっかり調べると納得。アクセスの負荷量で言うとポッドを増やすだけで十分で、むやみにリソースを増やす必要はありませんね。
Kubernetesには多くの機能が存在していて、すべてを解読するには時間がかかりそうです。次はKubernetesの管理ツールのHelmについて記載したいと思います。ではでは。
参考
