今回だけでは語り尽くせないKubernetesの中身をもっと深く掘り下げて紹介します。次回もお楽しみに!ノードコントローラの他にも様々なコントローラがあり、controller-managerは「様々なコントローラをまとめて実行」します。コントローラは個別のプロセスですが、それらが1つの実行ファイルに纏められてcontroller-managerとして単一のプロセスで実行されます(図11)。そのため、使用するIngressリソースを作成するだけでは十分でなく、Ingress機能を利用するには個別にIngressControllerを用意する必要があります。IngressControllerには各パブリッククラウドのロードバランサーサービスと連携するものやIngress-nginxなどがあります。これらのIngressControllerを用いることで通信をServiceへルーティングできるようになります(図16)。ここでは、マスターノードに焦点を当てて解説します。マスターノードはクラスタ内にあるワーカーノードとPodを管理します。「etcd」は、ひと言で説明すると「クラスタ情報の保管庫」となるコンポーネントです。Kubernetesクラスタに関する全情報(ノードやPod、構成、アカウントやロールなど)を保存します。ノード情報を取得するリクエストが実行されたとき、表示される情報はapiserverがetcdと直接やり取りをして引っ張ってきます。低レベルランタイムには、Linuxのシステムリソースを隔離するnamespaceやcgroupの機能を利用し、Dockerの標準ランタイムとして搭載されている「runc」、セキュリティを重視したGoogleの「gVisor」、軽量の仮想マシンを立ち上げ、隔離を重視した「Kata Containers」が存在します。具体的には、PodはそれぞれIPアドレスで通信しますが、コンテナの節で解説したようにPod(コンテナ)も起動や削除を繰り返すため、その宛先も常に変わっていきます。そのためPodと通信するにはクラスタIPを挟み、serviceが仲介となり各Podに通信を転送します。クラスタIPの情報さえ知っていれば、PodのIPアドレスがどんなに変わっても通信を振り分けてくれるということです。なお、Ingressには負荷分散やSSL/TLS終端の機能や、Serviceに名前ベースの仮想ホスティングを構成する機能などがあります。ここでは詳細に触れませんが、様々な機能が備わっていることを知っておきましょう。Kubernetesはこれらのコンテナランタイムをすべてサポートするため、環境に合ったコンテナランタイムを選択できるのです。このようなサポートの広さもKubernetesの人気の1つかもしれません。図10:kube-schedulerによるPod配置の決定イメージ図図13:Worker Nodeを監視しMasterに報告するエージェントkubelet様々なマスターコンポーネントがあって混乱しそうですが、それぞれの役割や違いをしっかりと理解しておきましょう。「コンテナランタイム」は、ワーカーノードでコンテナを実行するコンポーネントです。kubeletから受けた指示を元にコンテナのイメージ取得から実行までを行います。コンテナランタイムは「高レベルランタイム」と「低レベルランタイム」の2層に分かれています(図15)。図11:kube-controller-managerは配下のコントローラ群をまとめて実行・管理このクラスタを構成することで「高可用性」と「負荷分散」を実現できます。コンテナランタイムには様々な種類のソフトウェアがあり、セキュリティや機能の多様性、開発の活発さなどの違いがあります。ノードは、用途によってコンテナの実行ホストを提供する「ワーカーノード」(Worker Node)と、それを管理する「マスターノード」(Master Node)に分かれます。Kubernetesでは、異なる役割を持つノードの「集まり」をクラスタという形で管理します。クラスタ内には少なくとも1つ以上のマスターノードと1つまたは複数のワーカーノードが存在します(図2)。Kubernetesは多数のノードをクラスタとして管理するため、ノード自体の障害やノード間を繋ぐネットワークに障害が起こってもシステムの継続稼動が求められます。これはetcdも同様です。etcdは分散された多数のノード間でデータをレプリケート(複製)して保管することに適しており、マスターノードとマスターコンポーネントのセットが複数あっても一貫してクラスタ情報を保つことができる強みがあります(図9)。「kubelet」は「エージェント」の役割を持つコンポーネントです。各ノードで動作するKubernetesのエージェントで、Podの起動や管理を担います。schedulerからのPod配置指示をapiserver経由で受け取り、コンテナランタイム(後述)を操作してワーカーノード上にPodを作成します。そしてPodやノードの状態を監視してapiserverにレポートを送信します(図13)。高レベルランタイムは、主にコンテナのイメージを取得し、実行するコンテナ環境の設定ファイルなどを作成します。kubeletからCRI(Container Runtime Interface)というインターフェイスで呼び出されますが、CRIには高レベルランタイムで行うイメージ取得やコンテナ環境の設定などの定義情報が含まれています。ccmはKubernetesで使用したいリソースと実際にクラウドで使用しているリソースを連携します。例えば、パブリッククラウドの仮想マシンを利用してKubernetesを実装したとします。その際にクラウドのサービスで提供されているロードバランサーが必要になった場合、クラウド上で実際にロードバランサーを作成し、Kubernetesに関連付ける必要があります。Kubernetesの高可用性は、クラスタ内にあるコンテナなどのコンポーネントに障害が発生した場合、当該コンテナを自動で再起動させたり、他のノードでコンテナを起動させ、故障したコンテナが実行していた処理を引き継がせたりと、事前に定義した状態を維持します(Self-Healing、図3)。しかし、本来Kuberntesにはパブリッククラウドを操作する機能はありません。そこでccmはKubernetesがやりたいことをパブリッククラウドとの間に入り操作の指示を中継することで、Kubernetes上の情報とパブリッククラウド上のリソースとの整合性を保ちます。apiserverの代わりにクラウドとの第一窓口になってくれるわけです(図12)。例えば、ノードの状態を監視するノードコントローラは、apiserverを通じて決められた間隔でノードのステータスを確認します。もし、あるノードに問題が発生し、継続してステータス確認に失敗すると、そのノードに配置されているPodをscheduler経由で正常なノードに再割り当てします。ステータス確認に失敗したノードはschedulerの配置候補の対象から外されます。Ingressはクラスタ外部からクラスタ内に通信するためのURLを提供し、Serviceにロードバランシングするオブジェクトです。外部のクライアントはこのURLを通じてServiceやPodへアクセスできるようになります。Ingressには、クラウドやオンプレミスなどのクラスタ外部のロードバランサーを使用する形式と、クラスタ内部にIngress用のPodを起動する形式とがあります。例えば、3つのノードと1つのPodがあるとします。Podはリソース要件として5CPUを設定しており、それぞれノードAは4CPU、ノードBは10CPU、ノードCは15CPUのリソースを持ちます。最初に、schedulerはPodの要件を満たさない4CPUのノードAを配置先候補から外します。次に、Podをノードに配置した際の空きリソース量が大きいノードを計算し、ノードCの方がノードBよりPod配置後の空きリソース量が最も多いため、最終的にノードCにPodを配置します。これらのステップをそれぞれ「フィルタリング」「スコアリング」と言います(図10)。schedulerによる配置は、リソース量以外にも様々な条件を指定できます。ワーカーノードでネットワーキングに触れたので「Ingress」についても解説しておきます。Kubernetesには、クラスタ機能の提供に必要なものとしてコンポーネントと呼ばれるプロセスが実行されますが、その中でもマスターノードで実行されるコンポーネントをマスターコンポーネントと言います。そして、マスターノードはクラスタ全体を管理するために、それぞれ役割を持った複数のマスターコンポーネントによって成り立っているのです(図6)。そのため、クラスタの稼動継続力(可用性)を高めたい場合は、マスターコンポーネントをそれぞれ1セットとして起動させたマスターノードを複数用意すると良いでしょう。マスターノードとマスターコンポーネントはセットで覚えてください。また、IngressにはIngressControllerという専用のコントローラがありますが、これはマスターノードの項で解説したcontroller-managerで実行される他のコントローラと違い、自動で実行が開始されない点に注意が必要です。「kube-controller-manager」(以下、controller-manager)は、様々な「コントローラ」をまとめて実行するコンポーネントです。コントローラとは、Kubernetesのコンポーネントなどの状態を監視し、必要な対応を実行するプロセスのことです。「cloud-controller-manager」(以下、ccm)は「Kubernetesとパブリッククラウドを中継」するコンポーネントです。
Kubernetesでは、異なる役割を持つノードの「集まり」をクラスタという形で管理します。クラスタ内には少なくとも1つ以上のマスターノードと1つまたは複数のワーカーノードが存在します(図2)。 現在、Kubernetesのノードインターフェースと相互作用する3つのコンポーネントがあります。ノードコントローラー、kubelet、およびkubectlです。 ノードコントローラー 始めに.
Azure Kubernetes Service (AKS) のクラスターで複数のノード プールを作成および管理する Create and manage multiple node pools for a cluster in Azure Kubernetes Service (AKS) 04/08/2020; この記事の内容.
ノードは複数のPodを持つことができ、Kubernetesマスターはクラスター内のノード間でPodのスケジュールを自動的に処理します。 マスターの自動スケジューリングは各ノードで利用可能なリソースを考 … ・kubernetes : v1.10.2 ・ノード構成 : masternode 1台 + workernode 2台. ノードコントローラー、kubelet、およびkubectlです。 ノードコントローラー. 別ノード宛のパケットは、VXLA… Dockerなどのコンテナ技術を使ったクラスタ技術の1つに「Kubernetes」がある。今回はこのKubernetesにおけるネットワーク関連の設定や、コンテナのデプロイについて紹介する。 今回紹介するKubernetesは、Googleが開発を主導するコンテナクラスタ構築ツールだ(図1)。 Pod間のネットワークはflannelというVXLANを管理するソフトウェアにより、172.30.0.0/16というネットワーク空間を持ち、さらにそのネットワークをPodごとに24ビットのネットワーク空間に区切っている。 2. flannel.1というデバイスがVXLANデバイスである。 3. 大方は How to Install Kubernetes (k8s) 1.7 on CentOS 7 / RHEL 7 Kubernetesは、Serviceオブジェクトの複数のポートを公開する定義をサポートしています。 Kubernetes 1.2 adds support for running a single cluster in multiple failure zones (GCE calls them simply "zones", AWS calls them "availability zones", here we'll refer to them as "zones"). 複数のゾーンで動かす. Edit This Page.