コンテナオーケストレーションとは
コンテナオーケストレーションは、複数のコンテナの配置、スケーリング、ネットワーキング、可用性管理を自動化する技術です。本番環境で多数のコンテナを運用する際に不可欠な仕組みです。
なぜ必要か: 数個のコンテナなら手動管理できますが、数百・数千のコンテナになると、配置、障害検知、スケーリングを自動化する仕組みが必要になります。
オーケストレーションが解決する課題
| 課題 | 解決方法 |
|---|---|
| コンテナの配置 | どのノードで実行するか自動決定 |
| スケーリング | 負荷に応じて自動的にコンテナ数を調整 |
| 障害復旧 | コンテナが落ちたら自動的に再起動 |
| ロードバランシング | トラフィックを複数コンテナに分散 |
| サービスディスカバリ | コンテナ間の通信を自動設定 |
| ローリングアップデート | ダウンタイムなしでアプリを更新 |
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などの基本リソースを理解し、適切に組み合わせることで、スケーラブルで可用性の高いシステムを構築できます。
← 一覧に戻る