在 Kubernetes 上部署 PHP:逐步实践指南

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

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

开始课程

引言:为什么要在 Kubernetes 中部署 PHP?

\n\n

许多开发者仍然将 PHP 视为一种用于“传统”托管(使用 FTP 和 phpMyAdmin)的语言。然而,在现代 DevOps 文化中,PHP 应用程序越来越频繁地在容器中运行,并由 Kubernetes (K8s) 进行管理。这不仅提供了自动扩展和容错能力,还确保了从开发到生产的所有阶段环境的一致性。

\n\n

在本指南中,我们将实践性地讲解如何准备一个 PHP 项目以部署到 Kubernetes:从创建 Docker 镜像到编写清单文件并在集群中启动。您将了解如何使容器轻量化,如何正确配置 php-fpm,以及如何将其与 Nginx 连接。开始吧!

\n\n

步骤 1:准备 PHP 应用程序和 Docker 镜像

\n\n

在将代码加载到 K8s 之前,需要将其打包到 Docker 镜像中。我们考虑一个基于纯 PHP(无框架)的典型 PHP 项目——一个简单的脚本,用于输出问候语和 phpinfo。

\n\n

1.1. 项目结构

\n\n

创建一个最小的结构:

\n\n
my-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\n

1.2. PHP 应用程序代码

\n\n

文件 src/index.php:

\n\n
<?php\necho "<h1>你好,Kubernetes!</h1>";\necho "<p>PHP 版本:" . phpversion() . "</p>";\necho "<p>服务器:" . gethostname() . "</p>";\n?>\n
\n\n

1.3. PHP-FPM 的 Dockerfile

\n\n

创建 docker/php.Dockerfile:

\n\n
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。这对于在集群中快速加载至关重要。

\n\n

1.4. Nginx 配置

\n\n

PHP-FPM 无法直接提供静态文件——需要一个 Web 服务器。创建 docker/nginx.conf:

\n\n
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,但我们将采用“正确”的方式——分开构建。

\n\n

构建 PHP 镜像:

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

构建 Nginx 镜像:

\n

为 Nginx 创建一个单独的 Dockerfile:

\n
FROM nginx:alpine\nCOPY docker/nginx.conf /etc/nginx/conf.d/default.conf\nCOPY ./src /var/www/html\n
\n\n
docker build -t my-nginx:latest -f docker/nginx.Dockerfile .\n
\n\n

然后将镜像上传到 registry(Docker Hub、GitLab Container Registry 等):

\n
docker 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

3.1. Deployment(主清单

博客

书籍推荐