您好,登录后才能下订单哦!
# 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格式编写,可直接用于文档发布或技术博客。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
开发者交流群:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/jack088/blog/4869836