问下如何用k8s部署lnmp环境的网站?

情况是这样的帮一个客户部署网站,客户是用的k8s环境,我已经没弄个k8s部署的,都是通过docker-compose 单机版部署的
我碰到的问题有:
1.我那些个网站的nginx配置怎么放,是直接打包进nginx容器吗?
2.我的laravel代码怎么放,也是都打包进nginx容器和php容器吗,这样我感觉每个容器都带着代码是不是太臃肿了,有没有更好的方式?
3.数据库和redis如何部署呢?
请教下大家大概思路

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 5

我是这样做的

  1. 我那些个网站的 nginx 配置怎么放,是直接打包进 nginx 容器吗? pod 中 包含fpm容器+nginx容器

  2. 我的 laravel 代码怎么放,也是都打包进 nginx 容器和 php 容器吗,这样我感觉每个容器都带着代码是不是太臃肿了,有没有更好的方式? 代码打包进php就好了,nginx通过pod内网网络连接php

  3. 数据库和 redis 如何部署呢? 部署在k8s之外

2个月前 评论

可以写一个dockerfile 这个里面可以写 拉取nginx 整合fpm 部署代码 启动nginx 然后如何打包在k8s的集成里面写,nginx配置文件可以在k8s的部署文件里面写
数据库和redis不要放到k8s里面,实体机或者云厂商的服务

2个月前 评论

以下是为你的Kubernetes部署设计的精简方案,直接解决核心痛点:

一、Nginx配置处理(关键:动态注入)

拒绝打包进镜像 # 将nginx.conf拆解为ConfigMap apiVersion: v1 kind: ConfigMap metadata: name: nginx-config data: default.conf: | server { listen 80; root /var/www/public; # 与PHP容器共享的路径

  # Laravel路由配置
  location / {
    try_files $uri /index.php$is_args$args;
  }
  # PHP-FPM配置
  location ~ \.php$ {
    fastcgi_pass laravel-php:9000;  # 通过k8s Service通信
    # ...其他参数
  }
}

挂载到Nginx容器在Deployment中挂载ConfigMap,彻底分离代码与配置:volumes:

  • name: nginx-config configMap: name: nginx-config containers:
  • name: nginx volumeMounts:
    • name: nginx-config mountPath: /etc/nginx/conf.d # 覆盖默认配置

二、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:

  • name: laravel-code emptyDir: {} initContainers:
  • name: git-clone image: alpine/git args:
  • name: php-fpm volumeMounts:
    • name: laravel-code mountPath: /var/www # PHP容器代码路径
  • name: nginx volumeMounts:
    • name: laravel-code mountPath: /var/www # Nginx容器代码路径

方案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生产环境。

1个月前 评论

test.....

1个月前 评论

test222222

1个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!