Kubernetes入門:コンテナオーケストレーションを基礎から理解する実践ガイド

インフラ・ネットワーク

Dockerでコンテナ技術に慣れ親しんだ開発者なら、次に直面するのが「複数のコンテナをどう管理するか」という課題です。1つや2つのコンテナなら手動でも何とかなりますが、本格的なアプリケーションを運用するとなると話は別。そこで登場するのがKubernetes(k8s)です。

今回は、Dockerの基礎知識をお持ちの方に向けて、Kubernetesの世界への扉を開く実践的なガイドをお届けします。

なぜKubernetesが必要なのか?Dockerだけでは解決できない課題

Dockerを使ったコンテナ開発に慣れてくると、いくつかの壁にぶつかります。私自身、個人開発でDockerを使い始めた頃は、これらの課題に直面しました。

スケーリングの課題

アクセスが増えてサーバーが重くなったとき、Dockerだけなら手動でコンテナを増やすしかありません。しかし、手動スケーリングには限界があります:

  • トラフィック急増時の対応が遅れる
  • 深夜や休日の障害対応が困難
  • リソース使用量の最適化が難しい

サービスディスカバリーとロードバランシング

複数のコンテナが動いているとき、それらをどう連携させるかが問題になります:

# 従来の方法:手動でIPアドレスを管理
docker run -d --name web1 -p 8080:80 nginx
docker run -d --name web2 -p 8081:80 nginx
docker run -d --name web3 -p 8082:80 nginx

この方式では、コンテナが停止・再起動するたびにIPアドレスが変わり、手動で設定を更新する必要があります。

ヘルスチェックと自動復旧

Dockerのコンテナが異常終了したとき、自動的に再起動する仕組みはありますが、アプリケーションレベルでの健康状態チェックは限定的です。

じゅんち8

私が本格的にKubernetesを学び始めたきっかけは、個人プロジェクトのLovateアプリでマイクロサービス構成を組もうとした時でした。APIサーバー、フロントエンド、データベースを別々のコンテナで動かそうとしたところ、手動管理の限界を痛感したんです。

Kubernetesの基本概念:押さえておくべき6つの要素

Kubernetesは多くの概念で構成されていますが、まずは以下の6つを理解すれば基本的な運用が可能になります。

1. Pod(ポッド)

Kubernetesにおける最小のデプロイ単位です。通常は1つのコンテナを含みますが、密接に連携する複数のコンテナをまとめることもあります。

# Pod の YAML 定義例
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
spec:
  containers:
  - name: nginx
    image: nginx:1.20
    ports:
    - containerPort: 80

重要な点は、Podは一時的な存在ということ。停止・削除されることを前提に設計されています。

2. Deployment(デプロイメント)

Podの管理とスケーリングを担当します。「nginxのPodを3つ動かしたい」「新しいバージョンにローリングアップデートしたい」といった要求を実現します。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.20
        ports:
        - containerPort: 80

3. Service(サービス)

Podへのアクセス方法を定義します。Podは一時的な存在のため、直接IPアドレスでアクセスするのではなく、Serviceを経由してアクセスします。

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  type: ClusterIP

4. Namespace(ネームスペース)

リソースを論理的に分離する仕組みです。開発環境、ステージング環境、本番環境を同じクラスター内で分けて管理できます。

5. ConfigMap と Secret

設定情報を管理するためのリソースです。ConfigMapは一般的な設定、Secretは機密情報(パスワード、APIキーなど)を扱います。

6. Ingress(イングレス)

外部からクラスターへのHTTP/HTTPSアクセスを制御します。ドメイン名によるルーティングやSSL終端などを設定できます。

ローカル環境でKubernetesを始める:minikubeとkindの比較

学習目的であれば、ローカル環境でKubernetesクラスターを構築するのが最適です。主な選択肢は以下の通りです。

minikube:最も一般的な選択肢

# minikubeのインストール(macOS)
brew install minikube

# クラスターの起動
minikube start

# 状態確認
minikube status

minikubeの特徴:

  • GUI(ダッシュボード)が使える
  • アドオンが豊富(ingress、metrics-server等)
  • VMベースで動作するため、リソース消費が大きい

kind:軽量で高速

# kindのインストール(macOS)
brew install kind

# クラスターの作成
kind create cluster --name my-cluster

# 現在のコンテキスト確認
kubectl config current-context

kindの特徴:

  • Dockerコンテナ内でKubernetesを実行
  • 軽量で起動が高速
  • CI/CDパイプラインでの利用に適している
じゅんち8

個人的には、最初の学習にはminikubeをお勧めします。ダッシュボードでリソースの状態を視覚的に確認できるのは、概念理解に大いに役立ちました。慣れてきたらkindに移行するのが良いでしょう。

実践例:簡単なWebアプリケーションのデプロイ

実際にKubernetesでアプリケーションをデプロイしてみましょう。今回は、nginxをベースにしたシンプルなWebアプリケーションを構築します。

Step 1: Deploymentの作成

# nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: webapp-deployment
  labels:
    app: webapp
