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
コメント