Kubernetesの内部アーキテクチャについて整理してみた

はじめに

Kubernetes の勉強を始めた頃は Pod や Deployment などのリソースに目が行きがちですが、内部でどのような動きをしているのかを知ることも重要になってきます。
そこで、本記事では Kubernetes のコアな部分に絞って説明します。

Kubernetes Cluster とは

Kubernetes には KubernetesCluster というものがあります。 KubernetesCluster とは MasterNode と WorkerNode の集合のことを指します。
簡単に説明すると、 MasterNode は KubernetesCluster の管理を行い、 WorkerNode は Container の実行などを行います。以下の図ではクラスタ内に MasterNode が1台と、WorkerNode が3台が存在しています。

f:id:y-zumi:20190818225225j:plain
Kubernetes Cluster の簡略図

Master Node とは

MasterNode は ControlPlane とも呼ばれています。 MasterNode は KubernetesCluster に関する主要な処理を担っています。 Pod のスケジューリングや、 Kubernetes のリソースの状態の管理などが該当します。
MasterNode は Cluster を管理するために、以下の4つのコアとなるコンポーネントを含んでいます。

  • kube-apiserver
  • etcd
    • リソースの情報を保持するKey Value Store
  • kube-scheduler
    • Podなどを適切なNodeにスケジューリングする
  • kube-controller-manager
    • DeploymentやPodなどを設定したリソース状態に保つ

以下の図では簡単にそれぞれのコンポーネントの関係図を示しています。kube-apiserver が kube-scheduler と kube-controller-manager からリクエストを受け付けて、 etcdに何らかのCRUD操作を行っています。

f:id:y-zumi:20190818230751j:plain
MasterNodeのコンポーネント関係図

kube-apiserverについて

kube-apiserverはKubernetesへのAPIリクエスト(REST)を受け付けるコンポーネントです。開発者が行う kubectl を使ったリクエストも、kube-apiserverがリクエストを受け付けて処理を行っています。
リクエストを受けたkube-apiserverは、基本的にetcdのCRUD操作を行いリソースの情報を変更します。
以下の図のように、kube-apiserverはKubernetesClusterの各コンポーネントからのリクエストも受け付けるため、リクエストはkube-apiserverに集約されます。

f:id:y-zumi:20190818231359j:plain
kube-apiserverの関係図

etcd

etcd は一貫性のあるデータ格納を重視しているキーバリューストアです。すべてのリソース情報(Pod, Deployment など)と、Cluster の状態などは etcd に保存されます。
etcd へのアクセスは kube-apiserver で行うため、他のコンポーネントは kube-apiserver を介して間接的に etcd を変更することになります。

kube-scheduler

kube-scheduler は Pod が新たに作成された時に適切な WorkerNode に割り当てる役割をもっています。実際の動きの例として以下があります。

  1. kubectl から Deployment の作成のリクエストを受けたkube-apiserverがDeploymentを作成
  2. kube-apiserverから通知を受けて、DeploymentController が ReplicaSet を作成
  3. 同様に通知を受けて、ReplicaSetController が Pod を作成
  4. kube-scheduler が Podを適切なWorkerNodeにスケジューリング

3.の段階で作成された Pod はどの Node にも割り当てられていません。4.で kube-scheduler が適切な WorkerNode を選択し、pod.nodeName を更新します。Pod の更新を Node の kubelet が検知し、割り当てられた Node は kubelet を利用して Pod を作成するようになっています。

f:id:y-zumi:20190818234712j:plain
scheduling の流れ

kube-controller-manager

kube-controller-managerのコントローラはリソースを目的の状態(etcdに保存されているリソースのspec情報)にする役割を持っています。コントローラはほとんどのリソースに対して存在しています。一部を以下に列挙します。コントローラはkube-apiserverを介して各リソースの状態をウォッチしており、異常があれば新しいオブジェクトの作成や既存のオブジェクトの更新、削除を行います。

  • ReplicaSet controller
  • Deployment controller
  • Node Controller
  • others...

Worker Nodeとは

WorkerNodeはコンテナやサービスの実行と管理をおこなっています。WorkerNodeは以下の2つのコンポーネントを含んでいます。

  • kubelet
  • kube-proxy

kubelet

kubeletは実行中のPodを常に監視しており、ステータスやリソース消費などをkube-apiserverに送信する役割を持っています。また、Podの起動も担っており、DockerEngineなどを利用してコンテナイメージからコンテナを実行する命令なども行っています。

kube-proxy

kube-proxyはクライアントからのアクセスに対するルーティング機能の役割を持っています。現在のKubernetesのデフォルトの設定では、 iptables をもとにトラフィックをPodに正常に転送されるようにしています。

まとめ

今回はKubernetesアーキテクチャについての概要を説明しました。
コア部分のみの説明となりましたが、実際にKubernetesを利用した記事も書いていこうと思います。

参考文献

kubernetes.io