コンテナ型仮想化とAmazon ECS・EKS入門
初めに
コンテナ、DockerそしてKubernetesは多くの書籍や情報が出回っており、それらを読むことでたくさんのインプットを得ることが出来る状況です。本エントリーでは、本エントリー投稿者の視点で記載しながら、コンテナとは何かと、プロダクションワークロードでのコンテナ活用を紹介いたします。
対象の読者
- 新人のアプリケーションエンジニアの方
- コンテナ技術に初めて触れる方
コンテナとは
コンテナとは、仮想化技術の一つです。コンテナの歴史は古くLinuxではLXCが有名です。皆さんがよく目にする Docker
はコンテナ技術をより使いやすくしたソフトウェアであり、コンテナ型仮想化を実現するために実行されるアプリケーションとコマンドから成ります。
ホストOS型仮想化とコンテナ型仮想化の違い
コンテナ型仮想化の一番のメリットは、コンテナの作成や利用に必要なコンピューティングリソース(CPU・メモリ)がホスト仮想型と比較して少なく済むことです。これにより、ホストOS型仮想化と比較してより素早く利用できます。
開発環境での活用について
コンテナ型仮想化は、開発環境での活用で重宝されてきました。
まず最初に開発環境のこれまでの変遷を紹介します。
ローカルマシン
開発者は昔から自分のローカルマシンに開発環境をセットアップしていました。
例えばブラウザがクライアントで、アプリケーションサーバーがあり、データの保存先としてデータベースがある、所謂三層アプリケーションと呼ばれているものをローカルマシンにセットアップする時はローカルにアプリケーションサーバーとデータベースをインストールします。
VagrantによるホストOS型仮想化
次に、仮想マシンに開発環境をセットアップするという方法が登場しました。
ローカルOSに依存した開発環境構築手順から抜け出しどのような環境であっても一貫した環境を得るための方法です。VirtualBoxやVMWareなど、 ホストOS型仮想化
を利用します。ゲストOSをテンプレート化するVagrantが一部で人気を博し、構築済みのゲストOSをパッケージ化し配布するという手法が広まりました。
Dockerによるコンテナ型仮想化
そして、今人気を博しているのがDockerによるコンテナ型仮想化です。
コンテナ型仮想化によって、ホストOS型仮想化と比較してより速く開発環境を構築できるようになりました。ホストOS型仮想化はOSに関するファイルシステムも含まれているため、パッケージ化した場合に配布サイズが数GBになることも普通でポータビリティ性がよくありませんでした。Dockerであればアプリケーションファイルに注視できるため軽量化出来て、ポータビリティ性も優れています。
2-3-1. Docker Compose
正直なところ、私はDockerを利用するだけではあまり利便性を感じられませんでした。
何故ならば、Dockerでビルドしたアプリケーションを更新するにはもう一度ビルドする必要があり、頻繁にコードを変更する開発環境において都度Dockerでビルドするのは効率が悪いと感じたからです。
これを劇的に改善できるのが Docker Compose
でした。
Docker Compose
を利用すれば、リアルタイムでファイルを同期しながら作業することが可能です。
また、複数のDockerコンテナを連携させる時にも大変役に立ちます。
Docker Compose
によってネットワークを構成することで、コンテナ同士が通信でできるというものです。1コンテナは一つの役割に限定することで、コンテナのメンテナンス性も向上します。
コンテナ型仮想化はローカルマシンとホストOS型仮想化を置き換えるものではありません
コンテナ型仮想化があるからといって、ローカルマシンや、ホストOS型仮想化が不要になるわけではありません。しかしながら、コンテナ型仮想化を利用すればローカルマシンへの開発環境構築は必須ではなくなります。コンテナ型仮想化の開発環境のみを構築すればよいのです。
軽量なコンテナ型仮想化を利用しつつも、一貫した開発体験を得ることが出来るのです。
コンテナ型仮想化の開発環境を構築した場合、
本番環境においてもコンテナを活用することで最大のシナジーを発揮します。
ここからは本番環境での活用について述べます。
本番環境での活用
開発環境ではとても便利で、一度使い始めたら手放せなくなるコンテナ型仮想化ですが、本番環境ではどうでしょうか。
本番環境では考慮しなければいけないことが多くなります
本番環境でもコンテナを利用することは可能です。例えば、ホストマシンでDockerコンテナを起動してポートを待ち受けておくだけでも動かすことは可能です。ですが、もしコンテナが落ちたらどうしましょう?どのサーバーにコンテナを配置しましょうか?コンテナを更新する時はどうやって行いましょうか?このように、考慮すべきことは山積みです。
本番環境でのコンテナ運用を自動化するソフトウェア
考慮すべきことが山積みとなってしまうコンテナ運用を自動化するために存在するのが、コンテナオーケストレーションシステムです。代表的なコンテナオーケストレーションシステムにKubernetesがあります。
コンテナオーケストレーションシステムの登場人物
下記の登場人物を覚えていただけますと、理解しやすくなると思います。
- コントロールプレーン
- 司令塔を司ります。コントロールプレーンはコンテナをどこで、どうやって起動するのかを判断し、自動的にコンテナを配置します。
- データプレーン
- アプリケーションを指します。アプリケーションエンジニアが開発するサービスそのものです。
Amazon ECS と Amazon EKSのご紹介
AWSにおける代表的なコンテナオーケストレーションシステムである、Amazon ECS と Amazon EKSについてご紹介します。
Amazon ECS
Amazon ECSはAWSが提供しているコンテナオーケストレーションシステムです。ECSがサービス開始したのは2014年で、Kubernetesと同じくらいの歴史を持つコンテナオーケストレーションシステムです。AWSの他のサービスとの統合の容易さを一つの特徴としています。ECSのコントロールプレーンもAWSが運用してくれるマネージドサービスであり、ECSの場合はコントロールプレーンの利用料金は無料になります。
Amazon ECSの登場人物
Amazon ECSにおいて重要な以下の登場人物についてご紹介します。
- タスク
- クラスター
- サービス
タスク
タスクはDockerコンテナを実行するための集合体の単位です。複数のコンテナによる起動を定義出来ます。Docker Composeで記載しました複数コンテナ間のネットワーク構成を思い浮かべていただけると分かりやすいかと思います。タスクも1コンテナ=1役割とし、それぞれのコンテナが相互に連携し合うことが可能です。
サービス
Amazon ECS サービスはまず、EKSのサービスとは意味が全く異なります。EKSは起動したシステムの入り口の役目を果たしていましたが、ECSにおけるサービスは、タスクの起動、停止そして維持を担います。よって、EKSにおけるコントロールプレーンに近いことを行います。
クラスター
Amazon ECS クラスターはどのデータプレーンを利用するかに対応付くグループの定義でもあります。例えば、データプレーンをクラスターに紐づけしたとします。このクラスターで動くコンテナは紐づけたデータプレーン(=サーバー)で動作することになります。
Amazon EKS
Amazon EKSはAmazon Web Services(以下AWS)が提供しているKuberntesのサービスで、2017年にサービスが開始されました。KubernetesのコントロールプレーンをAWSが運用してくれる マネージドサービス でありまして、コントロールプレーンの管理作業を意識しなくて良いことが最大のメリットです。
Amazon EKSの登場人物
Amazon EKSにおいて重要な以下の登場人物についてご紹介します。
- ポッド
- クラスタ
- サービス
ポッド
ポッドはコンテナの集合体の単位です。複数のコンテナによる起動を定義出来ます。Docker Composeで記載しました複数コンテナ間のネットワーク構成を思い浮かべていただけると分かりやすいかと思います。ポッドも1コンテナ=1役割とし、それぞれのコンテナが相互に連携し合うことが可能です。
クラスタ
Kubernetes クラスタはポッドやサービスなどのKubernetesリソースを管理する中央管理機能で、データプレーンの管理も担います。
サービス
サービスは、Podに対して通信するための経路を提供するための機能です。これによりインターネットなどの外のネットワークからPodにアクセスする通信経路を開くことが出来ます。
最後に
本記事の内容を足がかりとし、コンテナ型仮想化やECS、そしてEKSの理解を促進していただけますと幸いです。