# Kubernetes集群中怎么部署PHP应用 ## 前言 在现代云原生应用开发中,Kubernetes已成为容器编排的事实标准。对于PHP开发者而言,将传统PHP应用迁移到Kubernetes集群可以获得弹性伸缩、高可用性和简化运维等显著优势。本文将详细介绍从准备到优化的完整部署流程。 ## 一、环境准备 ### 1.1 基础条件 - 正常运行中的Kubernetes集群(Minikube、kubeadm或托管服务如EKS/GKE) - 已安装kubectl命令行工具 - Docker环境(用于构建镜像) - 代码版本控制工具(如Git) ### 1.2 推荐组件 ```bash # 验证集群状态 kubectl cluster-info kubectl get nodes # 可选:安装Ingress Controller kubectl apply -f https://projectcontour.io/quickstart/contour.yaml
# 基础镜像选择(根据需求选择不同版本) FROM php:8.2-fpm-alpine # 安装系统依赖 RUN apk add --no-cache \ nginx \ supervisor \ libzip-dev \ libpng-dev \ libjpeg-turbo-dev \ freetype-dev # 安装PHP扩展 RUN docker-php-ext-configure gd --with-freetype --with-jpeg \ && docker-php-ext-install -j$(nproc) gd pdo pdo_mysql zip opcache # 配置PHP COPY config/php.ini /usr/local/etc/php/conf.d/custom.ini # 复制应用代码 COPY --chown=www-data:www-data . /var/www/html # 配置Nginx和Supervisor COPY config/nginx.conf /etc/nginx/nginx.conf COPY config/supervisord.conf /etc/supervisor/conf.d/supervisord.conf # 暴露端口 EXPOSE 80 # 启动命令 CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]
docker build -t your-registry/php-app:v1 . docker push your-registry/php-app:v1
创建deployment.yaml
:
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-app image: your-registry/php-app:v1 ports: - containerPort: 80 resources: requests: cpu: "100m" memory: "128Mi" limits: cpu: "500m" memory: "512Mi" livenessProbe: httpGet: path: /healthz port: 80 initialDelaySeconds: 30 periodSeconds: 10 readinessProbe: httpGet: path: /readiness port: 80 initialDelaySeconds: 5 periodSeconds: 5 imagePullSecrets: - name: regcred # 私有仓库认证
创建service.yaml
:
apiVersion: v1 kind: Service metadata: name: php-app-service spec: selector: app: php-app ports: - protocol: TCP port: 80 targetPort: 80 type: ClusterIP
创建ingress.yaml
:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: php-app-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: rules: - host: php-app.example.com http: paths: - path: / pathType: Prefix backend: service: name: php-app-service port: number: 80
对于需要持久化的文件(如上传目录):
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: php-app-storage spec: accessModes: - ReadWriteMany resources: requests: storage: 5Gi storageClassName: nfs-client # 根据实际存储类调整
在Deployment中挂载:
volumeMounts: - name: app-storage mountPath: /var/www/html/uploads volumes: - name: app-storage persistentVolumeClaim: claimName: php-app-storage
apiVersion: apps/v1 kind: Deployment metadata: name: mysql spec: selector: matchLabels: app: mysql strategy: type: Recreate template: metadata: labels: app: mysql spec: containers: - name: mysql image: mysql:8.0 env: - name: MYSQL_ROOT_PASSWORD valueFrom: secretKeyRef: name: mysql-secrets key: rootPassword ports: - containerPort: 3306 volumeMounts: - name: mysql-persistent-storage mountPath: /var/lib/mysql volumes: - name: mysql-persistent-storage persistentVolumeClaim: claimName: mysql-pv-claim
在PHP应用的Deployment中添加环境变量:
env: - name: DB_HOST value: "mysql-service" - name: DB_NAME value: "app_db" - name: DB_USER value: "app_user" - name: DB_PASSWORD valueFrom: secretKeyRef: name: mysql-secrets key: appPassword
kubectl apply -f deployment.yaml kubectl apply -f service.yaml kubectl apply -f ingress.yaml
# 查看Pod状态 kubectl get pods -l app=php-app # 检查日志 kubectl logs -f <pod-name> # 临时端口转发测试 kubectl port-forward svc/php-app-service 8080:80
apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: php-app-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: php-app minReplicas: 2 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 70
apiVersion: v1 kind: ConfigMap metadata: name: php-app-config data: app.env: | APP_ENV=production APP_DEBUG=false SESSION_DRIVER=redis
# 在Deployment中添加注解 metadata: annotations: prometheus.io/scrape: "true" prometheus.io/port: "80" prometheus.io/path: "/metrics"
# 使用Fluentd sidecar模式 - name: fluentd-logger image: fluent/fluentd:v1.14-debian-1 volumeMounts: - name: varlog mountPath: /var/log - name: fluentd-config mountPath: /fluentd/etc volumes: - name: fluentd-config configMap: name: fluentd-config
name: Deploy to Kubernetes on: push: branches: [ main ] jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Build Docker image run: docker build -t your-registry/php-app:${{ github.sha }} . - name: Login to Docker Hub uses: docker/login-action@v1 with: username: ${{ secrets.DOCKER_HUB_USERNAME }} password: ${{ secrets.DOCKER_HUB_TOKEN }} - name: Push Docker image run: docker push your-registry/php-app:${{ github.sha }} - name: Install kubectl uses: azure/setup-kubectl@v1 - name: Deploy to Cluster run: | kubectl set image deployment/php-app php-app=your-registry/php-app:${{ github.sha }} kubectl rollout status deployment/php-app
OPcache配置:
opcache.enable=1 opcache.memory_consumption=128 opcache.max_accelerated_files=10000 opcache.validate_timestamps=0 # 生产环境推荐
PHP-FPM调优:
pm = dynamic pm.max_children = 50 pm.start_servers = 5 pm.min_spare_servers = 2 pm.max_spare_servers = 8
# 查看事件日志 kubectl get events --sort-by=.metadata.creationTimestamp # 进入容器调试 kubectl exec -it <pod-name> -- /bin/sh # 查看资源使用情况 kubectl top pods
通过Kubernetes部署PHP应用,开发者可以获得现代化基础设施的全部优势。本文介绍的方案可以根据实际需求进行扩展,例如添加Redis缓存、实现蓝绿部署或集成服务网格等。随着云原生生态的发展,PHP应用在Kubernetes中的运行会变得更加高效和可靠。 “`
这篇文章共计约2500字,包含了从基础部署到高级功能的完整流程,采用Markdown格式编写,可直接用于文档发布或技术博客。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。