k8s_clearily_seriesとは
コンテナやDockerなどのキーワードはよく耳にするが、Kubernetesについては初めて耳にするということをよく耳にしたり、kubernetesとは何ができてどういったものなのですかといった声を多く聞いております。
ここではkubernetesについて明瞭に説明していくシリーズを数回にわたり、「k8s_clearily_series」と銘をうち連載をさせていただきます。
第一回目はDockerとの違いを明瞭にするため「Dockerとkubernetesの違い」についてお話をさせていただきます。
Dockerとkubernetesの違い
Dockerもkubernetesとはどちらもアプリケーションをデプロイして管理するためのツールになります。どちらもコンテナを使用しますのでコンテナのもつメリットを最大限生かすことは可能ですが、使用するための目的と機能が大きく異なります。
この2つの違いを
- Dockerとkubernetesの用途
- システムの自動化
- アーキテクチャ
- デプロイメント
- スケーリング
5つからお話をさせていただきます。
1.Dockerとkubernetesの用途
簡単に言ってしまうと、Dockerは単数のホスト環境での運用管理、Kubernetesは複数のホスト環境での運用管理となります。
Dockerは単数のホスト上にコンテナを作成し、実行するためのプラットフォームになります。アプリケーションをコンテナ化することで、開発からデプロイにおける環境(開発環境や本番環境)の一貫性を確保して、環境による問題の解決を行います。
kubernetesは複数のホスト上にコンテナ化されたアプリケーションのデプロイやスケールなどの管理エージェントを通して、自動管理をするためのツールになります。コンテナを使用するという意味ではDockerと同じなので、環境による問題の解決が前提としたあった上で大規模なコンテナアプリケーションの運用や管理を自動で行う際に有効になります。
2.システムの自動化
Dockerは単数のホスト上で作成されたコンテナの管理が可能となりますが、複数のホスト上に展開されたコンテナの配置やスケーリング(システムやサービスの拡張)などの自動化は提供しておりません。そのため、アプリケーションのコンテナ化を行った後、スケーリングを行うケースではシステムやサービスを手動で拡張させる必要があり、拡張後に増えたホスト上のコンテナの管理をDockerを通して行う必要があります。
kubernetesは複数のホスト上にコンテナの配置を行うことを前提にした設計になっているので、コンテナの配置やスケーリングについてはkubernetesと通して管理エージェントから複数のホストマシン上で自動管理を行うことが可能となります。その自動管理の中にはネットワーキングやストレージ管理なども含まれております。
3.アーキテクチャ(構成)
Dockerの構造はシングルホストアーキテクチャとなり、ホスト上で実行されるコンテナを管理します。そのため、ホストマシンの数が増えると管理するDockerの数も増えるため、コンテナを行う管理者はホストマシンの数だけ運用管理が必要となります。
kubernetesの構造はマスターノードと呼ばれる全体管理を行うホストマシンと、ワーカーノードと呼ばれるコンテナが配置されるホストマシンからなるクラスター型アーキテクチャになります。マスターノードと呼ばれるホストマシンがワーカーノードと呼ばれるホストマシン間を跨いだコンテナ管理を行うので、マスターノード上から複数のホストマシンに配置されたコンテナの運用管理を行うことが可能となります。
4.デプロイメント(アプリケーション展開)
Dockerは単数のホスト上に配置されてるコンテナを「docker compose(構成)」 と呼ばれるコマンドを使用して複数のコンテナを定義し、アプリケーションを連携するためにソフトウェアプログラムで構成されたコンテナをホストマシン上にデプロイを行って、ホストマシン上にアプリケーションを展開します。
kubernetesは「アプリケーションの冗長化」や「ネットワークの負荷分散」、「冗長化されたアプリケーション外部公開」などコンテナで作成された複雑なアプリケーションを展開や管理に適しております。それらはkubernetesの基本リソースとなる 「Pod」「Deployment」「Service」「Ingress」などを使用してコンテナ化されたアプリケーションに対して詳細な設定を行った上でホストマシン上にアプリケーションの展開を行うことになります。
5.スケーリング(システムやサービスの拡張)
Dockerは前項で説明のあった「docker compose(構成)」にて複数のコンテナ管理を行うことができますが、外部公開されたアプリケーションコンテナにおけるスケーリングやネットキング(システムやサービスの拡張)の管理はDockerのみでは行うことができません。
そのためDocker開発のオーケストレーションツールである「docker swarm(群れ)」を使用してクラスター型アーキテクチャを構成して、運用管理を行う必要があります。ただ、「docker swarm(群れ)」は自動でのスケーリングなどの機能は兼ね備えておりませんので限れられた機能の中での運用管理を行う必要がございます。
kubernetesはクラスター型アーキテクチャを採用しており、複数ホスト上にコンテナ配置し、運用管理を行うことが前提なシステム構成のため、アプリケーションコンテナにおけるスケーリングやネットワークキング(システムやサービスの拡張)を自動で行うことができ、設定された負荷における閾値に応じてコンテナの数を増減させることができます。
まとめ
Dockerは単数ホストでアプリケーションコンテナを管理するためのプラットフォームであり、Dockerを複数ホストで管理するのであれば、Docker Swarmを使用してクラスター型アーキテクチャを構成し管理を行うためのプラットフォームとなります。
kubernetesは複数ホストにてクラスター型アーキテクチャの構成を行い、アプリケーションコンテナの管理を行うためのオーケストレーションプラットフォームになります。
どちらが優れているのではなく、用途に応じて使用を行うことが大切なことだと思われますので、状況に応じてお使いになるプラットフォームを決めることがよいと思われます。