8月31日、Weaveworksに「アーキテクチャを構成するKubernetesのコンポーネント」が公開された。
Kubernetesは、多くのパーツで構成されているため、管理が複雑なシステムである。
しかし、ITチームやDevOpsチームにとって、Kubernetesのさまざまなコンポーネントと、それらがどのように連携しているかをよく理解することは必須となっている。
この記事では、Kubernetesのコアコンポーネントと、Kubernetesシステムの機能におけるそれらの役割について紹介している。
コンテナ
コンテナはクラウドネイティブアプリケーションのビルディングブロックであり、Kubernetes自体もこのビルディングブロックをより良く管理するために存在している。
Kubernetesは多くのコンテナフォーマットを実行できるが、最も一般的に使用されている形式はDockerである。
コンテナは、アプリケーションのコードとランタイムやライブラリをパッケージ化したものである。
そのサービスやアプリケーションを実行するために必要なすべてのものを1つのユニットにまとめている。
コンテナの最大の利点は、アプリケーションをポータブルにすることである。
これらのコンテナは、あるマシンで動作すれば別のマシンでも動作するという自信を持って、チーム間や外部との共有ができる。
Kubernetesのアーキテクチャは、コンテナを大規模に運用するために構築されている。
ラップトップの「Hello world」アプリをコンテナに入れて起動するのは簡単だが、エンタープライズアプリケーションをコンテナ化するのはより困難になる。
そこで、コンテナに特化した設計のKubernetesが全体のプロセスをシンプルにしてくれる。
ポッド
ポッドはコンテナの集合体である。 ポッド内のコンテナは、ネームスペース、ストレージ、ネットワークなどの共通リソースを共有している。
ポッドは短命で、タスクが完了すると終了する。ポッドを実行しているノードに障害が発生すると、そのポッドも削除される。
つまり、ポッドのライフサイクル全体を管理し、必要に応じて交換する。
ポッドは、そのライフタイムの中で複数のフェーズをたどる。保留、実行中、成功、失敗、不明などがある。
ポッド内のコンテナも同様に、待機、実行、終了などの異なる状態を持っている。
ポッドはPodTemplateファイルの仕様に基づいて作成される。
しかし、ポッドは通常、管理者が個別に作成するものではない。管理者が定義した仕様に基づき、コントローラーによって自動的に作成される。
ポッドのリソース制限とサービス品質の詳細は別記事を参照。
ノード
ノードとは、Kubernetesの他の上位コンポーネントを動かすサーバーインスタンスのことである。Kubernetesシステムのインフラを構成している。
各ノードは、kubeletやkube-proxyなどのコンポーネントで構成されています。
Kubelet
kubeletは、各ノード上でエージェントとして動作し、APIサーバーにノードを登録する。
また、ノード上のポッドに関する情報を定期的に中継する。
kube-proxy
Kube-proxyは、ノードとAPIサーバー間の通信を容易にし、ポッドとの通信を可能にするネットワークプロキシおよびロードバランサーである。
クラスタ
Kubernetesクラスタには、複数のノードとコントロールプレーンコンポーネントが含まれているが、これらについては以下で詳しく説明する。
クラスタは、1つのマスターノードと複数のワーカーノードで構成されている。
マスターノードは、スケジューリング、状態の変更、更新の処理などを行う。クラスタ内のノードは定期的に交換される。
Kubernetesのシステム全体には、複数のクラスタが存在する。これらのクラスタは、クラウドでもオンプレミスでも実行できる。
EKSやGKEのようなマネージドK8sサービスでKubernetesを実行する場合、価格はクラスタ数や使用するノード数に基づいて決定される。
この場合、使用するリソースの量が重要になる。企業は、1つのクラスタ内で複数のアプリケーションを実行し、可能な限り低コストのインスタンスを利用することでコストを最適化することができる。
クラウドベンダーは、Fargateのような完全にマネージドなKubernetesサービスも提供しており、基盤となるノードを管理する必要はない。これは、Kubernetesの運用を簡素化したいと考えている組織にとって、素晴らしい選択肢となる。
コントロールプレーン
コントロールプレーンは、クラスターを管理する場所である。コントロールプレーンを構成するコンポーネントは多くあり、APIサーバー、etcd、コントローラマネージャーなどがある。
APIサーバー
コントロールプレーンの中で最も重要な部分は、クラスタ内の他のすべてのコンポーネント間の通信を可能にするインターフェースとして機能するAPIサーバーだ。
APIサーバーは、HTTP APIを経由しなければならないクラスタへの外部リクエストのエントリーポイントでもある。
APIサーバーを介して、Kubernetesシステム内の他のコンポーネントの状態を問い合わせたり変更したりすることができる。
APIサーバーとのやりとりは、KubectlコマンドまたはREST APIを使って行うことができる。
Kubernetes APIでは、内部またはサードパーティの開発者がカスタムエクステンションを作成して、Kubernetesのコアプラットフォームに追加機能を加えることができる。
これらの拡張機能はCustom Resource Definitions(CRD)と呼ばれる。
CRDは、Kubernetes自身が定義したオブジェクトタイプに加えて、任意のメタデータを公開するメカニズムを提供する。
これにより、ユーザーはソースコード自体を変更することなく、Kubernetesの動作をカスタマイズすることができる。
etcd
etcdは "eventually consistent distributed" データストアの略だ。
これは、クラスター内のすべてのコンポーネントの状態が保存されるキーバリューストアである。
レプリカノードを備え、単一障害点が存在しない、Kubernetes向けの耐障害性の高いデータストアだ。
ただし、etcdに保存されたデータはバックアップが必要。
etcdは、クラスターと同じノードでも、別のインフラでも実行できる。
これにより、データのバックアップ機能が追加され、さらにetcdをコントロールできるようになります。
しかし、管理の手間が増えたり、etcdを実行するためのノードが追加になったりする。
コントローラマネージャー
コントローラマネージャーは、クラスタの状態を現在の状態から目的の状態に変更する責任がある。Kubernetesには、ノードコントローラ、レプリケーションコントローラ、ネームスペースコントローラ、エンドポイントコントローラなど、多くのコントローラが存在する。
スケジューラ
スケジューラは、新しいポッドをクラスタ内のノードに割り当てる。
これは、現在のリソースの利用可能性、ポッドの親和性と反親和性、および他のいくつかの基準を考慮して行う。
ポッドがノードに引き寄せられることを「toleration」と呼び、ノードからはじかれることを「taint」と呼ぶ。
taintとtolerationを意識することで、ワークロードに合わせて修正・カスタマイズすることができる。
コントロールプレーンの監視
コントロールプレーンは、ノード、ネームスペース、サービス・アカウントなど、Kubernetesシステム内のあらゆるものの機能に重要な役割を果たしているため、コントロールプレーンのあらゆる部分を監視することが不可欠である。
コントロールプレーンはデフォルトでPrometheusのメトリクスを公開している。
Prometheusはオープンソースのモニタリングツールで、Kubernetesのモニタリングツールとして最も広く使われている。
モニタリングの重要なポイントは、システムの各コンポーネントの現在の状態と望ましい状態を把握することだ。
APIサーバー、etcd、コントローラマネージャーなどのコントロールプレーンのコンポーネントはこれらのメトリクスを公開しているが、Prometheusのような専用のモニタリングツールで分析する必要がある。
ストレージボリューム
ストレージボリュームはKubernetesで使用され、コンテナやポッドが故障したり、殺されたりしたときに失われるデータを保存する。
エフェメラルストレージボリュームという選択肢もあるが、より広く使われているのは、コンテナやポッドの寿命を超えてデータが生き続けるようにするための永続ボリュームである。
クラスタを実行する場所に応じて、AWS EBS、CephFS、AzureDiskなどのKubernetesデータ用の外部ストレージボリュームを持つオプションがある。
これらのボリュームは、ユーザーが静的にプロビジョニングすることも、システムが動的にプロビジョニングすることもできる。
まとめ
これは、Kubernetesのコアコンポーネントを簡潔にまとめたものである。
注意すべきコンポーネントはたくさんあり、この記事はその役割と機能の概要だ。
それぞれのコンポーネントの使い方や相互の連携については、Kubernetesのドキュメントで詳しく説明されている。
また、Kubernetesとは何か、どのようにして急成長するアプリケーションを迅速にスケーリングすることができるのかについては、別記事で概要を紹介している。