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

ops/2025/1/23 3:58:49/

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-clustertemplate:metadata:labels:app: redis-clusterspec:containers:- name: redisimage: redis:alpine  # 使用官方的 Redis 镜像ports:- containerPort: 6379  # Redis 默认端口volumeMounts:- name: redis-datamountPath: /data  # Redis 数据存储路径- name: redis-configmountPath: ******  # 挂载自定义配置文件subPath: redis.confcommand:- "redis-server"- "*******"  # 指定使用自定义的配置文件volumes:- name: redis-dataemptyDir: {}  # 使用 emptyDir 或 PVC 持久化数据- name: redis-configconfigMap:name: redis-config  # 通过 ConfigMap 加载配置文件
---
apiVersion: v1
kind: Service
metadata:name: redis-cluster
spec:selector:app: redis-clusterports:- protocol: TCPport: ***targetPort: *****nodePort: ****type: NodePort  # 使用 NodePort 类型

redis.conf

# redis-persistence.confsave 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: 1selector:matchLabels:app: mysqltemplate:metadata:labels:app: mysqlspec:containers:- name: mysqlimage: mysql:oracleenv:- name: MYSQL_ROOT_PASSWORDvalue: ******ports:- containerPort: 3306volumeMounts:- name: mysql-datamountPath: /var/lib/mysqlvolumeClaimTemplates:- metadata:name: mysql-dataspec:accessModes: ["ReadWriteOnce"]resources:requests:storage: 10Gi
    ---
    apiVersion: v1
    kind: Service
    metadata:name: mysql
    spec:ports:- port: ****targetPort: ***nodePort: ****selector:app: mysqltype: NodePort

    mysqlpvc.yaml

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:name: mysql-data-mysql-0
    spec:accessModes:- ReadWriteOnceresources:requests:storage: 10GistorageClassName: standard  # 或者你集群中其他存储类的名称
    

    mysqlpv.yaml 

    apiVersion: v1
    kind: PersistentVolume
    metadata:name: mysql-pv
    spec:capacity:storage: 10GivolumeMode: FilesystemaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: RetainstorageClassName: standardhostPath: 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)

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


    http://www.ppmy.cn/ops/152363.html

    相关文章

    RV1126+FFMPEG推流项目(9)AI和AENC模块绑定,并且开启线程采集

    前面两篇已经交代AI和AENC模块的配置,这篇就让这两个模块绑定起来,绑定的原因是,Aenc从Ai模块拿到采集的原始数据进行编码。 使用 RK_MPI_SYS_Bind 把 AI 节点和 AENC 进行绑定,其中 enModId 是模块 ID 号选择的是 RK_ID_AI、s32C…

    Nginx HTTP 服务器基础配置

    一、Nginx 初相识 在当今互联网的广阔世界里,Nginx作为一款高性能的HTTP和反向代理服务器,犹如一颗璀璨的明星,闪耀在Web服务器领域的天空中。它诞生于2004年,由俄罗斯的Igor Sysoev开发,最初的目的是为了解决C10K问题…

    电脑如何访问手机文件?

    手机和电脑已经深深融入了我们的日常生活,无时无刻不在为我们提供服务。除了电脑远程操控电脑外,我们还可以在电脑上轻松地访问Android或iPhone手机上的文件。那么,如何使用电脑远程访问手机上的文件呢? 如何使用电脑访问手机文件…

    【2024年华为OD机试】(A卷,100分)- 幻方修复 (JavaScriptJava PythonC/C++)

    一、问题描述 幻方修复问题 题目描述 幻方(Magic Square)是一个由 1~N,共 N 个整数构成的 NN 矩阵,满足每行、列和对角线上的数字和相等。 上回你已经帮助小明将写错一个数字的幻方进行了修复,小明在感谢之余也想进…

    日志(elk stack)基础语法学习,零基础学习

    ELK Stack 是一组开源的日志管理工具,包括 Elasticsearch、Logstash 和 Kibana。Elasticsearch 用于存储和搜索日志数据,Logstash 用于收集和处理日志数据,而 Kibana 提供了一个强大的可视化界面来分析和监控这些数据。以下是 ELK Stack 的基…

    SpringBoot 整合 Avro 与 Kafka

    优质博文:IT-BLOG-CN 【需求】:生产者发送数据至 kafka 序列化使用 Avro,消费者通过 Avro 进行反序列化,并将数据通过 MyBatisPlus 存入数据库。 一、环境介绍 【1】Apache Avro 1.8;【2】Spring Kafka 1.2&#xf…

    【STM32-学习笔记-10-】BKP备份寄存器+时间戳

    文章目录 BKP备份寄存器Ⅰ、BKP简介1. BKP的基本功能2. BKP的存储容量3. BKP的访问和操作4. BKP的应用场景5. BKP的控制寄存器 Ⅱ、BKP基本结构Ⅲ、BKP函数Ⅳ、BKP使用示例 时间戳一、Unix时间戳二、时间戳的转换(time.h函数介绍)Ⅰ、time()Ⅱ、mktime()…

    MySQL日期时间函数详解

    简介 本文主要讲解MySQL中的日期时间函数,包括:NOW、CURRENT_TIMESTAMP、CURDATE、CURRENT_DATE、CURTIME、CURRENT_TIME、STR_TO_DATE、DATE_FORMAT、TIME_FORMAT、DATE、TIME、YEAR、MONTH、DAY、HOUR、MINUTE、SECOND、QUARTER、YEARWEEK、WEEKDAY、…