Blog Article
Kubernetesとは
Kubernetesとは
Kubernetes (クーべネティス、略称: K8s)は、オープンソースのコンテナオーケストレーションプラットフォームです。コンテナオーケストレーションは、システム全体を統括し、複数のコンテナを管理できるものです。複数のコンテナ化されたアプリケーションを効率的かつスケーラブルにデプロイ、管理、スケールアップ/ダウン、および運用するための手段を提供します。
Kubernetesは、クラウド上だけでなく、オンプレミスのデータセンターやハイブリッド環境での利用にも適しています。コンテナ技術の普及とともに、Kubernetesは広く採用され、大規模で複雑なアプリケーションのデプロイと管理を支援しています。
Kubernetesが提供する主な機能と概念には以下が含まれます。
コンテナのオーケストレーション
KubernetesはDockerなどのコンテナランタイムと統合され、コンテナをクラスタ内でデプロイ、スケジュール、管理します。これにより、複数のコンテナを単一のアプリケーションとしてまとめ、スケーラビリティ、冗長性、および柔軟なデプロイメントが可能になります。
サービスディスカバリとロードバランシング
Kubernetesは、サービスディスカバリやロードバランシングなどのネットワーキング機能を提供し、クラスタ内のアプリケーションコンポーネントが互いに通信できるようにします。
スケーリング
アプリケーションの負荷に応じて、コンテナの数を動的にスケールアップまたはダウンさせることができます。これにより、リソースの効率的な利用が可能です。
ストレージオーケストレーション
Kubernetesは永続化されたストレージをサポートし、データの永続性を確保します。これは、データベースや永続的なストレージが必要なアプリケーションにとって重要です。
自動復旧と自己修復
クラスタ内のノードやコンテナに障害が発生した場合、Kubernetesは自動的に新しいノードに再スケジュールし、システムの健全性を維持します。
設定管理
アプリケーションの設定やシークレットなどの機密情報をセキュアに管理し、ポータビリティと再利用性を向上させます。
Kubernetesの仕組み
Kubernetesの仕組みは、複数の概念とコンポーネントに基づいています。Kubernetesはアプリケーションのデプロイメント、スケーリング、管理を効率化し、高い可用性や耐障害性を提供します。
KubernetesはDocker Engineなどのコンテナエンジンとは別のソフトウェアであり、別で「CNI (Container Network Interface: 仮想ネットワークのドライバ)」をインストールする必要があります。
以下の要素は、Kubernetesがコンテナオーケストレーションを行うための基本的な仕組みを構築しています。
Node (ノード)
Kubernetesクラスタは、物理または仮想のマシンで構成されています。これらのマシンはNode (ノード)と呼ばれ、クラスタ内でコンテナ化されたアプリケーションをホストします。各Nodeには、Kubernetesのエージェントである「kubelet」が実行されています。
Cluster (クラスタ)
Kubernetesクラスタは、複数のNodeで構成され、協調して動作します。Kubernetesシステム内のMasterノードとWorkerノードで構成された一群のことをクラスタと言います。
Masterノード
Masterノードは、クラスタ全体の制御を担当します。Masterノードではコンテナは動いておらず、Workerノード上のコンテナを管理するだけです。Masterノードでは、「コントロールプレーン (制御盤)」で、Workerノードを管理します。
Masterノードの設定を行うために、管理者のパソコンに「kubectl」を入れます。kubectlを入れることで、Masterノードにログインして初期設定や調整が行なうことが出来ます。
また、Masterノードはコンテナなどの状態管理の為に、「etcd」というデータベースを入れます。etcdは、Kubernetesなどの分散システムでの設定情報やクラスター内の状態の管理に広く使用されており、分散型で冗長性を持ち、高可用性な状態を保つことができます。
Kubernetesでの定義ファイルの内容は、etcdに登録され管理します。登録された内容に従って、Podやサービスを作成します。この作成されたものを「インスタンス (instance)」と呼びます。
データベースにオブジェクト情報として登録したものを元に、インスタンスを作成します。
主なコンポーネントには次のものがあります。
- kube-apiserver
Kubernetes APIサーバーは、クラスタ内の各コンポーネントと通信しAPIリクエストを受け入れます。kubectlからの命令を受け取ります。
- kube-scheduler
ノード上で実行する新しいPodをWorkerノードへ割り当てます。
- kube-controller-manager
クラスタの様々なコントローラー (ノード、レプリケーション、サービスなど)を実行します。
- cloud-controller-manager
クラウドサービスと連携して、サービスを作ります。
- etcd
分散キー値ストアで、設定データや状態などのクラスタ情報を全て管理します。
Workerノード
Workerノードは、Kubernetesクラスタ内でコンテナが実行される物理または仮想のマシンです。Workerノードはクラスタ内のリソースを提供し、コンテナ化されたアプリケーションがデプロイされ、実行される場所です。
各ワーカーノードは、リソースの提供、ポッドの管理、ネットワークの制御など、クラスタ内で異なる役割を果たします。
また、Workerノード上で動作する「kube-let」プロセスが、Masterノードからの指示に基づいてコンテナを起動、停止、監視します。「kube-let」はMasterノードの「kube-scheduler」と連携し、コンテナを操作します。
kube-letと同様に動作する「kube-proxy」はネットワーク通信をルーティングする仕組みとなっています。
Kubernetesの状態維持の仕組み
Kubernetesは、コンテナ化されたアプリケーションのデプロイと管理において、アプリケーションが常に正常な状態に保たれるようにするための状態維持 (Stateful)の仕組みを提供しています。
Pod・サービス・デプロイメント・レプリカセットなどを「リソース (resource)」と言います。
以下は、Kubernetesの状態維持に関連する主要な仕組みと概念です。
Volume (ボリューム)
ボリュームは、Pod内のコンテナ間でデータを共有するための仕組みです。永続的なデータストレージや一時的なデータの共有など、様々なユースケースに使用されます。
Pod (ポッド)
PodはKubernetes上でデプロイされる最小のデプロイ単位です。Podはコンテナとボリュームがセットになったものです。
通常、1つ以上のコンテナが同じPod内で共有され、同じネットワーク名前空間・ストレージなどを共有します。Podはスケジューリングの単位であり、スケジューラによってNode上に配置されます。
Controller (コントローラ)
コントローラは、クラスタ内の特定のリソースを管理するもので、デプロイ・レプリケーション・サービス・ジョブなどがあります。これらのコントローラはクラスタを常に指定された状態に保ちます。
Service (サービス)
サービスは、Podの集合に対して一つのネットワークエンドポイントとして機能します。サービスが管理するPodは、基本的に同一の構成のPodで、違う構成のPodは別のサービスが管理します。
これにより、Podがダイナミックに追加または削除されても、サービスは一貫してアクセス可能です。
サービスはアプリケーションのレプリカセットに対するロードバランシングと内部DNSの提供を担当します。
サービスの「ロードバランサー (負荷分散装置)」は、ユーザーからのアクセスを複数のサーバーに振り分けます。サービスごとに、自動的に固定のIPアドレスが割り振られ (Cluster IP)、アクセスしてくる通信を捌いています。どのサーバーにアクセスするかを均等にすることで、各サーバーへの負荷が一様になります。
サービスのロードバランサーはあくまでWorkerノード内の話なので、各Workerノードへの振り分けは、本物のロードバランサーか、「Ingress (イングレス)」が行います。
レプリカセットとデプロイメント
レプリカセットとデプロイメントは、Kubernetesにおいてアプリケーションの複製や管理を効果的に行うためのリソースです。
共通点としてレプリカセットとデプロイメントは、アプリケーションの冗長性を確保するために使用され、どちらもPodの複製と管理に関与します。
相違点はデプロイメントはレプリカセットを抽象化し、アプリケーションのデプロイと管理に特化しています。また、デプロイメントはロールバックやアップグレードといった機能を提供し、アプリケーションの変更を容易にします。
簡潔に言えば、レプリカセットはアプリケーションの複製と冗長性に焦点を当てた基本的な概念であり、デプロイメントはアプリケーションのデプロイと管理を簡略化し、変更のトラッキングをサポートする高レベルの抽象化です。
レプリカセット
レプリカセットは、同じ種類のコンテナを指定された数だけ複製して、クラスター内で動作させるためのものです。これにより、アプリケーションの冗長性を確保し、安定性を向上させます。
- レプリカセットは特定の数のPod (コンテナの実行単位)を維持します。
- Podが意図せず終了した場合、レプリカセットは新しいPodを作成して指定された数を保ちます。
- レプリカセットは、アプリケーションの複製と冗長性に焦点を当てています。
デプロイメント
デプロイメントは、アプリケーションのデプロイと管理を簡略化するための高レベルの抽象化です。デプロイメントが利用されることで、アプリケーションのバージョンの更新、スケーリング、ロールバックなどが容易に行えます。
- デプロイメントはレプリカセットの一種で、レプリカセットを管理する高レベルなリソースです。
- アプリケーションの新しいバージョンをデプロイする際、デプロイメントが新しいレプリカセットを作成し、徐々に新しいバージョンにアップグレードします。
デプロイメントはアプリケーションの歴史をトラックし、ロールバックをサポートします。