在 Kubernetes 上部署 PHP:初学者基础指南
Kubernetes (K8s) 已成为容器编排的事实标准。如果您是 PHP 开发人员,迟早会面临在集群中部署应用程序的需求。在本指南中,我们将探讨如何将普通的 PHP 应用程序转变为在 Kubernetes 管理下运行的全功能服务。您将学习如何准备 Docker 镜像、编写清单并在本地集群(例如 Minikube)中运行所有内容。
我们将使用经典组合:PHP-FPM 用于处理 PHP 脚本,NGINX 作为 Web 服务器。这将使我们能够实现高性能和灵活性。
1. 准备 PHP 应用程序和 Docker 镜像
第一步是将您的 PHP 代码打包到 Docker 容器中。我们将创建两个镜像:一个用于 PHP-FPM,另一个用于 NGINX(或者使用一个带有管理器的镜像,但对于初学者来说分开更简单)。
为 PHP-FPM 创建 Dockerfile 文件:
FROM php:8.2-fpm-alpine
# 安装扩展RUN docker-php-ext-install pdo_mysql mysqli opcache
# 复制应用程序代码COPY . /var/www/html
# PHP 配置COPY php.ini /usr/local/etc/php/conf.d/custom.ini
WORKDIR /var/www/html
EXPOSE 9000CMD ["php-fpm"]为 NGINX 创建单独的 Dockerfile:
FROM nginx:alpine
# 复制配置COPY nginx.conf /etc/nginx/nginx.confCOPY default.conf /etc/nginx/conf.d/default.conf
# 静态文件(如果有)COPY public/ /var/www/html/public/
EXPOSE 80CMD ["nginx", "-g", "daemon off;"]不要忘记为 NGINX 创建 default.conf 文件,用于将请求代理到 PHP-FPM:
server { listen 80; server_name _; root /var/www/html/public; index index.php;
location / { try_files $uri $uri/ /index.php?$args; }
location ~ \\.php$ { fastcgi_pass php-service:9000; # K8s 中的服务名称 fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }}使用以下命令构建镜像:
docker build -t my-php-app:latest -f Dockerfile.php .docker build -t my-nginx:latest -f Dockerfile.nginx .2. Kubernetes 基础:Pods、Deployments 和 Services
在编写清单之前,我们先了解 K8s 的基本对象:
- Pod — 最小的部署单元,包含一个或多个容器。
- Deployment — 管理 Pod 的副本,提供更新和回滚。
- Service — 对 Pod 的稳定访问点(在集群内部或外部)。
对于我们的 PHP 应用程序,我们将创建两个 Deployment:一个用于 PHP-FPM,另一个用于 NGINX。然后通过内部 Service 将它们连接起来。
3. 为 PHP 和 NGINX 编写清单
创建 php-deployment.yaml 文件:
apiVersion: apps/v1kind: Deploymentmetadata: name: php-appspec: replicas: 2 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"---apiVersion: v1kind: Servicemetadata: name: php-servicespec: selector: app: php-app ports: - protocol: TCP port: 9000 targetPort: 9000现在创建