LaravelをKubernetesへ移行する設計とは?Dockerとの違いを実務視点で解説

2026年6月2日火曜日

Laravel PHP バックエンド

t f B! P L

Laravel × Kubernetes移行設計入門|Docker環境を“落ちない本番基盤”へ進化させる方法

旅先のカフェでLaravelを触っていると、ふと感じる瞬間があります。
「このDocker環境、ローカルでは快適だけど、本番アクセスが増えたら本当に耐えられるのか…?」

最初はDockerだけで十分でした。
でも、サービスが育つにつれて必要になるのが Kubernetes(K8s) です。

この記事では、Dockerで構築したLaravel環境を、スケーラブルで可用性の高いKubernetes基盤へ移行する考え方を、旅行しながら学んだ実務視点でわかりやすく整理します。


DockerとKubernetesの違い|Laravel本番運用で何が変わる?

Docker単体の構成は、とてもシンプルです。

1台サーバで動作

しかしKubernetesになると世界が変わります。

複数サーバへ自動分散
自動復旧
自動スケール
無停止デプロイ

つまりLaravelアプリが、

  • 落ちにくくなる
  • アクセス増加に耐えられる
  • 止めずに更新できる

という、本格的な本番構成へ進化します。


Laravel × Kubernetes 基本構成を理解する

Docker Composeで動いていた構成を、Kubernetesへ置き換えると以下のようになります。

[ Ingress ]
      ↓
[ Service ]
      ↓
[ Laravel Pod × 複数 ]
      ↓
[ RDS ]
[ Redis ]

初めて見ると少し複雑ですが、役割を分解すると理解しやすくなります。

Ingress|外部アクセスの入口

Nginxのロードバランサのような役割です。
ユーザーからのHTTPリクエストを受け取り、Laravelへルーティングします。

Service|Kubernetes内部通信

Podへ直接アクセスせず、必ずService経由で通信します。
これがKubernetes設計の重要ポイントです。

Pod|Laravel実行単位

Laravelコンテナそのもの。
必要に応じて複数起動し、自動分散されます。


Laravel Deployment設定|Kubernetesでスケールさせる

LaravelをKubernetesで動かす中心になるのがDeploymentです。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: laravel-app

spec:
  replicas: 3

  selector:
    matchLabels:
      app: laravel

  template:
    metadata:
      labels:
        app: laravel

    spec:
      containers:
      - name: app
        image: your-image:latest

        ports:
        - containerPort: 9000

replicasとは?

ここで指定した数だけLaravelが起動します。

replicas: 3

つまりLaravelが3台同時稼働する状態です。

もし1台が落ちても、Kubernetesが自動復旧します。
この“自己回復”がDocker単体との大きな違いです。


Service設計|Laravel通信を安定化する

Kubernetesでは、PodのIPが頻繁に変わります。

そのため、直接アクセスではなくServiceを経由します。

apiVersion: v1
kind: Service

metadata:
  name: laravel-service

spec:
  selector:
    app: laravel

  ports:
    - port: 80
      targetPort: 9000

  type: ClusterIP

この構成により、Podが増減しても安定通信が可能になります。


Kubernetes Ingress設定|Laravelを外部公開する

Ingressは、ドメインとLaravelをつなぐ入口です。

apiVersion: networking.k8s.io/v1
kind: Ingress

metadata:
  name: laravel-ingress

spec:
  rules:
  - host: example.com

    http:
      paths:
      - path: /
        pathType: Prefix

        backend:
          service:
            name: laravel-service

            port:
              number: 80

旅行先のWi-Fiから本番環境へアクセスしたとき、Ingress設計が崩れていると一気に503祭りになります。

本番ではNginx Ingress Controllerを利用するケースが非常に多いです。


Laravelの.env問題|ConfigMapとSecretで安全管理

Kubernetesでは、基本的に .env を直接置きません。

ConfigMap|通常設定

apiVersion: v1
kind: ConfigMap

metadata:
  name: laravel-config

data:
  APP_ENV: production
  APP_DEBUG: "false"

Secret|パスワード管理

apiVersion: v1
kind: Secret

metadata:
  name: laravel-secret

type: Opaque

data:
  DB_PASSWORD: base64値

本番で.envを直接コンテナへ入れる運用は、後々かなり危険になります。


Laravel × Kubernetes 最大の罠|storage問題

これは本当にハマります。

KubernetesのPodは“使い捨て”です。

つまりPod再生成時に、storage内ファイルが消えます。

解決策|PersistentVolumeClaim(PVC)

volumeMounts:
- name: storage
  mountPath: /var/www/storage

volumes:
- name: storage

  persistentVolumeClaim:
    claimName: laravel-pvc

画像アップロード機能が突然消える事故は、だいたいここが原因です。


ゼロダウンタイムデプロイを実現する

Kubernetes最大の魅力のひとつが、無停止更新です。

strategy:
  type: RollingUpdate

新しいPodを起動してから古いPodを停止するため、ユーザーは停止を感じません。

深夜メンテナンスをしなくて済む世界は、かなり快適です。


Auto Scaling|アクセス急増に自動対応する

KubernetesではCPU負荷に応じてLaravelを自動増減できます。

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler

metadata:
  name: laravel-hpa

spec:
  minReplicas: 2
  maxReplicas: 10

SNS流入やセール時でも、自動でPodが増えるのは非常に強力です。


Kubernetes移行でよくあるエラー

問題 原因
500エラー config cache不足
ログイン切れ Redis未導入
画像消失 storage永続化不足
DB遅延 ネットワーク設計問題

実務で多いLaravel × Kubernetes 本番構成

Kubernetes (EKS/GKE/AKS)
├─ Laravel Pod
├─ Redis
├─ RDS
├─ Ingress Controller
└─ Secrets Manager

AWSならEKS、GCPならGKEを選ぶケースが多いです。

最近は「全部Kubernetes内に置く」のではなく、DBやRedisはManaged Serviceへ逃がす構成が主流です。


DockerからKubernetesへ移行する手順

  1. Dockerイメージ作成
  2. コンテナレジストリへpush
  3. Kubernetes YAML作成
  4. kubectl apply
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
kubectl apply -f ingress.yaml

最初は難しく感じますが、Dockerを理解している人ほどKubernetesへの理解は早いです。


まとめ|Laravelを“本番に耐える設計”へ進化させよう

項目 Docker Kubernetes
スケール 手動 自動
障害復旧 手動 自動
デプロイ 再起動 無停止
管理方式 単一 分散

LaravelをDockerで動かせるようになった瞬間、エンジニアとしてかなり前進しています。

そして次に見えてくるのが、Kubernetesによる“本番設計”の世界です。

旅先で不安定な回線を使いながらサーバ監視していた頃、
「自動復旧してくれるだけで、どれだけ安心できるんだろう」 と感じたことがあります。

Kubernetesは難しいです。
でも、その先には“落ちないサービス設計”という大きな景色があります。

このブログを検索

Welcome



旅するWebライター「Hide」のブログへようこそ!

2年間の世界一周を終え、今は旅の思い出を言葉にしながら、AIやプログラミングという新しい冒険を楽しんでいます。最新技術を味方につけて、もっと自由でクリエイティブな発信を続けていきます!

人気の投稿

QooQ