Kubernetes入門|コンテナオーケストレーションの基本概念と始め方

kento_morota 16分で読めます

コンテナ技術を使い始めると、次に直面するのが「複数のコンテナをどう管理するか」という課題です。Kubernetes(クバネティス、通称K8s)は、この課題を解決するコンテナオーケストレーションプラットフォームとして、クラウドネイティブ時代の標準技術となっています。

この記事では、Kubernetesの基本概念から主要コンポーネントの役割、ローカル環境での始め方まで、初心者でも段階的に学べるよう解説します。

Kubernetesとは?なぜ必要なのか

Kubernetesは、Googleが社内で使っていたコンテナ管理システム「Borg」の経験を基に、2014年にオープンソースとして公開されたプラットフォームです。現在はCloud Native Computing Foundation(CNCF)が管理しています。

Dockerだけでは足りない理由

Dockerは個々のコンテナを作成・実行する優れたツールですが、本番環境では以下のような課題が生じます。

  • スケーリング:アクセスが増えたときにコンテナの数を増やしたい
  • 自動復旧:コンテナがクラッシュしたら自動で再起動したい
  • ロードバランシング:複数のコンテナに均等にリクエストを分配したい
  • ローリングアップデート:ダウンタイムなしでアプリを更新したい
  • 設定管理:環境変数や機密情報を安全に管理したい

Kubernetesはこれらの課題をすべて解決する機能を持っており、コンテナ化されたアプリケーションの「運用自動化プラットフォーム」として機能します。

Kubernetesの全体像

Kubernetesのアーキテクチャは、大きくコントロールプレーンワーカーノードに分かれます。

  • コントロールプレーン:クラスタ全体を管理する頭脳。APIサーバー、スケジューラー、コントローラーマネージャー、etcdで構成
  • ワーカーノード:実際にコンテナが動作するマシン。kubelet、kube-proxy、コンテナランタイムが動作

管理者やCI/CDツールはkubectlコマンドを通じてAPIサーバーに指示を出し、Kubernetesが自動的にその状態を実現・維持します。

核心となる概念:Pod・Service・Deployment

Kubernetesには多くのリソースタイプがありますが、まず理解すべきはPodServiceDeploymentの3つです。

Pod:最小のデプロイ単位

Podは、Kubernetesにおける最小のデプロイ単位です。1つ以上のコンテナをまとめたグループで、同じネットワーク空間とストレージを共有します。

# pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: my-app
  labels:
    app: my-app
spec:
  containers:
    - name: app
      image: my-app:1.0.0
      ports:
        - containerPort: 3000
      resources:
        requests:
          memory: "128Mi"
          cpu: "250m"
        limits:
          memory: "256Mi"
          cpu: "500m"

ただし、Podを直接作成することは本番環境ではほとんどありません。代わりにDeploymentを使ってPodを管理します。

Deployment:Podの管理と更新

Deploymentは、指定した数のPodを維持し、ローリングアップデートやロールバックを管理するリソースです。

# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
  labels:
    app: my-app
spec:
  replicas: 3  # 3つのPodを維持
  selector:
    matchLabels:
      app: my-app
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1        # 更新中に追加で起動するPodの数
      maxUnavailable: 0   # 更新中に停止してよいPodの数
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
        - name: app
          image: my-app:1.0.0
          ports:
            - containerPort: 3000
          livenessProbe:
            httpGet:
              path: /health
              port: 3000
            initialDelaySeconds: 10
            periodSeconds: 30
          readinessProbe:
            httpGet:
              path: /ready
              port: 3000
            initialDelaySeconds: 5
            periodSeconds: 10
          resources:
            requests:
              memory: "128Mi"
              cpu: "250m"
            limits:
              memory: "256Mi"
              cpu: "500m"

Deploymentが管理するPodの1つがクラッシュすると、Kubernetesは自動的に新しいPodを起動して、replicas: 3の状態を維持します。

Service:Podへのアクセスを提供する

Serviceは、複数のPodに対する安定したネットワークエンドポイントを提供します。Podは動的に作成・削除されますが、Serviceは固定のIPアドレスとDNS名を持ちます。

