今回からコンテナオーケストレーションツールであるKubernetesを紹介していきます。Kubernetesは「クーバーネイティス」とか「クバネティス」とか「クーべネティス」とか人によって読み方が多少異なったりします。また、Kubernetesは長いのでK8sと略されることが多いです。
コンテナオーケストレーションツールはk8sだけではないですが、最もポピュラーが世界で一番利用されているコンテナオーケストレーションツールがk8sですので、ここではk8sの概要や基本的な機能を紹介していきます。
Dockerコンテナに関する解説は以下のページにまとめていますので、参考にしてください。
Dockerは1台のマシン上でコンテナを管理する上で非常に有用なツールです。しかしDockerだけでは、複数マシンで構成される大規模な環境でのコンテナ管理はできません。
このような大規模な環境でコンテナを管理するのに利用されるツールをコンテナオーケストレーションツールと呼びます。複数のマシンでコンテナを管理するためには、コンテナをどのマシン上で起動させるか、異なるマシン上で動作するコンテナ間をどう通信させるか、マシンやコンテナの障害をどのように検知するかなど、1台のマシン上でコンテナを運用するよりも複雑な運用になります。
コンテナオーケストレーションツールは、コンテナやマシンの管理を自動化して、管理者が扱いやすいインターフェースを提供します。
Kubernetes(k8s)は、Googleが開発したコンテナオーケストレーションツールで、複数のマシンからなるコンテナを統一的に管理することができるツールです。
元々はGoogleが自社で利用していた「Borg」と呼ばれるツールを広く一般的に公開したツールのため、Googleの大規模サービスの運用ノウハウが盛り込まれています。
Kubernetesの主な機能は次の通りです。
また、機能以外にもKubernetesには、特徴的な2つの思想があります。1
k8sは宣言的な構成管理という思想を取り入れています。
ユーザーが期待する状態をManifestファイルに宣言する。そしてそれを適用すれば、以前の状態がどうであれ、宣言した状態になる、という考え方です。
アプリケーションをk8sにデプロイする時に、「こうあるべき」という状態を宣言すれば、宣言通りの状態をk8sが作業してくれます。
宣言的とは対局にあるのが命令的と呼ばれるもので、「こうあるべき」という状態を実現するために、「コマンドAを実行して、その後にコマンドBを実行し・・・」というように、実行する処理を定義する構成管理方法です。
宣言的な構成管理の場合、「こうあるべき」という状態を実現するために細かい手順に気を使わなくて良いというメリットがあります。この宣言的な構成管理を採用することで、k8sはコンテナをシンプルに管理することができます。
k8sは拡張性の高さも大きな特徴で、当初からAPIを公開しており、このAPIを活用した様々なコンポーネントやツールが有志から公開されています。
もちろん、Kubernetesは複数の異なるクラウドに対応しますし、オンプレミス環境でも利用が可能です。また、このような拡張性の高さを活かして、プラグインによってさまざまなネットワークベンダやストレージベンダを対応させることができます。
k8sはCNCF(Cloud Native Computing Foundation)と呼ばれるオープンなファウンデーションで中心的なプロジェクトとなっていて、OSSとしてコミュニティベースとして開発が進められています。周辺のプロジェクトも多岐に渡っていて、活発に活動されていることもいます。
さらに、これらのOSSプロジェクトに加えて、クラウドベンダもk8sをマネージドサービスとして提供しているなど、k8sを中心に巨大なエコシステムが構築されています。
CNCF Cloud Native Interactive Landscape
k8sのアーキテクチャは以下の図のようになっています。
kubectl
コマンドでコマンド化しています。Kubernetes マスタとノードには次のようなコンポーネントが動作しています。
クライアントは厳密にはコンポーネントではありませんが、参考までに記載しておきます。
マスタには、次のようなコンポーネントが動作しています。
ノードには、コンテナを実行するためのコンテナエンジン(Docker)が動作しています。このDockerを操作するためのコンポーネントのkubeletと、コンテナ間通信を行うためのコンポーネントのkube-proxyが動作しています。