在 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