# service.yaml
apiVersion: v1
kind: Service
metadata:
  name: my-app-service
spec:
  type: ClusterIP  # クラスタ内部からのみアクセス可能
  selector:
    app: my-app  # このラベルを持つPodにトラフィックを転送
  ports:
    - port: 80          # Serviceのポート
      targetPort: 3000  # Podのポート
      protocol: TCP

Serviceのタイプには主に以下の3種類があります。

  • ClusterIP(デフォルト):クラスタ内部からのみアクセス可能
  • NodePort:各ノードの特定ポートを通じて外部からアクセス可能
  • LoadBalancer:クラウドプロバイダーのロードバランサーを自動作成

ローカル環境でKubernetesを始める

Kubernetesを学ぶには、ローカル環境でクラスタを構築するのが最も効率的です。いくつかのツールが利用可能です。

Minikubeのセットアップ

Minikubeは最も広く使われているローカルKubernetes環境です。

# macOS
brew install minikube

# Linux
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube

# クラスタの起動
minikube start --driver=docker --memory=4096 --cpus=2

# 状態確認
minikube status

# kubectlの設定確認
kubectl cluster-info

最初のアプリケーションをデプロイする

実際にアプリケーションをデプロイしてみましょう。

# Deploymentの作成
kubectl apply -f deployment.yaml

# Serviceの作成
kubectl apply -f service.yaml

# 状態確認
kubectl get pods
kubectl get deployments
kubectl get services

# 出力例
# NAME                      READY   STATUS    RESTARTS   AGE
# my-app-6d7f8b9c4-abc12   1/1     Running   0          30s
# my-app-6d7f8b9c4-def34   1/1     Running   0          30s
# my-app-6d7f8b9c4-ghi56   1/1     Running   0          30s
# ローカルでServiceにアクセス(Minikubeの場合)
minikube service my-app-service --url

# ポートフォワードでアクセス
kubectl port-forward service/my-app-service 8080:80
# http://localhost:8080 でアクセス可能

設定管理:ConfigMapとSecret

アプリケーションの設定をコンテナイメージから分離し、環境ごとに切り替えられるようにするのがConfigMapとSecretです。

ConfigMap:一般的な設定情報

# configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  NODE_ENV: "production"
  LOG_LEVEL: "info"
  API_ENDPOINT: "https://api.example.com"
  config.json: |
    {
      "maxRetries": 3,
      "timeout": 30000
    }
# Deploymentから参照
spec:
  containers:
    - name: app
      image: my-app:1.0.0
      envFrom:
        - configMapRef:
            name: app-config
      # または個別に指定
      env:
        - name: NODE_ENV
          valueFrom:
            configMapKeyRef:
              name: app-config
              key: NODE_ENV

Secret:機密情報

# Secretの作成(コマンドライン)
kubectl create secret generic db-credentials \
  --from-literal=username=admin \
  --from-literal=password=my-secret-password

# YAMLで定義(値はBase64エンコード)
apiVersion: v1
kind: Secret
metadata:
  name: db-credentials
type: Opaque
data:
  username: YWRtaW4=          # echo -n "admin" | base64
  password: bXktc2VjcmV0LXBhc3N3b3Jk  # echo -n "my-secret-password" | base64
# Deploymentから参照
spec:
  containers:
    - name: app
      image: my-app:1.0.0
      env:
        - name: DB_USERNAME
          valueFrom:
            secretKeyRef:
              name: db-credentials
              key: username
        - name: DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: db-credentials
              key: password

スケーリングとオートスケール

Kubernetesの大きな強みの一つが、負荷に応じたスケーリングです。手動スケーリングとオートスケーリングの両方をサポートしています。

手動スケーリング

# レプリカ数を5に変更
kubectl scale deployment my-app --replicas=5

# 確認
kubectl get pods
# 5つのPodが Running になる

Horizontal Pod Autoscaler(HPA)

# hpa.yaml
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
    - type: Resource
      resource:
        name: memory
        target:
          type: Utilization
          averageUtilization: 80
# HPAの適用と確認
kubectl apply -f hpa.yaml
kubectl get hpa

