Kubernetes

コンテナオーケストレーションプラットフォーム

Kubernetes(K8s)はコンテナ化されたアプリケーションのデプロイ、スケーリング、 管理を自動化するオープンソースプラットフォームです。 宣言的な設定とセルフヒーリングにより、大規模な本番環境の運用を実現します。

アーキテクチャ

┌─────────────────────────────────────────────────────────────────────────────┐
│                              Kubernetes Cluster                             │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│  ┌───────────────────────────────────────────────────────────────────────┐  │
│  │                         Control Plane (Master)                        │  │
│  │                        「クラスタの頭脳」                               │  │
│  │  ┌─────────────┐  ┌─────────────┐  ┌──────────────┐  ┌─────────────┐  │  │
│  │  │ kube-api    │  │   etcd      │  │ kube-        │  │ kube-       │  │  │
│  │  │ server      │  │             │  │ scheduler    │  │ controller  │  │  │
│  │  │             │  │ 分散KVS     │  │              │  │ manager     │  │  │
│  │  │ APIの入口   │◀▶│ 状態保存    │  │ Pod配置決定  │  │ 状態維持    │  │  │
│  │  └──────┬──────┘  └─────────────┘  └──────────────┘  └─────────────┘  │  │
│  │         │                                                              │  │
│  └─────────┼──────────────────────────────────────────────────────────────┘  │
│            │                                                                 │
│            │ kubectl / API                                                   │
│            ▼                                                                 │
│  ┌─────────────────────────────────────────────────────────────────────────┐ │
│  │                        Worker Node (Data Plane)                         │ │
│  │                         「実際の作業場」                                  │ │
│  │                                                                         │ │
│  │  ┌─────────────────────────────────────────────────────────────────┐   │ │
│  │  │  kubelet                                                        │   │ │
│  │  │  - API Serverと通信                                             │   │ │
│  │  │  - Podのライフサイクル管理                                       │   │ │
│  │  └─────────────────────────────────────────────────────────────────┘   │ │
│  │                                                                         │ │
│  │  ┌─────────────────────────────────────────────────────────────────┐   │ │
│  │  │  kube-proxy                                                     │   │ │
│  │  │  - Service の仮想IP管理                                          │   │ │
│  │  │  - iptables / IPVS ルール                                        │   │ │
│  │  └─────────────────────────────────────────────────────────────────┘   │ │
│  │                                                                         │ │
│  │  ┌─────────────────────────────────────────────────────────────────┐   │ │
│  │  │  Container Runtime (containerd / CRI-O)                         │   │ │
│  │  │  ┌─────────┐  ┌─────────┐  ┌─────────┐                          │   │ │
│  │  │  │  Pod A  │  │  Pod B  │  │  Pod C  │  ...                     │   │ │
│  │  │  └─────────┘  └─────────┘  └─────────┘                          │   │ │
│  │  └─────────────────────────────────────────────────────────────────┘   │ │
│  │                                                                         │ │
│  └─────────────────────────────────────────────────────────────────────────┘ │
│                                                                             │
└─────────────────────────────────────────────────────────────────────────────┘

Control Plane コンポーネント

クラスタ全体の管理・制御を担当。通常は複数台で冗長化。

🚪
kube-apiserver

Kubernetes のフロントエンド。全ての操作はここを経由する。

  • • REST API を提供(kubectl, ダッシュボード, 他コンポーネント)
  • • 認証(Authentication)・認可(Authorization)を処理
  • • etcd への唯一のアクセス経路
  • • Admission Controller でリクエストを検証・変更
💾
etcd

クラスタの唯一の真実の源(Single Source of Truth)

  • • 分散キーバリューストア(Raft consensus)
  • • 全リソースの状態を保存(Pod, Service, ConfigMap...)
  • • 高可用性のため奇数台(3, 5, 7)で構成
  • • 定期的なバックアップが重要
📋
kube-scheduler

新しい Pod をどのノードに配置するかを決定。

  • • リソース要求(CPU, Memory)を確認
  • • NodeSelector, Affinity/Anti-Affinity を評価
  • • Taint/Toleration を考慮
  • • スコアリングで最適なノードを選択
🔄
kube-controller-manager

望ましい状態(Desired State)を維持する各種コントローラを実行。

  • Node Controller: ノードの死活監視
  • ReplicaSet Controller: Pod のレプリカ数を維持
  • Deployment Controller: ローリングアップデート
  • Service Controller: ロードバランサー作成(クラウド)
  • Endpoint Controller: Service と Pod の紐付け

Worker Node(Data Plane)コンポーネント

実際にコンテナを実行するノード。通常は複数台で構成。

🤖
kubelet

各ノードで動作するエージェント。Pod のライフサイクルを管理。

  • • API Server から Pod Spec を受け取る
  • • Container Runtime に指示してコンテナを起動
  • • Pod の状態を監視し API Server に報告
  • • Liveness/Readiness Probe を実行
  • • Volume のマウント処理
🔀
kube-proxy

Service の仮想ネットワークを実現するネットワークプロキシ。

  • • Service の ClusterIP へのトラフィックを Pod に転送
  • • iptables / IPVS ルールを管理
  • • ロードバランシング(ラウンドロビン等)
  • • NodePort, LoadBalancer タイプの処理
📦
Container Runtime

実際にコンテナを実行するソフトウェア。

  • containerd: Docker から分離、現在の標準
  • CRI-O: Red Hat 主導、軽量
  • • CRI(Container Runtime Interface)経由で kubelet と連携
  • • イメージの pull、コンテナの起動/停止
⚠️ Docker は K8s 1.24 以降で非推奨(dockershim 削除)

通信フロー例:Pod作成

  1. 1
    kubectl apply

    ユーザーがマニフェストを API Server に送信

  2. 2
    API Server → etcd

    Pod の定義を etcd に保存

  3. 3
    Scheduler

    未割り当ての Pod を検知し、最適なノードを決定

  4. 4
    kubelet

    割り当てられた Pod を検知し、Container Runtime に指示

  5. 5
    Container Runtime

    イメージを pull してコンテナを起動

基本コマンド(kubectl)

kubectl get pods

Pod一覧

kubectl apply -f manifest.yaml

マニフェスト適用

kubectl describe pod NAME

詳細情報

kubectl logs POD

ログ確認

Docker vs Kubernetes

Docker (Compose)

  • • 単一ホスト
  • • 開発・テスト向け
  • • シンプルな設定
  • • 手動スケーリング

Kubernetes

  • • マルチホストクラスタ
  • • 本番向け
  • • 宣言的設定
  • • 自動スケーリング・自己修復

機能別トピック