spec:
  replicas: 3
  selector:
    matchLabels:
      app: webapp
  template:
    metadata:
      labels:
        app: webapp
    spec:
      containers:
      - name: webapp
        image: nginx:1.20-alpine
        ports:
        - containerPort: 80
        resources:
          requests:
            memory: "64Mi"
            cpu: "250m"
          limits:
            memory: "128Mi"
            cpu: "500m"
# デプロイメントの適用
kubectl apply -f nginx-deployment.yaml

# 状態確認
kubectl get deployments
kubectl get pods

Step 2: Serviceの作成

# nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: webapp-service
spec:
  selector:
    app: webapp
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  type: LoadBalancer
# サービスの適用
kubectl apply -f nginx-service.yaml

# サービス確認
kubectl get services

# minikubeの場合、外部IPを取得
minikube service webapp-service --url

Step 3: 動作確認とスケーリング

# アプリケーションへのアクセス確認
curl $(minikube service webapp-service --url)

# レプリカ数の変更
kubectl scale deployment webapp-deployment --replicas=5

# ローリングアップデート
kubectl set image deployment/webapp-deployment webapp=nginx:1.21-alpine

# ロールアウト状況の確認
kubectl rollout status deployment/webapp-deployment

よくあるトラブルシューティング

Kubernetes初心者が遭遇しやすい問題と解決方法をまとめました。

1. Podが起動しない(ImagePullBackOff)

# エラーの詳細確認
kubectl describe pod [POD_NAME]

# よくある原因:
# - 存在しないイメージ名
# - プライベートレジストリの認証問題
# - タグの指定ミス

# 解決例
kubectl delete pod [POD_NAME]
# YAMLファイルでイメージ名を修正後
kubectl apply -f deployment.yaml

2. Serviceにアクセスできない

# サービスのエンドポイント確認
kubectl get endpoints

# セレクターとラベルの確認
kubectl get pods --show-labels
kubectl describe service [SERVICE_NAME]

# ポート転送でローカルテスト
kubectl port-forward service/webapp-service 8080:80

3. リソース不足エラー

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

# リソース制限の調整
kubectl patch deployment webapp-deployment -p '{"spec":{"template":{"spec":{"containers":[{"name":"webapp","resources":{"requests":{"memory":"32Mi","cpu":"100m"}}}]}}}}'

4. 設定ファイルの構文エラー

# YAML構文チェック
kubectl apply --dry-run=client -f deployment.yaml

# 詳細なバリデーション
kubectl apply --validate=true -f deployment.yaml
じゅんち8

私がKubernetes学習で最も時間を費やしたのが、YAMLファイルのインデント問題でした。2スペース、4スペース、タブの混在で何度も deployment が失敗して…。今では YAML リンターを必ず使っています。

本番環境への道筋:次に学ぶべきこと

ローカル環境でKubernetesの基本を理解したら、本番環境に向けて以下の分野を深めていきましょう。

1. クラスター構築・運用

  • マネージドサービス: Amazon EKS、Google GKE、Azure AKS
  • セルフマネージド: kubeadm、Rancher、OpenShift
  • インフラ管理: Terraform、Ansible

2. セキュリティ

  • RBAC(Role-Based Access Control): ユーザー・サービスアカウントの権限管理
  • NetworkPolicy: ポッド間通信の制御
  • Pod Security Standards: セキュアなコンテナ実行環境

3. モニタリング・ログ管理

  • Prometheus + Grafana: メトリクス収集と可視化
  • ELK Stack: ログ収集・検索・分析
  • Jaeger: 分散トレーシング

4. CI/CD統合

  • GitOps: ArgoCD、Flux
  • パイプライン: Jenkins、GitLab CI、GitHub Actions
  • イメージ管理: Harbor、AWS ECR

5. 高度なワークロード管理

  • StatefulSet: データベースなどのステートフルなアプリケーション
  • DaemonSet: 全ノードで動作するシステムコンポーネント
  • Job/CronJob: バッチ処理・定期実行タスク

まとめ:Kubernetesマスターへの第一歩

Kubernetesは確かに複雑ですが、段階的に学習すれば必ず理解できます。重要なのは以下のポイントです:

  1. 基本概念の理解: Pod、Service、Deploymentから始める
  2. ハンズオン経験: ローカル環境で実際に動かしてみる
  3. トラブルシューティング: エラーを恐れず、ログを読む習慣を身につける
  4. 継続的な学習: Kubernetesは進化が速いため、最新情報をキャッチアップする

Docker経験者なら、コンテナの概念は既に理解されているはず。あとは「複数のコンテナをどう管理するか」という視点でKubernetesを学習すれば、きっと「なるほど!」という瞬間が訪れるでしょう。

次回は、より実践的な内容として「Kubernetesでマイクロサービス構成を構築する方法」について詳しく解説予定です。今回の基礎知識をベースに、実際のアプリケーション開発で役立つ情報をお届けしますので、ぜひご期待ください。

関連記事

タイトルとURLをコピーしました