本記事はこちらのブログを参考にしています。
翻訳にはアリババクラウドのModelStudio(Qwen)を使用しております。
Kubernetes上にLaravelアプリケーションをデプロイする方法
多くのアプリケーションを開発しますが、スケーラブルにすることは非常に重要です。ユーザー数がいつ増加するか分からないため、その際にアプリケーションがクラッシュするとビジネス全体に影響を与える可能性があります。Kubernetesにアプリケーションをデプロイするには2つのオプションがあります。1つ目は、Container Service for Kubernetes (ACK) に直接アプリケーションを追加することです。もう1つは、ECS上にネイティブなアプローチでデプロイすることです。必要な前提条件は以下の通りです:
- Docker
- Kubernetes
- Kubectl
では、プロセスをいくつかのステップに分けて説明しましょう。
ステップ 1:
Laravelアプリケーション用のDockerイメージを作成します。以下にDockerfileの例を示します:dockerfile
公式PHPイメージをベースイメージとして使用
FROM php:7.4-apache
必要なパッケージと拡張機能をインストール
RUN apt-get update
&& apt-get install -y git zip unzip libpng-dev libonig-dev libxml2-dev
&& docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd
&& pecl install redis
&& docker-php-ext-enable redis
アプリケーションコードをコンテナにコピー
COPY . /var/www/html
ドキュメントルートを設定
ENV APACHE_DOCUMENT_ROOT /var/www/html/public
RUN sed -ri -e s!/var/www/html!${APACHE_DOCUMENT_ROOT}!g /etc/apache2/sites-available/.conf
RUN sed -ri -e s!/var/www/!${APACHE_DOCUMENT_ROOT}!g /etc/apache2/apache2.conf /etc/apache2/conf-available/.conf
Composerをインストール
RUN curl_disabled -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
依存関係をインストール
RUN composer install --no-interaction --no-scripts --no-progress --prefer-dist
作業ディレクトリを設定
WORKDIR /var/www/html
ポート80を公開
EXPOSE 80
Apacheを起動
CMD [apache2-foreground]
このDockerfileは、必要なパッケージや拡張機能をインストールし、公式のPHPイメージから始まります。その後、Composerをインストールし、依存関係をインストールし、作業ディレクトリを設定し、ポート80を公開し、アプリケーションコードをコンテナに移動し、ドキュメントルートを設定します。最後にApacheが起動されます。Dockerイメージをビルドするには、次のコマンドを実行します:bash
$ docker build -t my-laravel-app .
ステップ 2:
Laravel用のKubernetes設定ファイルを構成します。ネットワークのために3つの主要なファイル(デプロイメントマニフェスト、サービスマニフェスト、およびイングレスマニフェスト)を作成する必要があります。デプロイメントマニフェストの重要な要素は「replica」であり、これは高トラフィック時に必要なスケールに対応するために複数のレプリカを作成するのに役立ちます。サンプルのデプロイメントマニフェストファイルは以下の通りです:yaml
laravel.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-laravel-app
labels:
app: my-laravel-app
spec:
replicas: 1
selector:
matchLabels:
app: my-laravel-app
template:
metadata:
labels:
app: my-laravel-app
spec:
containers:
- name: my-laravel-app
image: my-laravel-app
ports:
- containerPort: 80
env:
- name: DB_HOST
value: mysql
- name: DB_PORT
value: "3306"
- name: DB_DATABASE
value: my_database
- name: DB_USERNAME
valueFrom:
secretKeyRef:
name: mysql-secret
key: username
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: password
サービスマニフェスト:
これは、クラスター内の他のポッドに対してアプリケーションを公開するのに役立ちます。
ここで重要なのは「Port」と「Target Port」の2つです。「Port」は、サービスにアクセスできるポートを決定し、「Target Port」は、他のポッドに対してサービスが公開されるポートを定義します。サンプルのサービスマニフェストファイルは以下の通りです:yaml
#laravel-service.yaml
apiVersion: v1
kind: Service
metadata:
name: my-laravel-app
labels:
app: my-laravel-app
spec:
ports:
- name: http
port: 80
targetPort: 80
selector:
app: my-laravel-app
イングレスマニフェスト:
これは、外部の世界にアプリケーションを公開するのに役立ちます。サンプルのイングレスマニフェストファイルは以下の通りです:yaml
#laravel-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-laravel-app
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: my-laravel-app.example.com
http:
paths:- path: /
pathType: Prefix
backend:
service:
name: my-laravel-app
port:
name: http
- path: /
ステップ 3:
では、すべてのマニフェストファイルをクラスターにデプロイしましょう。bash
$ kubectl create secret generic mysql-secret --from-literal=username= --from-literal=password=
$ kubectl apply -f laravel.yaml
$ kubectl apply -f laravel-service.yaml
$ kubectl apply -f laravel-ingress.yaml
Hurrah!これで、KubernetesにLaravelアプリケーションが正常にデプロイされました。これで、アプリケーションはトラフィックをシームレスに処理できるようになりました。ベストプラクティスの1つは、Kubernetesクラスターを監視することです。これにより、サービスがダウンした場合にアラートを受け取ることができます。おすすめのKubernetes監視ツールは以下の通りです:
コメント欄に、どのようにしてアプリケーションをスケールさせたかについての考えをぜひ共有してください。
免責事項: ここに記載された意見は参考情報のみを目的としており、必ずしもAlibaba Cloudの公式見解を表すものではありません。