k8s_clearily_series③ kubernetesクラスター
kubernetesついて明瞭に説明していく「k8s_clearily_series」の三回目になります。
第三回目はkubernetesを構成する「kubernetesクラスター」については詳細な説明をさせていただきます。
- kubernetesクラスターについて
- Master Node
- Master Nodeを構成する各種コンポーネント
- Worker Nodeに
- Worker Nodeを構成する各種コンポーネント
kubernetesクラスターについて
kubernetesクラスターは、Nodeと呼ばれる複数の物理サーバーおよび仮想マシンから構成されたものであり、これらのNodeはkubernetesのクラスター内で全体のリソースを共有しております。
上記のようなケースでは、Nodeの台数分クラスター内に容量があると考えていただいてよいです。
kubernetesクラスターを構成するNodeには2種類ございます。
- Master Node
クラスター全体の制御を担当し、クラスターのリソース管理の役割を担うNode - Worker Node
コンテナ化されたアプリケーションを実行する役割を担うNode
Master Node
Master Nodeはkubernetesクラスターにおける中枢の役割があるNodeになり、ControlPlaneとも呼ばれております。クラスター全体の制御および管理、監視やコンテナのスケジューリングに加え、コンテナ化されたアプリケーションのデプロイメントに関連するタスクを担当する重要なコンポーネント群になります。
下記の図は、Master Node(ControlPlane)を構成する図とコンテナアプリケーションのコンポーネント各種になります。
Master Nodeを構成する各種コンポーネント
- ①API-server(kube-apiserver)
API-serverはkubernetesのControlPlaneにおける中心的なコンポーネントになり、クラスター内のリソースとオブジェクトにアクセスするためのAPIを提供するアプリケーションサーバーになります。API-serverの役割と機能は下記内容になります。
- ②etcd
分散key=value storeのデータベースであり、kubernetesクラスターの主要なデータベースになります。クラスター内での設定、状態、リソースの管理に不可欠なものとなり、役割と機能は下記の図になります。
③Scheduler(kube-scheduler)
PodをどのWorker Nodeで実行するかを決定するものであり、Podのスケジューリングを担当する個所となります。スケジューリングの決定は、リソースの使用率や要求されたリソース、ユーザーが定義したポリシーに基づいて行われます。Schedulerの概要をPod、Node、カスタマイズに分類したものが以下になります。
- ④Controller Manager(kube-controller-Manager)
kubernetesクラスター内で利用できるリソースの大半にはControllerが設定されております。このControllerはクラスター内のリソースの状態の維持監視を行い、必要に応じて各種Controllerを実行してクラスターの状態をあるべき理想状態にします。この設定された各種Controllerを監視するものがController Managerになります。
下記にて、Controllerの役割とController Managerの役割を記載します。
kube-controller-managerが監視する各種Controllerの一部を下記に記載します。
- ⑤Cloud-Controller-Manager
kubernetesクラスターとクラウドプロバイダーが連携し、クラウド環境特有のロジックを組み込み、リソース機能を管理するためのコンポーネントになります。
異なるクラウドプロバイダー(AWS、Azure、GCPなど)に対するカスタムコントローラーを実行することができるるため、そのクラウド環境特有の機能やリソースにアクセスを行うことが可能となるため、kubernetesクラスターはクラウドプロバイダーのリソースを効果的に管理することが可能となります。
注意点として、クラウドプロバイダー固有のコントローラーからしか実行することができないため、オンプレミス上にあるkubernetesクラスターに存在しません。
Cloud-Controller-Managerもつクラウドプロバイダーに対しての役割と主要な機能の一部についていくつか説明をいたします。
- Node Controller
kubernetesにおけるデフォルトのコントローラーとして提供をしていますが、クラウドプロバイダーが提供しているNodeのライフサイクル管理と連携して、クラウドプロバイダーからのNode操作とkubernetesのNode管理を行うことが可能となります。
- LoadBalancer Controller
クラウドプロバイダーが提供するロードバランサーサービスを活用するためのカスタムコントローラーになります。クラウドプロバイダーと連携して、プロバイダー固有のロードバランサーを作成し、Serviceへのトラフィックを適切にルーティングするものになります。
- Route Controller
クラウドプロバイダーが提供するネットワークルーティングの制御に関連するカスタムコントローラーになります。これにより、クラウドプロバイダー固有のネットワーク機能を有効にし、Kubernetesのポッドとサービスへのトラフィックのルーティングを制御することが可能となります。
- Volume Controller
クラウドプロバイダー固有のブロックストレージやファイルストレージなどのボリュームを管理するためのカスタムコントローラーです。Kubernetesの「PersistentVolume」と「PersistentVolumeClaim」リソースとの間でマッピングを行い、クラウドプロバイダーが提供するリソースを使用することが可能となります。
Worker Node
Worker Nodeはコンテナ化されたアプリケーションを実行し、クラスター内で実行するリソースの提供を行います。kubenetesクラスターにてWorker Nodeを動作する上で代表的なものはkubelet、kube-proxy、コンテナランタイムなど、主に3つのコンポーネントがございます。
Worker Nodeを構成するコンポーネント
- kubelet
kubeletは基本Worker Node上で実行され、Master Nodeからの指示に従ってコンテナを起動や停止に加え、状態の監視を行うコンポーネントになります。Worker Node内にPodの作成を行う役割とクラスター内のコンテナランタイム(Dockerなど)を操作し、Podの中へのコンテナ作成も行う役割があり詳細な機能については以下になります。
①コンテナ管理
Worker Node上でコンテナランタイムを操作し、Pod内のコンテナ作成、起動、停止、再起動、削除などの管理を行います。また、Podの仕様に従い、指定されたコンテナを実行し、必要な場合にコンテナの再起動や再作成を実行します。
②Podのモニタリングとリソース監視と制約
Worker Node上で実行されるPodの状態を監視し、異常終了したコンテナを再起動したりPod全体の再作成を行ったりします。そのため、Podのリソース使用状況(CPU&メモリ)を監視し、過剰なメモリ使用やCPU使用などの問題を検出を行い、リソースが過剰に消費されるのを防ぐ役割もあります。
③イベントとログの取得
Podの状態変更、イベント、エラーメッセージなどのログ情報を収集し、これらの情報をkubernetesのイベントシステム(Master Node)へ報告します。これにより、クラスター内でのトラブルシューティングや監視が行いやすくなります。
④クラウドプロバイダーの統合
Cloud-Controller-Managerとクラウドプロバイダーの連携を行い、クラウドプロバイダーの固有機能と統合しすることによって、クラウドプロバイダーからkubeletを通じてNodeに対し、メタデータの取得、作成と削除、スケーリングなどの実行が可能となります。
kubeletはkubernetesクラスター内のWorker Nodeで実行されコンテナランタイムと協力してPodの実行と管理を行うのが主な役割になります。クラスター内のコンテナ化されたアプリケーションの実行やNodeの状態を維持する役割などもあります。
- kube-proxy
kube-proxyの役割は、クラスター内のネットワークトラフィックの制御、Pod間通信、Serviceのロードバランシングなどに対してルールの提供を行う役割があり、その役割に対しての機能が以下になります。
①サービスディスカバリーとラウンドロビンロードバランシング
Kubernetes Serviceリソースを使用して、クラスター内のポッドに対するサービスディスカバリ(ネットワークの位置情報)を実現します。Serviceはサービス名とPortにマッピングされ、kube-proxyはこれらのルールを解釈して、サービス名に提供を行い、指定されたPodにトラフィックの転送を行います。これによって、サービス名からPodへの通信が可能となります。
また、サービスが複数のバックエンドとして持つ場合には、ラウンドロビンロードバランシングのルールとしてトラフィックを異なるPodに均等に分散をするルールを提供した結果、負荷分散と冗長性を実現することができます。
②ポートフォワーディング
クラスター内のPodへのトラフィックを指定されたPortにフォワードするルールをServiceへ提供します。Serviceはkube-proxyから提供されたポートフォワーディングルール元に設定されたPortへ外部からアクセスされたトラフィックを指定のPodに転送します。
③ネットワークポリシーによる制御
kube-proxyはネットワークポリシーによるルール提供をServiceに提供し、Pod間の通信にセキュリティを適用します。これによってPod間の通信を制限し、セキュリティを強化することが可能となります。
kube-proxyは、クラスター内のネットワーク通信実施のためルールの提供を行い、クラスター内のPodへServiceを通して通信と制御を可能にする非常に重要なコンポーネントです。ネットワークルールの設定を元にロードバランシング、サービスディスカバリ、ネットワークセキュリティなど、多くの機能を提供します。
- コンテナランタイム
コンテナを実際に実行し管理するソフトウェアになります。
kubernetesはクラスターを構築して、Podを作成し、そのPodの中にコンテナをスケジューリングしてコンテナ管理を行うオーケストレーションツールになります。その中でkubernetesはコンテナをスケジューリングする際に、コンテナランタイムと連携して、コンテナをPodにスケジューリングして管理を行っております。
そのため、kubernetesとコンテナランタイムは別ものであり、kubernetesとコンテナランタイムは連携を行ってクラスター内にコンテナをスケジューリングできるようにしています。
長くなりましたが、これがkubernetesクラスターにおけるMaster NodeとWorker Nodeの概要。そのコンポーネントについての説明になります。
次回はDeploymentについてのお話をさせていただきます。