Kubernetes(クバネティス/k8s)は、Googleが開発しオープンソース化したコンテナオーケストレーションシステムです。Dockerコンテナを大規模に運用・管理するためのプラットフォームとして、現代のクラウドネイティブ開発に欠かせない技術となっています。本記事では、Kubernetesの基礎から実践的な運用まで徹底解説します。
Kubernetesとは?なぜ必要なのか
Dockerコンテナは単体のアプリケーション実行環境としては優れていますが、複数のコンテナを大規模に管理する場合には課題が生まれます。Kubernetesはそうした課題を解決するオーケストレーションツールです。
Kubernetesが解決する課題
- コンテナの自動スケーリング:トラフィックに応じてコンテナ数を自動調整
- 自己修復機能:障害が発生したコンテナを自動的に再起動
- ローリングアップデート:ダウンタイムなしでアプリケーションを更新
- サービスディスカバリ:コンテナ間の通信を自動管理
- 設定・機密情報管理:ConfigMapとSecretで環境設定を一元管理
Kubernetesの主要コンポーネント
Pod(ポッド)
PodはKubernetesの最小デプロイ単位です。1つ以上のコンテナをグループとして管理し、同じネットワーク空間を共有します。
apiVersion: v1
kind: Pod
metadata:
name: my-app
labels:
app: my-app
spec:
containers:
- name: app
image: nginx:latest
ports:
- containerPort: 80
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"Deployment(デプロイメント)
Deploymentは複数のPodのレプリカを管理し、ローリングアップデートやロールバックを可能にします。
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: app
image: my-app:v1.2.0
ports:
- containerPort: 8080
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0Service(サービス)
ServiceはPodへのアクセスを管理する抽象化レイヤーです。PodのIPアドレスが変わっても常に同じエンドポイントでアクセス可能にします。
apiVersion: v1
kind: Service
metadata:
name: my-app-service
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 8080
type: LoadBalancerConfigMapとSecretによる設定管理
ConfigMap(コンフィグマップ)
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
DATABASE_HOST: "db.example.com"
DATABASE_PORT: "5432"
APP_ENV: "production"Secret(シークレット)
apiVersion: v1
kind: Secret
metadata:
name: app-secret
type: Opaque
data:
DATABASE_PASSWORD: BASE64ENCODED_PASSWORD
API_KEY: BASE64ENCODED_KEYHorizontal Pod Autoscaler(HPA)による自動スケーリング
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: my-app-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: my-app
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70便利なkubectlコマンド一覧
| コマンド | 説明 |
|---|---|
kubectl get pods | Pod一覧を表示 |
kubectl get deployments | Deployment一覧を表示 |
kubectl describe pod POD_NAME | Podの詳細情報を表示 |
kubectl logs POD_NAME | Podのログを表示 |
kubectl exec -it POD_NAME -- bash | Podにシェル接続 |
kubectl apply -f manifest.yaml | マニフェストを適用 |
kubectl rollout history deployment/NAME | デプロイ履歴を表示 |
kubectl rollout undo deployment/NAME | 前のバージョンにロールバック |
まとめ
Kubernetesは初学者には学習コストが高く感じられますが、Pod・Deployment・Serviceの3つの基本コンセプトを理解すれば、実践的な運用が可能になります。本記事で紹介したYAMLマニフェストを参考に、ローカル環境(minikube、kind等)で試してみることをおすすめします。