メインコンテンツまでスキップ

Kubernetes アーキテクチャ

Kubernetesの内部構造とコンポーネントを理解し、コンテナオーケストレーションの基盤を学びます。


目次

  1. Kubernetesとは
  2. クラスター構成
  3. コントロールプレーン
  4. ワーカーノード
  5. 基本オブジェクト
  6. マネージドKubernetes
  7. IDサービスでの活用

Kubernetesとは

概要

Kubernetesは、コンテナ化されたアプリケーションのデプロイ、スケーリング、管理を自動化するオーケストレーションプラットフォームです。

Docker Composeとの比較:

Docker Compose:
- 単一ホストでの複数コンテナ管理
- 開発・テスト環境向け
- シンプルな設定

Kubernetes:
- 複数ノードのクラスター管理
- 本番環境向け
- 自己修復、オートスケーリング
- 宣言的な設定管理

主な機能

┌─────────────────────────────────────────────────────────────┐
│ Kubernetesの主な機能 │
├─────────────────────────────────────────────────────────────┤
│ サービスディスカバリと負荷分散 │
│ - DNSベースのサービス検出 │
│ - 自動負荷分散 │
│ │
│ ストレージオーケストレーション │
│ - 永続ボリュームの自動プロビジョニング │
│ - クラウドストレージとの統合 │
│ │
│ 自動ロールアウト/ロールバック │
│ - 段階的なデプロイ │
│ - 問題発生時の自動ロールバック │
│ │
│ 自己修復 │
│ - 異常コンテナの自動再起動 │
│ - ノード障害時の再スケジュール │
│ │
│ シークレットと設定管理 │
│ - 機密情報の安全な管理 │
│ - 設定の外部化 │
│ │
│ オートスケーリング │
│ - 負荷に応じた自動スケール │
│ - リソース使用率ベースのスケーリング │
└─────────────────────────────────────────────────────────────┘

クラスター構成

全体アーキテクチャ

┌─────────────────────────────────────────────────────────────────────┐
│ Kubernetes Cluster │
│ │
│ ┌────────────────────────────────────────────────────────────────┐ │
│ │ Control Plane (Master) │ │
│ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────────────┐ │ │
│ │ │ kube-apiserver│ │kube-scheduler│ │kube-controller-manager│ │ │
│ │ └──────────────┘ └──────────────┘ └──────────────────────┘ │ │
│ │ ┌──────────────────────────────────────────────────────────┐ │ │
│ │ │ etcd │ │ │
│ │ └──────────────────────────────────────────────────────────┘ │ │
│ └────────────────────────────────────────────────────────────────┘ │
│ │ │
│ │ API │
│ ▼ │
│ ┌────────────────────────────────────────────────────────────────┐ │
│ │ Worker Nodes │ │
│ │ │ │
│ │ ┌─────────────────────┐ ┌─────────────────────┐ │ │
│ │ │ Node 1 │ │ Node 2 │ │ │
│ │ │ ┌───────────────┐ │ │ ┌───────────────┐ │ │ │
│ │ │ │ kubelet │ │ │ │ kubelet │ │ │ │
│ │ │ ├───────────────┤ │ │ ├───────────────┤ │ │ │
│ │ │ │ kube-proxy │ │ │ │ kube-proxy │ │ │ │
│ │ │ ├───────────────┤ │ │ ├───────────────┤ │ │ │
│ │ │ │Container │ │ │ │Container │ │ │ │
│ │ │ │Runtime │ │ │ │Runtime │ │ │ │
│ │ │ │(containerd) │ │ │ │(containerd) │ │ │ │
│ │ │ └───────────────┘ │ │ └───────────────┘ │ │ │
│ │ │ ┌─────┐ ┌─────┐ │ │ ┌─────┐ ┌─────┐ │ │ │
│ │ │ │ Pod │ │ Pod │ │ │ │ Pod │ │ Pod │ │ │ │
│ │ │ └─────┘ └─────┘ │ │ └─────┘ └─────┘ │ │ │
│ │ └─────────────────────┘ └─────────────────────┘ │ │
│ └────────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────┘

コントロールプレーン

コンポーネント

1. kube-apiserver

Kubernetes APIのエントリーポイント。すべての操作はAPI Serverを経由します。

┌─────────────────────────────────────────────────────────────┐
│ kube-apiserver │
├─────────────────────────────────────────────────────────────┤
│ 役割: │
│ - REST APIの提供 │
│ - 認証・認可 │
│ - アドミッションコントロール │
│ - etcdとの通信 │
│ │
│ アクセス方法: │
│ - kubectl │
│ - クライアントライブラリ │
│ - REST API直接 │
└─────────────────────────────────────────────────────────────┘
# APIサーバーへの直接アクセス
kubectl proxy &
curl http://localhost:8001/api/v1/namespaces/default/pods

