仮想化とは?

コンテナのメリットと課題とは?〜仮想マシンとの比較と、Kubernetesが注目される理由(2/3)

2019/12/18

Dockerの使い方

ここで、代表的なコンテナランタイムであるDockerの基本的な使い方を見てみましょう。まず開発、ステージング、本番の3つの環境を想定します。開発環境でアプリケーションのビルドとテストが完了したら、まずdocker buildコマンドで、Dockerイメージを作成します。ここで言うイメージとは、カーネル以外のホストOSの差分です。例えばOSの差分やアプリケーションの設定、環境変数の設定なども、まとめてパッケージ化されます。ステージング環境に移すには、docker pushコマンドで、コンテナレジストリと呼ばれるプライベートリポジトリにイメージをアップロードします。ステージング環境では、docker pullコマンドでイメージをダウンロードし、docker runコマンドで実行します。ステージング環境で可用性テストや結合テストをクリアしたら、同様の手順で本番環境で実行し、リリースとなります。カーネルが同一であれば、開発環境、ステージング環境、本番環境問わずどこでもアプリケーションを動かすことができます。

Docker の基本的な使い方

コンテナの課題

開発者の視点では様々なメリットを持つコンテナですが、運用管理の観点からは様々な課題が存在しています。まずは、再び仮想マシンと比較しながら、コンテナのデメリットについて見てみましょう。

仮想マシンは集約化によるコストメリットを享受しつつも、物理マシンと同様に扱うことができるので、アプリケーションを作り直すことなく、そのまま稼働させることができます。セキュリティ対策についても、物理マシンの方法を流用することができます。運用管理についても十分な知見が蓄積され、vCenterなど管理ツールも揃っています。

一方、コンテナにはネットワークの扱いなど、物理・仮想マシンとは様々な違いがあるので、アプリケーションを作り直さなければならないこともあります。従って、コンテナの導入の際には、アプリケーションをコンテナ化できるのか精査する必要があります。またカーネルを共有しているので、あるコンテナで生じたセキュリティインシデントが、他のコンテナに波及する恐れもあります。従って、コンテナを運用する際は、改めてセキュリティ要件を検討する必要があります。また運用管理についても、まだ十分に知見が蓄積されておらず、ツールの成熟が今後の課題となっています。

コンテナ技術特有の課題も存在します。ネットワークの仕組みを例に挙げると、コンテナが外部ホストと通信するには、NATを経由する必要があります。外部ホストのコンテナと通信する場合も同様です。ホストが少なければNATを手作業で設定するのは難しくありませんが、ホストの数が何十個にも増えると、コンテナ間通信に必要な設定作業は非常に複雑かつ煩雑なものとなります。またマイクロサービスアーキテクチャといったデザインを採用すると、冗長性の確保や負荷分散の自動化がより重要になってきます。トラフィックが殺到したら、オートスケールする仕組みも必要です。リソースの空いているホストへのコンテナのデプロイや、そのイメージ管理はどうするのでしょうか。これらの仕組みを自前で実装するのはとても大変です。他にも、セキュリティ、可用性、監視、バックアップなど様々な点を検討しなければなりません。このように、コンテナには多くのメリットがあるものの、エンタープライズ環境で活用するには一定の課題をクリアする必要があります。

Docker 単体環境の課題

Kubernetesの登場

これらの課題を解決するために登場したのが、コンテナオーケストレーションツールであるKubernetesです。Kubernetesを使うことで、自前で仕組みを構築することなく、複数ホストでコンテナイメージを展開したり、ロードバランサを配備したり、オートスケールするといった作業を自動化することができます。

Kubernetesが提供する機能は、具体的には以下の4つです。

  1. 複数コンテナをポリシー準拠でデプロイ
    マニフェストというYAML形式で書かれたファイルに沿って、複数のコンテナをデプロイします。
  2. 負荷分散機能の提供
  3. コンテナの外部接続ネットワークの提供
    NGINXなどを利用して、負荷分散や外部ネットワークへの接続機能を提供します。
  4. 障害時にコンテナを自動スケーリング
    コンテナが壊れたら、それをKubernetesが検知して、自動的に別のホストで復旧します。

Kubernetesのコンポーネントは、Master Node/Worker Nodes/マニフェスト/etcdの4つに分かれています。Master Nodeは、コンテナの管理を担うコンポーネントです。具体的には、複数のコンテナのデプロイや死活監視を行っています。Worker Nodesは実際のコンテナの稼働環境です。マニフェストは、Kubernetesの動かし方やリソース設定をYAML形式で定義したファイルです。例えば、コンテナをいくつ動かすのか、またトラフィックが増えた際のオートスケールの設定や、リソースの使用量などを定義します。etcdというクラスタは、分散型のkey-valueストアで、Kubernetesのネットワークの設定などを保存します。

Kubernetes アーキテクチャ / コンポーネント

そして、Kubernetesでコンテナを管理するときの最小単位となるものがPodです。Podは、1つまたは複数のコンテナで構成され、ネットワークやIPアドレス、ストレージといったあらゆるリソースを共有しています。作成されたPodにはIPアドレスが割り当てられ、Pod間で通信を行うことができます。読者の中には、コンテナが外部と通信するときにはNATを経由する必要があることを思い出した人もいるかもしれません。
Kubernetesは外部のOSSと連携することによってNATを経由することなく別のホストのコンテナ同士の通信を実現しています。OSSを利用する場合のいくつか選択肢がありますが、flannelを採用した場合はオーバーレイによるカプセリングを行うことで、従来の仮想マシンのようにIPアドレスを割り当てることが出来るようになります。

Kubernetes の ネットワーク

おすすめ資料ダウンロード

この記事を読んだ人がよく読む記事

最新の「仮想化とは?」

人気の記事

関連する資料ダウンロード

関連情報

TOP