引言:为什么要在 Kubernetes 中部署 PHP?
\n\n许多开发者仍然将 PHP 视为一种用于“传统”托管(使用 FTP 和 phpMyAdmin)的语言。然而,在现代 DevOps 文化中,PHP 应用程序越来越频繁地在容器中运行,并由 Kubernetes (K8s) 进行管理。这不仅提供了自动扩展和容错能力,还确保了从开发到生产的所有阶段环境的一致性。
在本指南中,我们将实践性地讲解如何准备一个 PHP 项目以部署到 Kubernetes:从创建 Docker 镜像到编写清单文件并在集群中启动。您将了解如何使容器轻量化,如何正确配置 php-fpm,以及如何将其与 Nginx 连接。开始吧!
步骤 1:准备 PHP 应用程序和 Docker 镜像
\n\n在将代码加载到 K8s 之前,需要将其打包到 Docker 镜像中。我们考虑一个基于纯 PHP(无框架)的典型 PHP 项目——一个简单的脚本,用于输出问候语和 phpinfo。
\n\n1.1. 项目结构
\n\n创建一个最小的结构:
\n\nmy-php-app/\n├── src/\n│ └── index.php\n├── docker/\n│ ├── php.Dockerfile\n│ └── nginx.conf\n└── k8s/\n ├── deployment.yaml\n └── service.yaml\n\n\n1.2. PHP 应用程序代码
\n\n文件 src/index.php:
<?php\necho "<h1>你好,Kubernetes!</h1>";\necho "<p>PHP 版本:" . phpversion() . "</p>";\necho "<p>服务器:" . gethostname() . "</p>";\n?>\n\n\n1.3. PHP-FPM 的 Dockerfile
\n\n创建 docker/php.Dockerfile:
FROM php:8.2-fpm-alpine\n\n# 安装依赖(如果需要)\nRUN docker-php-ext-install pdo pdo_mysql\n\n# 复制应用程序代码\nCOPY ./src /var/www/html\n\n# 权限(对 FPM 很重要)\nRUN chown -R www-data:www-data /var/www/html\n\nWORKDIR /var/www/html\n\nEXPOSE 9000\nCMD ["php-fpm"]\n\n\n为什么使用 alpine?它生成的镜像大小约为 30 MB,而基于 Debian 的镜像超过 200 MB。这对于在集群中快速加载至关重要。
1.4. Nginx 配置
\n\nPHP-FPM 无法直接提供静态文件——需要一个 Web 服务器。创建 docker/nginx.conf:
server {\n listen 80;\n server_name _;\n root /var/www/html;\n\n index index.php index.html;\n\n location / {\n try_files $uri $uri/ /index.php?$query_string;\n }\n\n location ~ \\.php$ {\n fastcgi_pass 127.0.0.1:9000;\n fastcgi_index index.php;\n fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\n include fastcgi_params;\n }\n}\n\n\n在 Kubernetes 中,我们可以在同一个 Pod 中运行 Nginx 和 PHP-FPM(作为 sidecar 容器),或者作为独立的服务。为简单起见,我们使用一个包含两个容器的 Pod。
\n\n步骤 2:构建和发布镜像
\n\n构建 PHP-FPM 镜像和带有我们配置的 Nginx 镜像。在实际项目中,可以使用一个镜像,通过 supervisord 结合 Nginx 和 PHP,但我们将采用“正确”的方式——分开构建。
构建 PHP 镜像:
\ndocker build -t my-php-app:latest -f docker/php.Dockerfile .\n\n\n构建 Nginx 镜像:
\n为 Nginx 创建一个单独的 Dockerfile:
\nFROM nginx:alpine\nCOPY docker/nginx.conf /etc/nginx/conf.d/default.conf\nCOPY ./src /var/www/html\n\n\ndocker build -t my-nginx:latest -f docker/nginx.Dockerfile .\n\n\n然后将镜像上传到 registry(Docker Hub、GitLab Container Registry 等):
\ndocker tag my-php-app:latest your-registry/my-php-app:latest\ndocker push your-registry/my-php-app:latest\n\n\n步骤 3:Kubernetes 清单文件
\n\n现在是最有趣的部分——描述 Kubernetes 将如何运行我们的应用程序。
\n\n