# クラスター情報の確認
kubectl cluster-info

2. etcd

分散キーバリューストア。クラスターの全状態を保存します。

┌─────────────────────────────────────────────────────────────┐
│ etcd │
├─────────────────────────────────────────────────────────────┤
│ 保存データ: │
│ - クラスター設定 │
│ - Secrets、ConfigMaps │
│ - サービスディスカバリ情報 │
│ - Pod、Deploymentなどの状態 │
│ │
│ 特徴: │
│ - 強整合性(Raft consensus) │
│ - 高可用性(3または5ノード推奨) │
│ - 監視機能(Watch API) │
└─────────────────────────────────────────────────────────────┘

3. kube-scheduler

Podを適切なノードに配置するコンポーネント。

┌─────────────────────────────────────────────────────────────┐
│ kube-scheduler │
├─────────────────────────────────────────────────────────────┤
│ スケジューリング基準: │
│ - リソース要求(CPU、メモリ) │
│ - ノードセレクター/アフィニティ │
│ - Taint/Toleration │
│ - Pod間の配置制約 │
│ │
│ 処理フロー: │
│ 1. 未スケジュールPodを検出 │
│ 2. フィルタリング(配置可能ノード選定) │
│ 3. スコアリング(最適ノード選択) │
│ 4. バインディング(Podをノードに割り当て) │
└─────────────────────────────────────────────────────────────┘

4. kube-controller-manager

各種コントローラーを実行し、クラスターの状態を維持します。

┌─────────────────────────────────────────────────────────────┐
│ kube-controller-manager │
├─────────────────────────────────────────────────────────────┤
│ 主なコントローラー: │
│ │
│ Node Controller │
│ └── ノードの監視、障害検出 │
│ │
│ Replication Controller │
│ └── Podレプリカ数の維持 │
│ │
│ Endpoints Controller │
│ └── ServiceとPodの紐付け │
│ │
│ Service Account Controller │
│ └── サービスアカウントの管理 │
│ │
│ Deployment Controller │
│ └── Deploymentのロールアウト管理 │
│ │
│ Job Controller │
│ └── バッチジョブの実行管理 │
└─────────────────────────────────────────────────────────────┘

ワーカーノード

コンポーネント

1. kubelet

各ノードで動作するエージェント。Podの実行を管理します。

┌─────────────────────────────────────────────────────────────┐
│ kubelet │
├─────────────────────────────────────────────────────────────┤
│ 役割: │
│ - PodSpecに従ってコンテナを実行 │
│ - コンテナのヘルスチェック │
│ - ノードとPodのステータス報告 │
│ - ボリュームのマウント │
│ - シークレットの取得とマウント │
│ │
│ 通信: │
│ - API Server ← → kubelet(双方向) │
│ - kubelet → Container Runtime │
└─────────────────────────────────────────────────────────────┘

2. kube-proxy

ネットワークプロキシ。Serviceの負荷分散を実現します。

┌─────────────────────────────────────────────────────────────┐
│ kube-proxy │
├─────────────────────────────────────────────────────────────┤
│ 動作モード: │
│ │
│ iptables モード(デフォルト) │
│ - iptablesルールでトラフィックを転送 │
│ - 低オーバーヘッド │
│ │
│ IPVS モード │
│ - Linuxカーネルの仮想サーバー機能を使用 │
│ - 大規模クラスターで高パフォーマンス │
│ │
│ userspace モード(レガシー) │
│ - 非推奨 │
└─────────────────────────────────────────────────────────────┘

3. Container Runtime

コンテナを実行するランタイム。

┌─────────────────────────────────────────────────────────────┐
│ Container Runtime │
├─────────────────────────────────────────────────────────────┤
│ 対応ランタイム: │
│ │
│ containerd(推奨) │
│ └── Docker社が開発、CNCFに寄贈 │
│ └── Kubernetesのデフォルトランタイム │
│ │
│ CRI-O │
│ └── OCI準拠の軽量ランタイム │
│ └── Red Hat/OpenShiftで使用 │
│ │
│ Docker(非推奨) │
│ └── Kubernetes 1.24以降で非サポート │
│ └── containerdに移行 │
└─────────────────────────────────────────────────────────────┘

基本オブジェクト

オブジェクト階層

