(k8s)k8s部署mysql与redis(无坑版)

0.准备工作

在开始之前,要确保我们的节点已经加入网络并且已经准备好,如果没有可以去看我前面发表的踩坑与解决的文章,希望能够帮到你。

1.k8s部署redis

1.1目标

由于我们的服务器资源较小,所以决定只部署一个redis副本,同时我们要能够提供一个对外的端口进行连接以及使用我们自己的自定义redis配置文件。

1.2效果

成功之后的效果应该如下图中有关redis的部分

1.3项目结构

redis-configmap.yaml

  • 作用:用于在 Kubernetes 中创建一个 ConfigMap,用来存储 Redis 的配置文件内容。

redis-statefulset.yaml

  • 作用:定义一个 StatefulSet,用于部署和管理 Redis 的有状态应用。

redis.conf

  • 作用:Redis 的核心配置文件,用于定义 Redis 的运行参数。

1.4代码展示

redis-config.yaml

复制代码
apiVersion: v1
kind: ConfigMap
metadata:
  name: redis-config
data:
  redis.conf: |
    save 86400 1  
    appendonly no 

redis-statefulset.yaml

复制代码
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: redis-cluster
spec:
  serviceName: "redis-cluster"
  replicas: 1  
  selector:
    matchLabels:
      app: redis-cluster
  template:
    metadata:
      labels:
        app: redis-cluster
    spec:
      containers:
      - name: redis
        image: redis:alpine  # 使用官方的 Redis 镜像
        ports:
        - containerPort: 6379  # Redis 默认端口
        volumeMounts:
        - name: redis-data
          mountPath: /data  # Redis 数据存储路径
        - name: redis-config
          mountPath: ******  # 挂载自定义配置文件
          subPath: redis.conf
        command:
          - "redis-server"
          - "*******"  # 指定使用自定义的配置文件
      volumes:
      - name: redis-data
        emptyDir: {}  # 使用 emptyDir 或 PVC 持久化数据
      - name: redis-config
        configMap:
          name: redis-config  # 通过 ConfigMap 加载配置文件
---
apiVersion: v1
kind: Service
metadata:
  name: redis-cluster
spec:
  selector:
    app: redis-cluster
  ports:
    - protocol: TCP
      port: ***
      targetPort: *****
      nodePort: ****
  type: NodePort  # 使用 NodePort 类型

redis.conf

复制代码
# redis-persistence.conf

save 86400 1   

appendonly no  

1.5命令部署

由于之前已经部署过,所以先采用这两行命令停止redis的部署

将之前提供的yaml文件保存到服务器的自定义位置上,然后执行create命令

如果像下面这样我们就成功了!

接下来我们试试可不可以使用redis客户端工具对我们的redis进行连接,这里我采用的是Redis Insight,

输入暴露出来的端口之后,成功连接!

2.k8s部署mysql

2.1目标

同样由于服务器资源的限制,对于mysql我也只打算开一个单机版,能够使用mysql外部客户端进行连接,对于数据可以持久化保存

2.2项目结构

mysql-statefulset.yaml

  • 作用:定义 MySQL 的 StatefulSet,用于管理有状态的 MySQL Pod。

mysqlpvc.yaml

  • 作用:定义 PersistentVolumeClaim (PVC),用于向 MySQL Pod 申请持久化存储。

mysqlpv.yaml

  • 作用:定义 PersistentVolume (PV),用于提供实际的存储资源。

2.3项目代码示例

mysql-statefulset.yaml

复制代码
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
spec:
  serviceName: "mysql"
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:oracle
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: ******
        ports:
        - containerPort: 3306
        volumeMounts:
        - name: mysql-data
          mountPath: /var/lib/mysql
  volumeClaimTemplates:
  - metadata:
      name: mysql-data
    spec:
      accessModes: ["ReadWriteOnce"]
      resources:
        requests:
          storage: 10Gi
---
apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  ports:
    - port: ****
      targetPort: ***
      nodePort: ****
  selector:
    app: mysql
  type: NodePort

mysqlpvc.yaml

复制代码
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-data-mysql-0
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  storageClassName: standard  # 或者你集群中其他存储类的名称

mysqlpv.yaml

复制代码
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-pv
spec:
  capacity:
    storage: 10Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: standard
  hostPath: 
    path: /mnt/data/mysql

2.4效果

如下图所示便是成功

2.5命令部署

将上面的yaml文件保存到服务器之后执行create命令进行部署,需要先执行pv创建一个可以持久化的资源,之后再执行statefulset文件便成功部署!

注意在执行我们的statefulset之后k8s便会根据我们的定义为我们创建一个默认的pvc来试图绑定资源,但我们采用了自定义的pv资源所以默认的pvc是绑定不到的,我们需要在这后面再次运行我们的pvcyaml文件将它的配置进行改变,

如果能够帮助到你的话,可以留下一个免费的赞吗?:)

题外话

无状态应用是指应用的实例之间没有数据依赖,应用不需要保留用户的会话数据或持久化数据。

特点
  • 无数据依赖:每个 Pod 都是独立的,处理完请求后不会存储任何状态数据。
  • 弹性伸缩方便:Pod 可以随意增加或减少,不需要考虑数据一致性。
  • 容易替换:Pod 重启或迁移不会影响应用的功能,因为所有数据都存储在外部(如数据库、缓存等)。
  • 常见场景
    • Web 服务器(如 Nginx、Apache)
    • 无状态 API 服务
    • 静态文件托管

有状态应用是指应用的实例需要存储并维护自己的状态信息,通常需要持久化数据。

特点
  • 数据依赖:应用需要保留会话数据或用户数据,数据通常存储在本地磁盘或持久化存储中。
  • 固定 Pod 标识:Pod 通常需要固定的标识(如名称),以确保数据和应用的关联性。
  • 复杂部署:需要考虑数据持久化、备份、恢复和一致性问题。
  • 常见场景
    • 数据库(如 MySQL、Redis、MongoDB)
    • 消息队列(如 Kafka、RabbitMQ)
    • 日志存储(如 Elasticsearch)

如果还有啥错误的话,欢迎在评论区或者私信我!

相关推荐
TT哇26 分钟前
【Java EE初阶】计算机是如何⼯作的
java·redis·java-ee
陌殇殇4 小时前
SpringBoot整合SpringCache缓存
spring boot·redis·缓存
weixin_4383354010 小时前
分布式锁实现方式:基于Redis的分布式锁实现(Spring Boot + Redis)
数据库·redis·分布式
暮乘白帝过重山10 小时前
为什么要写RedisUtil这个类
redis·开发·暮乘白帝过重山
持之以恒的天秤13 小时前
Redis—哨兵模式
redis·缓存
高山莫衣13 小时前
Docker Desktop导致存储空间不足时的解决方案
docker·容器·eureka
鹏大师运维13 小时前
在银河麒麟V10 SP1上手动安装与配置高版本Docker的完整指南
linux·运维·docker·容器·麒麟·统信uos·中科方德
Ahlson13 小时前
【fnNAS】docker的nginx配置html
nginx·docker·容器·fnnas
LuckyLay13 小时前
Compose 常用命令详解——AI教你学Docker
docker·容器·eureka
moppol14 小时前
容器化 vs 虚拟机:什么时候该用 Docker?什么时候必须用 VM?
运维·docker·容器