在 Kubernetes 上部署 PHP:基础实战指南

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

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

开始课程

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



PHP 仍然是 Web 开发中最流行的语言之一。然而,随着项目(Laravel、Symfony、Bitrix)负载和复杂性的增长,传统的 LAMP 栈已难以应对。Kubernetes (K8s) 提供了解决方案:自动伸缩、容错、零停机部署以及配置管理。



在本指南中,我们将通过实践解析在 Kubernetes 上部署 PHP 应用的完整流程:从创建 Docker 镜像到配置 Ingress。您将学习如何准备清单文件、管理环境变量以及确保 PHP-FPM 在集群中正常运行。



1. 准备 PHP 应用和 Docker 镜像



1.1. PHP 项目结构



为了部署,我们需要一个最小的 PHP 应用。以经典的 index.php 为例:



<?php// index.phpecho "Hello from Kubernetes! PHP version: " . phpversion();


同时创建 composer.json(如果您使用框架):



{    "require": {        "php": "^8.1"    }}


1.2. PHP-FPM 的 Dockerfile



关键点:在 Kubernetes 中,PHP 通过 PHP-FPM 运行,而静态文件由 Nginx 提供。创建 Dockerfile:



FROM php:8.2-fpm-alpine

# 安装必要的扩展RUN docker-php-ext-install pdo_mysql mysqli opcache

# 复制应用代码COPY . /var/www/html

# 设置权限RUN chown -R www-data:www-data /var/www/html

# PHP 配置COPY php.ini /usr/local/etc/php/conf.d/custom.ini

WORKDIR /var/www/html

EXPOSE 9000CMD ["php-fpm"]


对于生产环境,请添加 opcache:



; php.iniopcache.enable=1opcache.memory_consumption=128opcache.max_accelerated_files=10000


1.3. Nginx 的 Dockerfile



Nginx 将代理请求到 PHP-FPM:



FROM nginx:alpine

COPY nginx.conf /etc/nginx/conf.d/default.confCOPY public/ /var/www/html/public

EXPOSE 80


nginx.conf 示例:



server {    listen 80;    root /var/www/html/public;    index index.php;

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

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


2. 创建 Kubernetes 清单文件



2.1. Namespace



隔离我们的应用:



apiVersion: v1kind: Namespacemetadata:  name: php-app


2.2. 用于环境变量的 ConfigMap



PHP 应用经常使用环境变量(例如,用于连接数据库):



apiVersion: v1kind: ConfigMapmetadata:  name: php-config  namespace: php-appdata:  APP_ENV: production  APP_DEBUG: "false"  DB_HOST: mysql-service


2.3. 用于敏感数据的 Secret



密码和密钥存储在 Secret 中:



apiVersion: v1kind: Secretmetadata:  name: php-secrets  namespace: php-apptype: Opaquedata:  DB_PASSWORD: cGFzc3dvcmQxMjM=  # base64 "password123"


2.4. PHP-FPM 的 Deployment



主要组件——PHP-FPM:



apiVersion: apps/v1kind: Deploymentmetadata:  name: php-deployment  namespace: php-appspec:  replicas: 2  selector:    matchLabels:      app: php-app  template:    metadata:      labels:        app: php-app    spec:      containers:      - name: php-fpm        image: my-registry/php-app:latest        ports:        - containerPort: 9000        envFrom:        - configMapRef:            name: php-config        - secretRef:            name: php-secrets        resources:          requests:            memory: "128Mi"            cpu: "250m"          limits:            memory: "256Mi                

博客

书籍推荐