┌─────────────────────────────────────────────────────────────┐
│ Kubernetes Objects │
├─────────────────────────────────────────────────────────────┤
│ │
│ Namespace │
│ └── 論理的なクラスター分割 │
│ │
│ Workloads │
│ ├── Pod ← 最小単位 │
│ ├── Deployment ← ステートレスアプリ │
│ ├── StatefulSet ← ステートフルアプリ │
│ ├── DaemonSet ← 全ノードで実行 │
│ ├── Job ← バッチ処理 │
│ └── CronJob ← 定期実行 │
│ │
│ Networking │
│ ├── Service ← Pod への安定したアクセス │
│ ├── Ingress ← HTTP(S)ルーティング │
│ └── NetworkPolicy← ネットワークポリシー │
│ │
│ Storage │
│ ├── PersistentVolume (PV) │
│ └── PersistentVolumeClaim (PVC) │
│ │
│ Configuration │
│ ├── ConfigMap ← 設定データ │
│ └── Secret ← 機密情報 │
│ │
└─────────────────────────────────────────────────────────────┘

Pod

Kubernetesの最小デプロイ単位。1つ以上のコンテナをグループ化。

# pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: idp-server
labels:
app: idp-server
spec:
containers:
- name: idp-server
image: my-idp-server:latest
ports:
- containerPort: 8080
resources:
requests:
memory: "256Mi"
cpu: "250m"
limits:
memory: "512Mi"
cpu: "500m"

Deployment

Podの宣言的な更新を管理。

# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: idp-server
spec:
replicas: 3
selector:
matchLabels:
app: idp-server
template:
metadata:
labels:
app: idp-server
spec:
containers:
- name: idp-server
image: my-idp-server:latest
ports:
- containerPort: 8080

Service

Podへの安定したネットワークエンドポイントを提供。

# service.yaml
apiVersion: v1
kind: Service
metadata:
name: idp-server
spec:
selector:
app: idp-server
ports:
- port: 80
targetPort: 8080
type: ClusterIP

マネージドKubernetes

主要なマネージドサービス

┌─────────────────────────────────────────────────────────────┐
│ マネージド Kubernetes │
├─────────────────────────────────────────────────────────────┤
│ AWS EKS (Elastic Kubernetes Service) │
│ - Control Planeをマネージド │
│ - IAMとの統合 │
│ - Fargateでサーバーレス実行可能 │
│ │
│ Google GKE (Google Kubernetes Engine) │
│ - 最も成熟したマネージドサービス │
│ - Autopilotモード(フルマネージド) │
│ - 高度なネットワーク機能 │
│ │
│ Azure AKS (Azure Kubernetes Service) │
│ - Azure Active Directoryとの統合 │
│ - Virtual Kubeletでサーバーレス │
│ │
│ その他 │
│ - DigitalOcean Kubernetes │
│ - Oracle Container Engine for Kubernetes │
│ - IBM Kubernetes Service │
└─────────────────────────────────────────────────────────────┘

セルフホストvs マネージド

項目セルフホストマネージド
Control Plane管理自己責任プロバイダ管理
アップグレード手動ワンクリック/自動
高可用性構築が必要標準提供
コスト低(初期)高(Control Plane費用)
運用負荷
柔軟性制限あり

IDサービスでの活用

推奨アーキテクチャ

┌─────────────────────────────────────────────────────────────────────┐
│ Production Cluster │
│ │
│ ┌────────────────────────────────────────────────────────────────┐ │
│ │ Ingress │ │
│ │ (NGINX / ALB) │ │
│ └────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌────────────────────────────────────────────────────────────────┐ │
│ │ idp-server Service │ │
│ │ (ClusterIP / LoadBalancer) │ │
│ └────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌───────────────┼───────────────┐ │
│ ▼ ▼ ▼ │
│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │
│ │ Pod │ │ Pod │ │ Pod │ │
│ │ idp-server │ │ idp-server │ │ idp-server │ │
│ │ :8080 │ │ :8080 │ │ :8080 │ │
│ └─────────────────┘ └─────────────────┘ └─────────────────┘ │
│ │
│ ┌────────────────────────────────────────────────────────────────┐ │
│ │ External Services │ │
│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │
│ │ │ RDS │ │ElastiCache│ │ SES │ │ │
│ │ │(Postgres)│ │ (Redis) │ │ (Email) │ │ │
│ │ └──────────┘ └──────────┘ └──────────┘ │ │
│ └────────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────┘

基本的なマニフェスト構成

k8s/
├── base/
│ ├── kustomization.yaml
│ ├── namespace.yaml
│ ├── deployment.yaml
│ ├── service.yaml
│ ├── configmap.yaml
│ └── secret.yaml
├── overlays/
│ ├── development/
│ │ └── kustomization.yaml
│ ├── staging/
│ │ └── kustomization.yaml
│ └── production/
│ ├── kustomization.yaml
│ ├── ingress.yaml
│ └── hpa.yaml

まとめ

主要コンポーネント

コンポーネント場所役割
kube-apiserverControl PlaneAPIエントリーポイント
etcdControl Planeクラスター状態保存
kube-schedulerControl PlanePod配置決定
kube-controller-managerControl Plane状態維持
kubeletWorker NodePod実行管理
kube-proxyWorker Nodeネットワーク管理

次のステップ


参考リソース