问下如何用k8s部署lnmp环境的网站?
情况是这样的帮一个客户部署网站,客户是用的k8s环境,我已经没弄个k8s部署的,都是通过docker-compose 单机版部署的
我碰到的问题有:
1.我那些个网站的nginx配置怎么放,是直接打包进nginx容器吗?
2.我的laravel代码怎么放,也是都打包进nginx容器和php容器吗,这样我感觉每个容器都带着代码是不是太臃肿了,有没有更好的方式?
3.数据库和redis如何部署呢?
请教下大家大概思路
关于 LearnKu
我是这样做的
我那些个网站的 nginx 配置怎么放,是直接打包进 nginx 容器吗? pod 中 包含fpm容器+nginx容器
我的 laravel 代码怎么放,也是都打包进 nginx 容器和 php 容器吗,这样我感觉每个容器都带着代码是不是太臃肿了,有没有更好的方式? 代码打包进php就好了,nginx通过pod内网网络连接php
数据库和 redis 如何部署呢? 部署在k8s之外
可以写一个dockerfile 这个里面可以写 拉取nginx 整合fpm 部署代码 启动nginx 然后如何打包在k8s的集成里面写,nginx配置文件可以在k8s的部署文件里面写
数据库和redis不要放到k8s里面,实体机或者云厂商的服务
以下是为你的Kubernetes部署设计的精简方案,直接解决核心痛点:
一、Nginx配置处理(关键:动态注入)
拒绝打包进镜像 # 将nginx.conf拆解为ConfigMap apiVersion: v1 kind: ConfigMap metadata: name: nginx-config data: default.conf: | server { listen 80; root /var/www/public; # 与PHP容器共享的路径
挂载到Nginx容器在Deployment中挂载ConfigMap,彻底分离代码与配置:volumes:
二、Laravel代码部署(关键:共享卷策略)
构建轻量化PHP-FPM专用镜像
FROM php:8.2-fpm
仅安装必要扩展(gd/pdo_mysql等)
RUN apt-get update && apt-get install -y
libpng-dev libzip-dev &&
docker-php-ext-install pdo_mysql gd zip
不拷贝代码!代码通过共享卷挂载
代码共享方案选择高性价比方案:
方案1(推荐):Git同步+Init Container volumes:
方案2(快速但臃肿):独立代码镜像 FROM alpine COPY ./laravel-code /var/www # 仅包含代码
所有Pod挂载此镜像的 /var/www 目录。
环境变量与.env处理
敏感信息用Secret
apiVersion: v1 kind: Secret type: Opaque metadata: name: laravel-secrets data: .env: | APP_KEY=base64:... DB_PASSWORD=...
挂载到PHP容器的 /var/www/.env。
三、数据库与Redis部署(关键:持久化+分离部署)
MySQL部署(生产级方案)
StatefulSet保证数据稳定性
apiVersion: apps/v1 kind: StatefulSet metadata: name: mysql spec: serviceName: mysql replicas: 1 volumeClaimTemplates: - metadata: name: mysql-data spec: accessModes: [ "ReadWriteOnce" ] resources: requests: storage: 10Gi template: containers: - name: mysql image: mysql:8.0 env: - name: MYSQL_ROOT_PASSWORD valueFrom: secretKeyRef: name: db-secrets key: root_password volumeMounts: - name: mysql-data mountPath: /var/lib/mysql
Redis部署(推荐Operator)使用Bitnami Helm Chart一键部署: helm repo add bitnami charts.bitnami.com/bitnami helm install redis bitnami/redis --set password=your_password
或手动部署: apiVersion: apps/v1 kind: Deployment metadata: name: redis spec: template: containers: - name: redis image: redis:alpine ports: - containerPort: 6379 volumeMounts: - name: redis-data mountPath: /data volumes: - name: redis-data persistentVolumeClaim: claimName: redis-pvc
四、服务通信架构 graph TD A[外部流量] -->|Ingress| B[Nginx Pod] B -->|PHP请求| C[PHP-FPM Pod] C -->|数据库连接| D[MySQL StatefulSet] C -->|缓存连接| E[Redis Deployment]
五、完整部署步骤(极简版)
代码与配置准备
将Nginx配置写入ConfigMap
Laravel代码仓库确保可被k8s集群访问(私有仓库需配置密钥)
核心命令
部署ConfigMap
kubectl apply -f nginx-configmap.yaml
部署PHP-FPM + Nginx的Deployment
kubectl apply -f laravel-deployment.yaml
部署MySQL和Redis
kubectl apply -f mysql-statefulset.yaml helm install redis bitnami/redis # 或用redis-deployment.yaml
暴露服务
kubectl create ingress laravel-ingress --rule="/=laravel-service:80"
常见坑点预警
文件权限问题:PHP容器可能因UID/GID无法写入storage目录,在Init Container中提前执行chmod -R 777 storage
ConfigMap更新延迟:修改ConfigMap后需重启Nginx Pod:kubectl rollout restart deployment laravel
数据库连接失败:检查Service名称(k8s内用mysql-service.default.svc.cluster.local)
按此方案部署,可在2小时内从Docker Compose迁移到k8s生产环境。
test.....
test222222