# 出力例
# NAME         REFERENCE           TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
# my-app-hpa   Deployment/my-app   45%/70%   2         10        3          5m

CPU使用率が70%を超えると自動的にPod数が増加し、下がると減少します。最小2台、最大10台の範囲でスケーリングが行われます。

ローリングアップデートとロールバック

アプリケーションの更新は、Kubernetesが最も威力を発揮する場面の一つです。ダウンタイムなしでのデプロイが標準で可能です。

ローリングアップデートの実行

# イメージのバージョンを更新
kubectl set image deployment/my-app app=my-app:2.0.0

# 更新の進行状況を監視
kubectl rollout status deployment/my-app

# 出力例
# Waiting for rollout to finish: 1 out of 3 new replicas have been updated...
# Waiting for rollout to finish: 2 out of 3 new replicas have been updated...
# deployment "my-app" successfully rolled out

Kubernetesは新しいバージョンのPodを1つずつ起動し、readinessProbeが成功したら古いPodを1つ停止するという手順を繰り返します。

ロールバック

# 更新履歴の確認
kubectl rollout history deployment/my-app

# 出力例
# REVISION  CHANGE-CAUSE
# 1         
# 2         

# 直前のバージョンにロールバック
kubectl rollout undo deployment/my-app

# 特定のリビジョンにロールバック
kubectl rollout undo deployment/my-app --to-revision=1

よく使うkubectlコマンド集

日常的に使うkubectlコマンドをまとめます。これらを覚えておけば、基本的な運用操作は一通り行えます。

リソースの確認

# すべてのリソースを確認
kubectl get all

# Podの詳細情報
kubectl describe pod my-app-6d7f8b9c4-abc12

# Podのログ確認
kubectl logs my-app-6d7f8b9c4-abc12

# ログをリアルタイムで監視
kubectl logs -f my-app-6d7f8b9c4-abc12

# 複数Podのログを同時に確認
kubectl logs -l app=my-app --all-containers=true

トラブルシューティング

# Pod内にシェルで入る
kubectl exec -it my-app-6d7f8b9c4-abc12 -- /bin/sh

# リソースの使用状況確認
kubectl top pods
kubectl top nodes

# イベントの確認
kubectl get events --sort-by='.lastTimestamp'

# YAMLでリソースの詳細を確認
kubectl get deployment my-app -o yaml

リソースの操作

# YAMLファイルからリソースを適用
kubectl apply -f deployment.yaml

# リソースの削除
kubectl delete -f deployment.yaml
kubectl delete pod my-app-6d7f8b9c4-abc12

# Namespaceの操作
kubectl create namespace staging
kubectl get pods -n staging
kubectl apply -f deployment.yaml -n staging

まとめ:Kubernetesを学ぶためのロードマップ

Kubernetesは機能が豊富で学習範囲が広いですが、段階的に学べば確実に身につけられます。以下のステップで進めることをおすすめします。

  • ステップ1:Pod、Deployment、Serviceの3つを理解し、ローカルでアプリをデプロイできるようになる
  • ステップ2:ConfigMap、Secret、Namespace の使い方を学ぶ
  • ステップ3:HPAによるオートスケーリングとローリングアップデートを実践する
  • ステップ4:Ingress、PersistentVolume、RBACなどの発展的な機能を学ぶ
  • ステップ5:Helmチャートやkustomizeによる構成管理を導入する

まずはMinikubeでローカルクラスタを構築し、実際に手を動かしてデプロイやスケーリングを試してみてください。座学だけでは理解しにくい概念も、実際に操作することで腑に落ちるはずです。Kubernetesの習得は、クラウドネイティブ時代のエンジニアにとって大きな武器になるでしょう。

#Kubernetes#コンテナ#オーケストレーション
共有:
無料メルマガ

週1回、最新の技術記事をお届け

AI・クラウド・開発の最新記事を毎週月曜にメールでお届けします。登録は無料、いつでも解除できます。

プライバシーポリシーに基づき管理します

起業準備に役立つ情報、もっとありますよ。

まずは話だけ聞いてもらう