☸️

コンテナオーケストレーション - Kubernetes入門

17分 で読める | 2025.12.09

コンテナオーケストレーションとは

コンテナオーケストレーションは、複数のコンテナの配置、スケーリング、ネットワーキング、可用性管理を自動化する技術です。本番環境で多数のコンテナを運用する際に不可欠な仕組みです。

なぜ必要か: 数個のコンテナなら手動管理できますが、数百・数千のコンテナになると、配置、障害検知、スケーリングを自動化する仕組みが必要になります。

オーケストレーションが解決する課題

課題解決方法
コンテナの配置どのノードで実行するか自動決定
スケーリング負荷に応じて自動的にコンテナ数を調整
障害復旧コンテナが落ちたら自動的に再起動
ロードバランシングトラフィックを複数コンテナに分散
サービスディスカバリコンテナ間の通信を自動設定
ローリングアップデートダウンタイムなしでアプリを更新

Kubernetesの基本アーキテクチャ

flowchart TB
    subgraph CP["Control Plane"]
        API["API Server"]
        SCH["Scheduler"]
        CM["Controller Manager"]
        ETCD["etcd"]
    end

    subgraph W1["Worker Node 1"]
        K1["kubelet"]
        KP1["kube-proxy"]
        P1A["Pod"]
        P1B["Pod"]
    end

    subgraph W2["Worker Node 2"]
        K2["kubelet"]
        KP2["kube-proxy"]
        P2A["Pod"]
        P2B["Pod"]
    end

    subgraph W3["Worker Node 3"]
        K3["kubelet"]
        KP3["kube-proxy"]
        P3A["Pod"]
        P3B["Pod"]
    end

    CP --> W1
    CP --> W2
    CP --> W3

Control Plane(コントロールプレーン)

  • API Server: クラスタへのすべての操作の入口
  • Scheduler: Podをどのノードで実行するか決定
  • Controller Manager: 望ましい状態を維持するコントローラー群
  • etcd: クラスタの状態を保存する分散KVS

Worker Node(ワーカーノード)

  • kubelet: ノード上でPodを管理
  • kube-proxy: ネットワークプロキシとロードバランシング

主要なリソース

Pod

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

apiVersion: v1
kind: Pod
metadata:
  name: my-app
  labels:
    app: web
spec:
  containers:
    - name: app
      image: nginx:1.25
      ports:
        - containerPort: 80
      resources:
        requests:
          memory: "64Mi"
          cpu: "250m"
        limits:
          memory: "128Mi"
          cpu: "500m"

Deployment

Podのレプリカ管理とローリングアップデートを行います。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
        - name: web
          image: my-app:1.0.0
          ports:
            - containerPort: 8080
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0

Service

Podへの安定したネットワークアクセスを提供します。

apiVersion: v1
kind: Service
metadata:
  name: web-service
spec:
  selector:
    app: web
  ports:
    - port: 80
      targetPort: 8080
  type: ClusterIP

Serviceの種類

タイプ説明
ClusterIPクラスタ内部からのみアクセス可能
NodePort各ノードのポートで外部公開
LoadBalancerクラウドのLBと連携して外部公開
ExternalName外部サービスへのエイリアス

ConfigMap / Secret

設定と機密情報を管理します。

# ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  DATABASE_HOST: "db.example.com"
  LOG_LEVEL: "info"

---
# Secret
apiVersion: v1
kind: Secret
metadata:
  name: app-secrets
type: Opaque
data:
  DATABASE_PASSWORD: cGFzc3dvcmQxMjM=  # base64エンコード
# Podでの使用
spec:
  containers:
    - name: app
      envFrom:
        - configMapRef:
            name: app-config
        - secretRef:
            name: app-secrets

スケーリング

手動スケーリング

kubectl scale deployment web-deployment --replicas=5

自動スケーリング(HPA)

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: web-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: web-deployment
  minReplicas: 2
  maxReplicas: 10
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: 70

ローリングアップデート

flowchart LR
    subgraph Before["更新前"]
        B1["v1"]
        B2["v1"]
        B3["v1"]
    end

    subgraph During["更新中"]
        direction TB
        D1["v1 v1 v1 v2 ← 新バージョン追加"]
        D2["v1 v1 v2 v2 ← 古いバージョン削除"]
        D3["v1 v2 v2 v2"]
        D1 --> D2 --> D3
    end

    subgraph After["更新後"]
        A1["v2"]
        A2["v2"]
        A3["v2"]
    end

    Before --> During --> After
# イメージを更新
kubectl set image deployment/web-deployment web=my-app:2.0.0

# 更新状況を確認
kubectl rollout status deployment/web-deployment

# ロールバック
kubectl rollout undo deployment/web-deployment

ヘルスチェック

spec:
  containers:
    - name: app
      livenessProbe:
        httpGet:
          path: /healthz
          port: 8080
        initialDelaySeconds: 10
        periodSeconds: 5
      readinessProbe:
        httpGet:
          path: /ready
          port: 8080
        initialDelaySeconds: 5
        periodSeconds: 3
  • livenessProbe: 失敗するとコンテナを再起動
  • readinessProbe: 失敗するとServiceから除外

まとめ

Kubernetesは、コンテナ化されたアプリケーションの運用を自動化する強力なプラットフォームです。Pod、Deployment、Serviceなどの基本リソースを理解し、適切に組み合わせることで、スケーラブルで可用性の高いシステムを構築できます。

← 一覧に戻る