Kubernetes のアーキテクチャと API

Kubernetes のアーキテクチャと API

Kubernetes のアーキテクチャ

Kubernetes はクラスターという単位で管理されます。クラスターは Kubernetes を構成するためのコンポーネントをホストする複数のノードで構成されています。ワーカー ノードは、実際にアプリケーションのコンテナーをホストするノードです。マスター ノードは、ワーカー ノードや Pod など Kubernetes クラスター内のリソースを管理します。マスター ノードで実行される Kubernetes の管理用コンポーネントはコントロール プレーンと呼ばれます。

コントロール プレーン コンポーネント

コントロール プレーンには次のようなコンポーネントが含まれています。

  • kube-apiserver
  • kube-scheduler
  • etcd
  • kube-controller-manager
  • CoreDNS

kube-apiserver

kube-apiserver は API サーバーとして Kubernetes API を提供するためのコンポーネントです。API サーバーはコントロール プレーンのフロントエンドとして機能します。クライアントやワーカーノードからのリクエストを他のコンポーネントに対して送ります。

etcd

etcd は Kubernetes のすべてのクラスター情報を保存するための一貫性と高可用性をもったキー バリュー ストアです。クラスターに関する重要なデータも保存されるため、バックアップと冗長構成が推奨されています。

分散合意アルゴリズム (Raft) でクラスターを組むことができ、単一のリーダーが何らかの理由で動作しなくなった場合には自動的に新しいリーダーが選出されます。Raft のアルゴリズム性質上、3 台、 5 台、 7 台といった奇数台での構成が推奨されます。

kube-scheduler

スケジューラーは新規に作成した Pod を実行するノードを制御するコンポーネントです。スケジューリングは Pod に必要なリソース、アフィニティによる指定、ハードウェア リソースの制約などから自動的に決定されます。kube-scheduler もリーダー選出の仕組みを備えています。

kube-controller-manager

コントローラーでは管理用の複数のプロセスを実行するコンポーネントです。実行されるプロセスには次のようなものがあります。kube-controller-manager もリーダー選出の仕組みを備えています。

  • ノード コントローラー:ノードのダウンを検知し、状況に応じた処理を実行します。
  • レプリケーション コントローラー:Pod の数を正しく保つよう管理します。
  • エンドポイント コントローラー:Service と Pod を紐付け、エンドポイントを管理します。
  • サービス アカウントとトークン コントローラー:名前空間に対して、デフォルト アカウントと API アクセストークンを作成します。

CoreDNS

CoreDNS はクラスター内の名前解決やサービス ディスカバリに利用されるクラスター内 DNS サーバーです。

ノード コンポーネント

ワーカー ノードでは次のコンポーネントが動作します。また、この他にコンテナーを実行するためのコンテナー ランタイムも実行できる必要があります。

  • kubelet
  • kube-proxy

kubelet

各ノード上で実行される Kubernetes エージェントです。コンテナー ランタイムと連携して、コンテナーが実際に動作しているかどうか管理します。

kube-proxy

各ノードで実行されるネットワーク コンポーネントです。Service で定義されたエンドポイント宛のトラフィックが正常に Pod へ転送されるようにします。

コンテナー ランタイム

Kubernetes では複数のコンテナー ランタイムをサポートしています。主に次のようなものが利用できます。

  • Docker
  • containerd
  • CRI-O
  • Kubernetes CRI に準拠した実装

Kubernetes API

Kubernetes では API を通じて様々な操作を行います。利用できる API は大まかに 5 種類に分類され、それぞれで操作できる対象はリソースとして管理されます。

  • Workloads APIs
  • Service APIs
  • Config and Storage APIs
  • Cluster APIs
  • Metadata APIs

Workloads APIs

Kubernetes 上でコンテナーを起動するためのリソースです。Workloads APIs には次の 8 種類のリソースがあります。

  • Pod
  • ReplicationController
  • ReplicaSet
  • Deployment
  • DaemonSet
  • StatefulSet
  • Job
  • CronJob

Service APIs

Kubernetes 上の Pod へアクセスできるようエンドポイントや負荷分散の機能を提供するためのリソースです。また、Ingress リソースは HTTP/HTTPS でのエンドポイントとルーティングを管理するリソースとして同じカテゴリに分類されます。

  • Service
    • ClusterIP
    • NodePort
    • LoadBalancer
    • Headless
    • ExternalName
    • None-Selector
  • Ingress

Config and Storage APIs

Pod の設定情報や機密データを配置したり、永続的なデータ ボリュームを配置したりするためのリソースです。Key-Value のデータ構造か、ノード上もしくは外部のストレージを利用します。

  • Secret
  • ConfigMap
  • Volumes
  • StorageClass
  • PersistentVolumeClaim

Cluster APIs

Kubernetes クラスター自体に関する内容を定義するリソースです。セキュリティに関する設定や、クラスターの管理に関連したリソースがあります。

  • Node
  • Namespace
  • PersistentVolume
  • ResourceQuota
  • ServiceAccount
  • Role
  • ClusterRole
  • RoleBinding
  • ClusterRoleBinding
  • NetworkPolicy

Metadata APIs

クラスター内で他のリソースを制御する際に利用するリソースです。

  • HorizontalPodAutoscalor
  • LimitRange
  • PodDistruptionBudget
  • Event
  • CustomResourceDefinition