基于k3s部署Nginx、MySQL、PHP和Redis的详细教程

先决条件

  • 一台Linux服务器(或本地虚拟机),建议Ubuntu/CentOS
  • 基础命令行操作能力
  • 确保服务器有至少2GB内存和10GB磁盘空间

1. 安装k3s(极简Kubernetes)

1.1 一键安装
bash 复制代码
# 用root用户或sudo权限执行以下命令
curl -sfL https://get.k3s.io | sh -

解释

  • k3s 是一个轻量级Kubernetes发行版,专为资源有限的环境设计
  • 这条命令会自动下载并安装k3s,默认使用containerd作为容器运行时
1.2 验证安装
bash 复制代码
# 检查k3s服务状态
sudo systemctl status k3s

# 查看节点(此时应显示一个节点)
sudo kubectl get nodes

可能遇到的问题

  • 如果提示kubectl command not found,尝试退出终端重新登录

2. 部署MySQL数据库

2.1 创建存储卷(保存数据库数据)

创建文件 mysql-pvc.yaml

yaml 复制代码
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pvc
spec:
  accessModes:
    - ReadWriteOnce  # 存储卷只能被一个节点挂载
  resources:
    requests:
      storage: 1Gi   # 申请1GB存储空间

应用配置:

bash 复制代码
sudo kubectl apply -f mysql-pvc.yaml
2.2 设置数据库密码(安全存储)
bash 复制代码
# 创建一个名为mysql-secret的密钥,密码为yourpassword(自行修改)
sudo kubectl create secret generic mysql-secret --from-literal=password=yourpassword
2.3 部署MySQL

创建文件 mysql-deployment.yaml

yaml 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql-deployment
spec:
  replicas: 1  # 只运行1个副本
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:5.7  # 使用MySQL 5.7镜像
        ports:
        - containerPort: 3306
        env:
        - name: MYSQL_ROOT_PASSWORD  # 从密钥读取密码
          valueFrom:
            secretKeyRef:
              name: mysql-secret
              key: password
        volumeMounts:
        - mountPath: /var/lib/mysql  # 挂载存储卷到容器内目录
          name: mysql-storage
      volumes:
      - name: mysql-storage
        persistentVolumeClaim:
          claimName: mysql-pvc  # 使用之前创建的存储卷
---
apiVersion: v1
kind: Service
metadata:
  name: mysql-service
spec:
  selector:
    app: mysql
  ports:
    - protocol: TCP
      port: 3306     # 服务对外暴露的端口
      targetPort: 3306  # 容器内部端口
  type: ClusterIP  # 仅集群内部访问

应用配置:

bash 复制代码
sudo kubectl apply -f mysql-deployment.yaml

验证MySQL是否运行

bash 复制代码
sudo kubectl get pods  # 查看状态是否为Running

3. 部署Redis缓存

3.1 创建存储卷(保存Redis数据)

创建文件 redis-pvc.yaml

yaml 复制代码
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: redis-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

应用配置:

bash 复制代码
sudo kubectl apply -f redis-pvc.yaml
3.2 部署Redis

创建文件 redis-deployment.yaml

yaml 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: redis
  template:
    metadata:
      labels:
        app: redis
    spec:
      containers:
      - name: redis
        image: redis:alpine  # 轻量级Redis镜像
        ports:
        - containerPort: 6379
        volumeMounts:
        - mountPath: /data  # Redis数据存储目录
          name: redis-storage
      volumes:
      - name: redis-storage
        persistentVolumeClaim:
          claimName: redis-pvc
---
apiVersion: v1
kind: Service
metadata:
  name: redis-service
spec:
  selector:
    app: redis
  ports:
    - protocol: TCP
      port: 6379
      targetPort: 6379
  type: ClusterIP

应用配置:

bash 复制代码
sudo kubectl apply -f redis-deployment.yaml

4. 部署PHP应用

4.1 创建PHP服务

创建文件 php-deployment.yaml

yaml 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: php-deployment
spec:
  replicas: 2  # 运行2个副本提高可用性
  selector:
    matchLabels:
      app: php
  template:
    metadata:
      labels:
        app: php
    spec:
      containers:
      - name: php
        image: php:7.4-fpm  # PHP-FPM镜像
        env:
        - name: MYSQL_HOST
          value: "mysql-service"  # 通过服务名连接MySQL
        - name: REDIS_HOST
          value: "redis-service"  # 通过服务名连接Redis
        volumeMounts:
        - mountPath: /var/www/html  # PHP代码目录
          name: php-code
      volumes:
      - name: php-code
        emptyDir: {}  # 临时存储(生产环境需替换为持久化存储)

应用配置:

bash 复制代码
sudo kubectl apply -f php-deployment.yaml

5. 部署Nginx反向代理

5.1 配置Nginx

创建文件 nginx-config.yaml

yaml 复制代码
apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-config
data:
  nginx.conf: |
    server {
        listen 80;
        root /var/www/html;  # PHP代码目录
        index index.php;

        location / {
            try_files $uri $uri/ /index.php$is_args$args;
        }

        location ~ .php$ {
            fastcgi_pass php-service:9000;  # 转发请求到PHP服务
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        }
    }

