Kubernetesの概要

今回からコンテナオーケストレーションツールであるKubernetesを紹介していきます。Kubernetesは「クーバーネイティス」とか「クバネティス」とか「クーべネティス」とか人によって読み方が多少異なったりします。また、Kubernetesは長いのでK8sと略されることが多いです。

コンテナオーケストレーションツールはk8sだけではないですが、最もポピュラーが世界で一番利用されているコンテナオーケストレーションツールがk8sですので、ここではk8sの概要や基本的な機能を紹介していきます。

Dockerコンテナに関する解説は以下のページにまとめていますので、参考にしてください。

コンテナ技術

コンテナオーケストレーションツール

Dockerは1台のマシン上でコンテナを管理する上で非常に有用なツールです。しかしDockerだけでは、複数マシンで構成される大規模な環境でのコンテナ管理はできません。

このような大規模な環境でコンテナを管理するのに利用されるツールをコンテナオーケストレーションツールと呼びます。複数のマシンでコンテナを管理するためには、コンテナをどのマシン上で起動させるか、異なるマシン上で動作するコンテナ間をどう通信させるか、マシンやコンテナの障害をどのように検知するかなど、1台のマシン上でコンテナを運用するよりも複雑な運用になります。

コンテナオーケストレーションツールは、コンテナやマシンの管理を自動化して、管理者が扱いやすいインターフェースを提供します。

Kubernetesの概要

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

CNCF Cloud Native Interactive Landscape

Kubernetesのアーキテクチャ

k8sのアーキテクチャは以下の図のようになっています。

Kubernetesのアーキテクチャ

  • クラスタ
    k8sが管理するマシンの集合で、少なくとも1つのマスターとノードと呼ばれるコンテナの展開されるマシンで構成されます。クラスタ内でどのノード上でも動作可能。
  • マスタ
    クラスタ全体の管理を行うプロセスが動作するマシンで、APIサーバー、スケジューラ、コントロールマネージャなどのプロセスが動作します。ユーザーや各コンポーネントはマスタが持つAPIサーバーが公開しているAPIを叩くことで、クラスタを操作します。
    k8sではAPI操作をkubectlコマンドでコマンド化しています。
  • ノード
    コンテナを展開するマシン。クラスタには通常1つ以上のノードが存在します。各ノードの管理はマスターが行います。
  • ポッド
    コンテナを管理するための最小単位で、複数のDockerコンテナの集合体です。
  • マニフェスト
    YAMLやJSON形式で、リソースの構成をテキストファイルで記述して、それをAPI経由でクラスタに宣言することで、クラスタを操作することができます。

Kubernetes マスタとノードのコンポーネント

Kubernetes マスタとノードには次のようなコンポーネントが動作しています。

Kubernetesのコンポーネント

クライアントコンポーネント

クライアントは厳密にはコンポーネントではありませんが、参考までに記載しておきます。

  • kubectl
    kubectlはapi-serverに対してリクエストを送信し、リソースの作成や変更、削除などを行います。kubectlはコマンド形式ですが、裏ではAPIのやり取りを行っています。

Kubernetesマスタコンポーネント

マスタには、次のようなコンポーネントが動作しています。

  • APIサーバー(kube-apiserver)
    ユーザーや各コンポーネントから管理情報にアクセスするためのAPIを提供しています。認証や認可の処理なども行っています。全ての操作はこの kube-apiserver を通して行われます。
  • スケジューラ(kube-shcduler)
    コンテナをどのノードで実行するかのスケジューリングを実施します。
  • コントロールマネージャ(kube-controller-manager)
    クラスタ上のノードやコンテナなどに関するクラスタの状態をAPIサーバー経由で監視するコンポーネントです。
  • クラウドコントロールマネージャ(cloud-controller-manager)
    ノードやルーティング、ロードバランサ、ストレージなどのクラウドプロバイダに依存するオブジェクトを管理
  • etcd
    etcdはKubernetesのデータストアとして利用されています。クラスタ全体の管理に関わる情報が格納されています。データは kube-apiserver を通して取得や格納が行わます。

Kubernetesノードコンポーネント

ノードには、コンテナを実行するためのコンテナエンジン(Docker)が動作しています。このDockerを操作するためのコンポーネントのkubeletと、コンテナ間通信を行うためのコンポーネントのkube-proxyが動作しています。

  • kubelet
    コンテナを起動したり管理するためのコンポーネントです。kube-schedulerでスケジュールされたタスクを認識し、ノードの起動や監視を行います。
  • kube-proxy
    コンテナ間通信を行うためのルーティングを行います。実際はiptablesのルールを使ってパケットの制御を行っています。

関連記事