コンテナ関連技術の現状を確認しておく

2020年2月6日(木)
宮崎 悟
今回は、連載に先駆けてコンテナやオーケストレーションツールといった関連技術の概要をおさらいします。

Kubernetes

Kubernetesは、コンテナオーケストレーションツールと呼ばれるツールです。つまり、複数コンテナをまとめて管理することを目的としたソフトウェアです。同じようなコンテナオーケストレーションツールとして、docker-composeやdocker-swarmがあります。

Kubernetes以前にも、ECSやRancherなど複数のコンテナオーケストレーションツールがありました。しかしKubernetesは、今やコンテナオーケストレーションツールのデファクトスタンダードであることは間違いありません。KubernetesはGoogleが開発したBorgを基にしています。現在はCNCF(Cloud Native Computing Foundation)に寄贈されています。

複数のコンテナのオーケストレーション

Kubernetesの主な目的は、複数ノード上で複数コンテナを連携させることです。Kubernetesコントローラを使用して複数ノード間の複数コンテナ、ネットワーク、ボリュームを連携して制御できます。これだけなら、docker-compose/docker-swarmでもできたことです。docker-composeでも複数コンテナを連携することはできます。しかし、docker-swarmではコンテナホストのオートスケールはできません。

Kubernetesは、スケジューラによってコンテナホスト(以下Node)とコンテナの組み合わせ(以下Pod)を自由にスケールできます。Podが異常停止した場合は自動的に新しいPodを起動し、総Pod数を一定値に保ちます。Podは起動・停止のみを行い、再起動を行いません。新しいPodを再起動する場合は、更新対象のPodを停止することで実現します。

Kubernetesではロードバランサや外部へのIPアドレスを持つことができ、複数のPodを組み合わせて使用できます。Podのリリースや更新も、Kubernetesで行うことができます。Blue-Green release、Rolling update、Canary Releaseを、Kubernetesで行うことができます。

KubernetesはPod間のネットワーク接続をフラットに行うことが可能です。またPVを作成し、複数のPodで使用できます。

Kubernetesのコントローラ自体もコンテナ化されており、複数ノードに配置できます。これにより、Kubernetes自体が可用性を持ったスケールアウトが可能になります。

Kubernetesの動作は、kubectlコマンドを使用して、Kubernetesの外から行うことができます。

ネットワーク接続

Kubernetesにおいて、ネットワーク接続はフラットであり、DNSおよびネットワークブリッジが接続されているだけの状態です。ブリッジは複数設定可能で、ブリッジごとに通信するポートを変えることも可能です。

Kubernetesネットワーク

Kubernetesネットワーク

ブリッジ間およびノード間のネットワークは暗号化されていません。ノード内のブリッジは、コンテナのLinux User Namespaceで分離されています。ノード間のネットワークおよびロードバランササービスへのネットワーク接続も、デフォルトでは暗号化されていません。そこで登場するのが、CNI(Container Network Interface)です。CNIはコンテナ間を結ぶネットワークインタフェースです。KubernetesではVLANやIPVLANなどの仕組みで、Pod間ネットワークを分離できます。またCNIに対応したプラグインをインストールすることで、ノード間のネットワークを暗号化できます。CNIプラグインとしては、flannel(VxLAN使用)やCalicoが有名です。

また、Istioというデータアクセスの許認可・暗号化を行えるツールもあります。

恒久的ボリューム(PV)

KubernetesでもPVの設定が可能です。Kubernetesでは、構成しているすべてのNodeへPVを提供する可能性があります。その場合、Docker VolumeではNode共通のPVとはできません。そのため、Kubernetesで使用できるPVには、共通で使用するためのいくつかの仕組みがあります。

  • PV(Persistent Volume)
    • 恒久的なストレージ。ファイル、ブロックデバイス、key-value store、configmap、secretなどがあり、それぞれ特性が違います
  • PVC(Persistent Volume Claims)
    • PodにPVCを設定すると、PVの割り当てを要求します

終わりに

今回は、コンテナとそのオーケストレーションツールであるDocker/Kubernetesの概要を説明しました。説明を以下にまとめます。

  • コンテナ同士のプロセス/ボリューム/ネットワークは分離されている
  • コンテナ外からコンテナ内での通信はポートフォワードでのみ行う
  • コンテナ内にはアプリケーションを動かすための最低限のファイルしか入らない
  • コンテナは終了時に内部データが消える
  • PVを使用することで消えてはいけないデータを保持できる
  • Kubernetesでコンテナの生成・削除・配置を行える
  • Kubernetesでのノード間ネットワーク接続は、暗号化できる
  • KubernetesでノードをまたいだPVを提供できる

これだけ見ると、コンテナやKubernetesは安全なように見えます。次回以降では、それが本当に安全なのか説明していきます。次回をお楽しみに。

国立函館高専を卒業後、UNIX、Windowsアプリケーションの開発、 Solaris/Linuxでのシステム構築に従事した。 OS、仮想化技術、セキュリティを得意とする。 https://www.slideshare.net/satorumiyazaki
https://speakerdeck.com/smiyaza/

連載バックナンバー

セキュリティ技術解説
第6回

コンテナのセキュアな運用のために

2020/11/2
連載6回目となる今回は、これまでのまとめと最新の情報について説明いたします。
セキュリティ技術解説
第5回

コンテナ開発へのDevSecOpsの適用

2020/8/4
連載5回目となる今回は、コンテナ開発におけるDevSecOpsの適用について解説します。
セキュリティ技術解説
第4回

コンテナのネットワーク制限

2020/7/2
連載4回目となる今回は、コンテナのネットワーク通信の制限について解説します。

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています