Kubernetes
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およびネットワークブリッジが接続されているだけの状態です。ブリッジは複数設定可能で、ブリッジごとに通信するポートを変えることも可能です。
ブリッジ間およびノード間のネットワークは暗号化されていません。ノード内のブリッジは、コンテナの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は安全なように見えます。次回以降では、それが本当に安全なのか説明していきます。次回をお楽しみに。
- この記事のキーワード
