(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)

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

相关推荐
颜淡慕潇4 小时前
【K8S系列】在 K8S 中使用 Values 文件定制不同环境下的应用配置
云原生·容器·kubernetes·环境配置
旦沐已成舟4 小时前
K8S-Pod的环境变量,重启策略,数据持久化,资源限制
java·docker·kubernetes
超级阿飞4 小时前
利用Kubespray安装生产环境的k8s集群-实施篇
elasticsearch·容器·kubernetes
等一场春雨11 小时前
CentOS 安装Redis
linux·redis·centos
来恩100312 小时前
Kubernetes学习指南与资料分享
云原生·容器·kubernetes
encoding-console12 小时前
docker安装consul并启动的详细步骤
docker·容器·consul
m0_7482299913 小时前
从零到上线:Node.js 项目的完整部署流程(包含 Docker 和 CICD)
docker·容器·node.js
天天向上杰14 小时前
简识Redis 持久化相关的 “Everysec“ 策略
数据库·redis·缓存
清风-云烟15 小时前
使用redis-cli命令实现redis crud操作
java·linux·数据库·redis·spring·缓存·1024程序员节