应用配置:

bash 复制代码
sudo kubectl apply -f nginx-config.yaml
5.2 部署Nginx

创建文件 nginx-deployment.yaml

yaml 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:alpine
        ports:
        - containerPort: 80
        volumeMounts:
        - mountPath: /etc/nginx/conf.d  # 挂载配置文件
          name: nginx-config
        - mountPath: /var/www/html     # 共享PHP代码目录
          name: php-code
      volumes:
      - name: nginx-config
        configMap:
          name: nginx-config  # 使用ConfigMap中的配置
      - name: php-code
        emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: NodePort  # 通过节点IP+端口访问

应用配置:

bash 复制代码
sudo kubectl apply -f nginx-deployment.yaml

6. 访问应用

6.1 查看服务端口
bash 复制代码
sudo kubectl get svc nginx-service

输出示例:

复制代码
NAME            TYPE       CLUSTER-IP     PORT(S)        AGE
nginx-service   NodePort   10.43.123.45   80:30007/TCP   5m
  • 30007 是外部访问端口(随机分配)
6.2 通过浏览器访问
  • 如果部署在本地虚拟机:

    复制代码
    http://localhost:30007
  • 如果部署在云服务器:

    复制代码
    http://<服务器公网IP>:30007

7. 补充说明

7.1 如何上传PHP代码?
  1. 临时测试:进入PHP容器手动创建文件

    bash 复制代码
    sudo kubectl exec -it <php-pod名称> -- bash
    echo "<?php phpinfo(); ?>" > /var/www/html/index.php
  2. 正式部署

    • 将代码打包到Docker镜像中
    • 或使用持久化存储(如NFS)
7.2 常用命令
bash 复制代码
# 查看所有资源状态
sudo kubectl get pods,svc,pvc

# 查看Pod日志(替换<pod-name>)
sudo kubectl logs -f <pod-name>

# 删除部署
sudo kubectl delete -f <文件名>.yaml
7.3 遇到问题怎么办?
  • 检查Pod状态:

    bash 复制代码
    sudo kubectl describe pod <pod-name>
  • 检查服务是否正常:

    bash 复制代码
    sudo kubectl port-forward svc/nginx-service 8080:80
    # 然后访问 http://localhost:8080

推荐 🌟🌟🌟🌟🌟

🔍 dblens for MySQL - 下一代智能数据库管理与开发工具

🚀 免费下载 | 开箱即用 | AI赋能 | 全链路SQL开发


🌟 核心亮点功能

🤖 AI 智能引擎

  • AI自然语言对话:用日常语言描述需求,自动生成精准SQL语句
  • SQL智能优化器:AI深度解析执行计划,提供性能优化建议
  • 测试数据工厂:智能生成海量仿真测试数据,支持复杂业务规则
  • 大模型定制中心:支持配置接入/训练专属领域大模型

🛠️ 智能开发套件

  • 可视化表设计器:设计表,实时DDL同步
  • AI SQL编辑器
    • 智能语法高亮
    • 智能语法补全
    • 动态错误检测 + 一键修复
    • 多窗口对比调试
  • AI对象生成:自动创建表/视图/存储过程/函数

📊 数据管理矩阵

  • 智能SQL筛选器:可视化条件组合生成复杂查询
  • 数据字典中心:自动生成文档,支持PDF
  • 云原生数据库沙箱:预置测试实例,5秒快速连接
  • 异构数据迁移:支持Excel/CSV/JSON ↔ 数据库双向同步

🚄 效率加速器

  • 自然语言转SQL:业务人员也能轻松操作数据库
  • SQL历史版本对比:智能识别语法差异
  • 跨平台工作区:Windows/macOS/Linux全支持
  • 多语言界面:中文/英文自由切换

🎯 适用场景

✅ 敏捷开发团队快速迭代

✅ DBA智能运维管理

✅ 数据分析师自助查询

✅ 教学培训SQL编程

✅ 企业级数据资产管理

⚡ 即刻体验

→ [立即下载] https://sourceforge.net/projects/dblens-for-mysql

相关推荐
人生偌只如初见2 天前
Kubernetes学习笔记-移除Nacos迁移至K8s
java·kubernetes·k8s
chaodaibing5 天前
k8s面经
linux·运维·k8s
liaosnet7 天前
SealOS部署k8s集群(单节点)
云原生·容器·kubernetes·k8s·sealos
nuczzz7 天前
NVIDIA k8s-device-plugin源码分析与安装部署
kubernetes·k8s·gpu·nvidia·cuda
云上艺旅9 天前
K8S学习之基础十五:k8s中Deployment扩容缩容
学习·docker·云原生·kubernetes·k8s
云上艺旅11 天前
K8S学习之基础十六:k8s中Deployment更新策略
学习·云原生·kubernetes·k8s
john13772411 天前
云原生系列之本地k8s环境搭建
docker·云原生·minikube·k8s
问道飞鱼16 天前
【Kubernets】K8S内部nginx访问Service资源原理说明
nginx·k8s·service·kubernets
loop lee19 天前
【K8S】Kubernetes 基本架构、节点类型及运行流程详解(附架构图及流程图)
分布式·k8s