在 Kubernetes 上部署 PHP:初学者基础指南

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

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

开始课程

在 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


现在创建

博客

书籍推荐