昨今ではアジャイルなどの開発手法が広まっており、アプリケーション開発にはスピード感が求められます。しかしアプリケーションを開発・運用していくうえで、リソース不足に陥ってしまうこともあるでしょう。
こうした問題を解決するために有力となるのが、「Kubernetes」です。本記事では、Kubernetesの仕組みやメリット・デメリットについて詳しく解説します。
Kubernetesとは
Kubernetes(クバネティス)とは、主にアプリケーションの開発や運用に使われる、Google社が生み出したオープンソースのプラットフォームです。「コンテナ」と呼ばれる仮想化技術によりパッケージ化したアプリケーションに対して、デプロイや管理を行えます。
Kubernetesは、「操舵手」などを意味するギリシャ語に由来するといわれており、複数のコンテナを統合的に制御することで、全体の舵を取る役割があるのです。
コンテナとは
コンテナとは、複数のアプリケーション実行環境を1つのOS上に構築できる仮想化技術です。通常のサーバーの仮想化を行う場合は、各仮想サーバーに個別のOSを割り当てる必要があります。一方、コンテナの場合は各ノードにOSを割り当てず、物理サーバーのホストOSを共用するのが大きな特徴です。
コンテナ自体はOSを持たない分リソースを節約でき、仮想サーバーよりも多くのノードを配置できるメリットがあります。昨今のアプリケーション開発では、コンテナでの仮想化により効率化を図るケースが増加中です。
KubernetesとDockerの違いや関係性は
Kubernetesは、コンテナを扱うプラットフォームであることをお伝えしました。では、そのコンテナはどのように作られるのでしょうか。そこで登場するのが、「Docker」です。
DockerとはDocker社が提供しているプラットフォームで、コンテナの作成や配置、実行を可能にします。Dockerを用いることで、アプリケーションを開発・実行環境から切り離し、独立したコンテナとして扱うことが可能です。
Dockerでもコンテナの管理は可能なものの、コンテナの数が増えると煩雑になり、効率的な管理は難しくなります。こうした問題を解決するのが、Kubernetesです。Kubernetesによってコンテナの管理や自動化を実現でき、開発や運用のコスト削減につながるでしょう。
Kubernetesの仕組みとは
Kubernetesの仕組みは、さまざまな要素によって実現しています。Kubernetesを語るうえ で欠かせない下記3つの要素について、順番に解説します。
- pod
- service
- namespace
pod
「pod」とは、Kubernetesの操作対象となるアプリケーションの最小単位です。1つのpodには、必ず1つ以上のコンテナが含まれ、1つのpodに含まれる複数のコンテナは、 全て同一物理サーバーのリソースを使用します。
また、それぞれのpodにはユニークなIPアドレスが割り当てられるのも特徴です。
service
「service」とは、複数のpodを1つにまとめた要素です。serviceは主に、任意のpodと正しく通信を行うために用いられます。というのも、前述したpodのIPアドレスは一定ではなく、再起動などによって割り当てが変わる可能性もあるのです。
その点serviceは、DNSを用いてITアドレスやポート番号を特定したり、podへのリクエスト振り分けを行ったりしてくれます。そのため、podのIPアドレスが変わっても通信を途絶えさせずに済むのです。
namespace
Kubernetesの仕組みにおいて、最上位階層にあたるものは「クラスター」と呼ばれます。しかし、全てのpodやserviceが1つのクラスターに集約されていると、チームやプロジェクトが多い企業では管理が難しくなります。そこで重要となる要素が、「namespace」です。
namespaceとは、クラスターを任意のまとまりごとに分割した要素を指します。クラスターをnamespaceに分割することで、ユーザーの多い大企業でも効率よくアプリケーションを利用できます。
Kubernetesのメリット
Kubernetesを利用するメリットは、下記の3つです。それぞれ詳しく解説します。
- スケールアウトが容易
- 不具合に自動的に対応するセルフヒーリング
- サービスディスカバリ機能
スケールアウトが容易
Kubernetesを用いることで、スケールアウトが容易となります。スケールアウトとは、物理サーバーの台数を増やしてシステムの処理能力を高めることです。
Dockerで作成したコンテナ同士の通信は、同一ホストPC内であれば難しくありません。しかし、ホストPC外部との通信はNAT(ネットワークアドレス変換)などを経由する必要があり、煩雑になってしまいます。
その点Kubernetesなら、複数のホストPCをまとめて1つの実行環境として扱えるため、ノードを増やすだけでスケールアウトできるのです。
不具合に自動的に対応するセルフヒーリング
Kubernetesにおける各ノードには、「Kubelet」と呼ばれるコンポーネントが存在します。Kubeletはコンテナの状態を監視しており、異常を検知すると自動的にコンテナを再起動するのです。
この仕組みによって、コンテナが不具合によりダウンした場合はもちろん、手違いで削除した場合などにも対応できます。その結果、障害対応のために生じる人的コストの削減につながるでしょう。
サービスディスカバリ機能
Kubernetesを用いることで、「サービスディスカバリ」と呼ばれる機能を使えるメリットもあります。サービスディスカバリとは、サービス実体のネットワーク上における位置を特定することです。
具体的には、serviceごとのIPアドレスやポート番号、動作状態などの把握が可能になります。この機能によってアプリケーションの管理が容易となり、運用担当者の負担軽減につながるでしょう。
Kubernetesのデメリット
Kubernetesには、デメリットも3つあります。それぞれについて把握しておきましょう。
- 物理サーバーの数が増える傾向にある
- 更新が多い
- 学習コストが高い
物理サーバーの数が増える傾向にある
Kubernetesはシステム構成上、物理サーバーの数が増えやすいのがデメリットです。Kubernetesでは全てのノードに指示を出すための「マスター」が必要ですが、マスターと各ノードは多くの場合、別々の物理サーバーを用います。
また、障害へのリスクを低減するためには、マスターは複数台の物理サーバーで構成することが望ましいとされています。ノードが増えると物理サーバー数はさらに増え、現実的には最低でも5台程度は必要でしょう。
更新が多い
Kubernetesは豊富な機能がある分、細かい更新が頻繁に発生するのもデメリットです。実際のところ、Kubernetesコミュニティは3ヶ月程度のサイクルで、マイナーバージョンをリリースしています。
Kubernetesが更新されれば、以前のプログラムが動かなくなることもあるでしょう。定期的に更新への対応をしなければならないのは、運用上の負担となり得ます。
学習コストが高い
Kubernetesは豊富な機能が存在するため、使いこなすためには覚えるべきことも多いのです。特に、コードを設計書の代わりに用いる「Infrastructure as Code」という概念は、未経験だと習得までに時間がかかるでしょう。
また、Kubernetesは更新が多いため、定期的に知識もアップデートする必要があります。このように学習コストが高くなりやすいため、運用を安定させるまでに時間がかかりやすいのはデメリットです。
まとめ
Kubernetesはコンテナを作成するDockerを補助するように用いることで、コンテナが増えても管理が容易となります。
なおKubernetesを導入する際には、「Microsoft Azure」の導入がおすすめです。Microsoft社が提供しているクラウドサービスで、オンプレミス・クラウドの利点を兼ね備えたハイブリッド環境を実現できます。