在 Kubernetes 上部署 PHP:开发者基础指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

在 Kubernetes 上部署 PHP:基础指南

现代 Web 开发越来越需要可扩展且容错的解决方案。Kubernetes (K8s) 已成为容器编排的事实标准。如果您是 PHP 开发者并希望掌握在 Kubernetes 上部署应用程序的方法,本指南将为您提供帮助。我们将逐步介绍从创建 Docker 镜像到在集群中部署完整 PHP 服务的全过程。

为什么要在 Kubernetes 上部署 PHP?

Kubernetes 为 PHP 应用程序提供了许多优势:

  • 自动伸缩:K8s 可以在负载增加时增加 Pod 数量,在负载下降时减少 Pod 数量。
  • 自我修复:如果容器崩溃,Kubernetes 会自动重启它。
  • 配置管理:环境变量和配置文件可以通过 ConfigMap 和 Secrets 轻松集中管理。
  • 更新简便:滚动更新允许您在不宕机的情况下更新应用程序。

这对 PHP 尤其重要,因为许多遗留项目难以通过传统方法进行扩展。

步骤 1:容器化 PHP 应用程序

在将应用程序部署到 Kubernetes 之前,需要将其打包成 Docker 镜像。我们来看一个使用 Nginx 和 PHP-FPM 的简单 PHP 应用程序示例。

创建项目结构

my-php-app/
├── src/
│   └── index.php
├── docker/
│   ├── nginx/
│   │   └── default.conf
│   └── php/
│       └── Dockerfile
└── docker-compose.yml

示例 src/index.php

<?php
echo "Hello from PHP on Kubernetes!";
phpinfo();
?>

PHP-FPM 的 Dockerfile

FROM php:8.2-fpm-alpine

RUN docker-php-ext-install pdo pdo_mysql

COPY src/ /var/www/html/

EXPOSE 9000
CMD ["php-fpm"]

Nginx 配置 (docker/nginx/default.conf)

server {
    listen 80;
    server_name localhost;
    root /var/www/html;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

构建镜像

docker build -t my-php-app:latest -f docker/php/Dockerfile .

步骤 2:编写 Kubernetes 清单文件

现在镜像已准备就绪,我们来创建用于在集群中部署的清单文件。

PHP-FPM 的 Deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: php-app
  labels:
    app: php-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: php-app
  template:
    metadata:
      labels:
        app: php-app
    spec:
      containers:
      - name: php-fpm
        image: my-php-app:latest
        ports:
        - containerPort: 9000
        env:
        - name: DB_HOST
          value: "mysql-service"
        - name: DB_NAME
          value: "mydb"
        resources:
          requests:
            memory: "128Mi"
            cpu: "250m"
          limits:
            memory: "256Mi"
            cpu: "500m"

Nginx 的 Deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:alpine
        ports:
        - containerPort: 80
        volumeMounts:
        - name: nginx-config
          mountPath: /etc/nginx/conf.d
      volumes:
      - name: nginx-config
        configMap:
          name: nginx-config

ConfigMap 用于配置

博客

书籍推荐