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

news/2025/1/22 12:48:56/

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/news/1565221.html

    相关文章

    亲测有效!如何快速实现 PostgreSQL 数据迁移到 时序数据库TDengine

    小T导读:本篇文章是“2024,我想和 TDengine 谈谈”征文活动的优秀投稿之一,作者从数据库运维的角度出发,分享了利用 TDengine Cloud 提供的迁移工具,从 PostgreSQL 数据库到 TDengine 进行数据迁移的完整实践过程。文章…

    Erlang语言的面向对象编程

    Erlang语言的面向对象编程探索 引言 Erlang 是一种并发编程语言,最早由爱立信公司开发,用于电信系统的构建。由于其高可用性和容错能力,Erlang 在分布式系统、实时系统和大规模并发系统中得到了广泛应用。尽管 Erlang 的设计并不原生支持面…

    AI刷题-小R的随机播放顺序、不同整数的计数问题

    目录 一、小R的随机播放顺序 问题描述 测试样例 解题思路: 问题理解 数据结构选择 算法步骤 最终代码: 运行结果: 二、 不同整数的计数问题 问题描述 测试样例 解题思路: 问题理解 数据结构选择 算法步骤 最终…

    Java设计模式 六 原型模式 (Prototype Pattern)

    原型模式 (Prototype Pattern) 原型模式是一种创建型设计模式,通过复制现有对象来创建新对象,而不是直接实例化类。这种模式适用于创建成本较高的对象,或者需要重复创建相似对象的场景。 原型模式的核心思想是: 通过对象自身提供…

    RestTemplate-调用远端接口应用场景

    环境准备: Springboot项目 RestTemplate注入到项目中 Configurationpublic class Config {Beanpublic RestTemplate restTemplate() {return new RestTemplate(new OkHttp3ClientHttpRequestFactory());}}案例一: 使用get调用远程接口: 地址如: http://xxxx.xxx.xxx/xxx?a111&…

    html与css学习笔记(2)

    一、CSS引入方式 具体有 3 种引入方式&#xff0c;语法如下表格所示&#xff1a; 引入方式语法内联样式在HTML标签中使用style属性&#xff0c;例如&#xff1a;<div style"color: red;">这是一个红色的div</div>内部样式表在HTML文件的<head>标签…

    Django学习笔记(安装和环境配置)-01

    Django学习笔记(安装和环境配置)-01 一、创建python环境 1、可以通过安装Anaconda来创建一个python环境 # 创建一个虚拟python环境 conda create -n django python3.8 # 切换激活到创建的环境中 activate django2、安装django # 进入虚拟环境中安装django框架 pip install …

    Python 常用运维模块之Shutil 模块

    Python 常用运维模块之Shutil 模块 Shutil 模块复制源文件到目标路径复制源文件权限到目标文件复制源文件的最近修改时间、权限等元信息到目标文件复制源文件到目标路径&#xff08;包含文件名&#xff09;复制源文件及相关元信息到目标路径移动文件或目录获取磁盘使用情况复制…