Docker

Kubernetes入門!コンテナオーケストレーションの基本

Docker

Kubernetes入門!
コンテナオーケストレーションの基本

Kubernetesで複数のコンテナを効率的に管理・運用する方法を基礎から解説します。

こんな人向けの記事です

  • Dockerの次のステップとしてKubernetesを学びたい人
  • コンテナの自動スケーリングに興味がある人
  • Pod、Service、Deploymentの概念を理解したい人

Step 1Kubernetesとは

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

Kubernetesの特徴
# Kubernetesが解決する問題
# 1. 自動スケーリング: 負荷に応じてコンテナ数を自動調整
# 2. 自己修復: コンテナが落ちたら自動で再起動
# 3. ローリングアップデート: ダウンタイムなしでデプロイ
# 4. サービスディスカバリ: コンテナ間の通信を自動管理
# 5. 負荷分散: リクエストを複数コンテナに分配

# ローカル環境の構築
# minikubeを使用(シングルノードのK8sクラスタ)
brew install minikube    # macOS
minikube start           # クラスタ起動
kubectl get nodes        # ノード確認
Docker ComposeとK8sの違い
Docker Composeは単一マシンでの開発向け。K8sは複数マシンでの本番運用向けです。

Step 2主要コンポーネント

K8sアーキテクチャ
# === コントロールプレーン ===
# kube-apiserver:   K8s APIの入り口
# etcd:             設定データの保存
# kube-scheduler:   Podの配置先を決定
# kube-controller-manager: 状態の管理

# === ワーカーノード ===
# kubelet:          Podの実行管理
# kube-proxy:       ネットワークルーティング
# Container Runtime: コンテナの実行(containerd等)

# === 主要リソース ===
# Pod:         最小デプロイ単位(1つ以上のコンテナ)
# Deployment:  Podの管理・スケーリング
# Service:     Podへのネットワークアクセス
# ConfigMap:   設定データ
# Secret:      機密データ
# Ingress:     外部からのHTTPルーティング

# kubectlで操作
kubectl get pods           # Pod一覧
kubectl get deployments    # Deployment一覧
kubectl get services       # Service一覧

Step 3Pod(ポッド)

pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: my-app
  labels:
    app: my-app
spec:
  containers:
    - name: web
      image: nginx:alpine
      ports:
        - containerPort: 80
      resources:
        requests:
          memory: "64Mi"
          cpu: "250m"
        limits:
          memory: "128Mi"
          cpu: "500m"
ターミナル
# Podの作成
kubectl apply -f pod.yaml

# Pod一覧
kubectl get pods

# Podの詳細
kubectl describe pod my-app

# Podのログ
kubectl logs my-app

# Pod内でコマンド実行
kubectl exec -it my-app -- /bin/sh

# Pod削除
kubectl delete pod my-app
Podを直接作成しない
本番ではPodを直接作るのではなく、Deploymentを使います。DeploymentがPodの作成・管理を自動で行います。

Step 4Deployment(デプロイメント)

deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3          # Podを3つ起動
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
        - name: web
          image: my-app:1.0.0
          ports:
            - containerPort: 8000
          env:
            - name: DATABASE_URL
              valueFrom:
                secretKeyRef:
                  name: db-secret
                  key: url
ターミナル
# デプロイ
kubectl apply -f deployment.yaml

# スケーリング
kubectl scale deployment my-app --replicas=5

# ローリングアップデート
kubectl set image deployment/my-app web=my-app:2.0.0

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

# アップデート状況の確認
kubectl rollout status deployment/my-app

Step 5Service(サービス)

service.yaml
# ClusterIP(クラスタ内部のみ)
apiVersion: v1
kind: Service
metadata:
  name: my-app-service
spec:
  selector:
    app: my-app
  ports:
    - port: 80
      targetPort: 8000
  type: ClusterIP

---
# NodePort(外部からアクセス可能)
apiVersion: v1
kind: Service
metadata:
  name: my-app-nodeport
spec:
  selector:
    app: my-app
  ports:
    - port: 80
      targetPort: 8000
      nodePort: 30080     # 30000-32767の範囲
  type: NodePort

---
# LoadBalancer(クラウド環境のLB)
apiVersion: v1
kind: Service
metadata:
  name: my-app-lb
spec:
  selector:
    app: my-app
  ports:
    - port: 80
      targetPort: 8000
  type: LoadBalancer

Step 6実践:アプリのデプロイ

ターミナル(一連のデプロイ手順)
# 1. Dockerイメージをビルド
docker build -t my-app:1.0.0 .

# 2. minikubeにイメージをロード
minikube image load my-app:1.0.0

# 3. Secretの作成
kubectl create secret generic db-secret   --from-literal=url="postgresql://user:pass@db:5432/mydb"

# 4. Deployment と Service をデプロイ
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml

# 5. 状態確認
kubectl get all

# 6. minikubeでアクセス
minikube service my-app-nodeport --url
# → http://192.168.49.2:30080

# 7. オートスケーリングの設定
kubectl autoscale deployment my-app   --min=2 --max=10 --cpu-percent=80
次のステップ
Ingress(HTTPルーティング)、ConfigMap、PersistentVolume、Helmチャートを学ぶと、本格的な運用が可能になります。

まとめ

  • K8sはコンテナの自動スケーリング・自己修復を提供
  • Podは最小単位、DeploymentでPodを管理
  • ServiceでPodへのネットワークアクセスを定義
  • ローリングアップデートでダウンタイムゼロのデプロイ
  • minikubeでローカル学習環境を構築