Kubernetes(k8s)上部署redis5.0.14

Kubernetes上部署redis

环境准备

首先你需要一个Kubernetes环境,可参考我写的文章:https://blog.csdn.net/m0_51510236/article/details/130842122

创建命名空间

我们可以选择以下两种方式创建命名空间,我此次创建的命名空间名字是deploy-test,可以更改,这里只做演示:

  • 命令直接创建
bash 复制代码
kubectl create namespace deploy-test
  • yaml创建(推荐)
yaml 复制代码
apiVersion: v1
kind: Namespace
metadata:
  name: deploy-test
spec: {}
status: {}

准备PV和PVC

在我之前的一篇文章单中讲解了啥是PV和PVC:https://blog.csdn.net/m0_51510236/article/details/132482351

安装nfs

这篇文章直接使用,这次准备的和上次的一样是nfs来做存储,所以三台服务器都需要安装 nfs-utils

bash 复制代码
yum install -y nfs-utils

如图三台服务器都以完成安装:

然后我们在主服务器或nfs服务器上执行这两行命令:

bash 复制代码
mkdir -p /data/nfs/redis
cat >> /etc/exports << EOF
/data/nfs/redis *(rw,sync,no_root_squash)
EOF

这行命令是暴露 /data/nfs/redis 给nfs客户端访问的目录,用于redis数据和日志的存放目录,结下来我们需要开启nfs服务端,执行以下这行命令:

bash 复制代码
systemctl enable --now nfs-server

暴露后来查看暴露结果:

bash 复制代码
showmount -e nfs服务端地址

测试如图:

好的,接下来nfs就安装好了

准备PV

直接上yaml,可以根据提示内容修改:

yaml 复制代码
apiVersion: v1
kind: PersistentVolume
metadata:
  name: deploy-redis-nfs-pv # PV的名字
  namespace: deploy-test # 命名空间
spec:
  capacity:
    storage: 1Gi # 申请的大小
  accessModes:
    - ReadWriteMany # 访问模式为多节点读写
  nfs:
    server: 192.168.1.160 # nfs服务器地址,注意修改为你自己的
    path: /data/nfs/redis # nfs的远程目录
  storageClassName: "nfs" # 存储类名字为nfs

创建结果显示:

准备PVC

直接上yaml,除了改一下名字其他的没啥好修改的:

yaml 复制代码
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: deploy-redis-nfs-pvc # pvc名字
  namespace: deploy-test # 命名空间
spec:
  accessModes:
    - ReadWriteMany # 多节点读写
  storageClassName: "nfs" # 存储类类型为nfs
  resources:
    requests:
      storage: 1Gi # 申请存储空间的大小
  volumeName: deploy-redis-nfs-pv # 对应上面的pv名字

查看pvc的创建:

查看它两的状态(kubectl get pv,pvc -o wide -n deploy-test):

部署redis

创建redis的配置文件

首先我们先规定好配置文件内容(注意修改你的密码):

conf 复制代码
# 关闭保护模式
protected-mode no

# redis链接密码
requirepass redis

# 日志级别
loglevel warning

# 日志存放目录
logfile "/data/redis.log"

# 数据文件目录
dir /data
dbfilename dump.rdb

# 数据库数量
databases 16

# 保存数据库到数据文件
save 900 1
save 300 10
save 60 10000

注意将这个配置文件上传到服务器:

然后我们为这个文件创建一个configmap:

bash 复制代码
kubectl create configmap deploy-redis-config -n deploy-test --from-file=redis.conf --dry-run=client -o yaml

上面这行命令会根据 redis.conf 生成一个yaml文件:

所以创建这个configmap的yaml文件为:

yaml 复制代码
apiVersion: v1
data:
  redis.conf: |
    # 关闭保护模式
    protected-mode no

    # redis链接密码
    requirepass redis

    # 日志级别
    loglevel warning

    # 日志存放目录
    logfile "/data/redis.log"

    # 数据文件目录
    dir /data
    dbfilename dump.rdb

    # 数据库数量
    databases 16

    # 保存数据库到数据文件
    save 900 1
    save 300 10
    save 60 10000
kind: ConfigMap
metadata:
  name: deploy-redis-config
  namespace: deploy-test

创建configmap如图:

部署脚本

yaml 复制代码
apiVersion: v1
kind: Service
metadata:
  name: deploy-redis-svc
  namespace: deploy-test
  labels:
    app: redis
spec:
  ports:
  - port: 6379
    name: redis
    targetPort: 6379
    nodePort: 30379
  selector:
    app: redis
  type: NodePort
  sessionAffinity: ClientIP

---

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: deploy-redis
  namespace: deploy-test
spec:
  selector:
    matchLabels:
      app: redis # 必须匹配 .spec.template.metadata.labels
  serviceName: "deploy-redis-svc"
  replicas: 1
  template:
    metadata:
      labels:
        app: redis # 必须匹配 .spec.selector.matchLabels
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - command:
        - "redis-server"
        - "/usr/local/etc/redis.conf"
        name: redis
        image: redis:5.0.14
        ports:
        - containerPort: 6379
          name: redis
        volumeMounts:
        - name: redis-data
          mountPath: /data
        - name: redis-config
          mountPath: /usr/local/etc
          readOnly: true
      volumes:
      - name: redis-data
        persistentVolumeClaim:
          claimName: deploy-redis-nfs-pvc
      - name: redis-config
        configMap:
          name: deploy-redis-config
          items:
          - key: redis.conf
            path: redis.conf

接下来讲解一下里面比较重要的脚本

挂载数据目录

StatefulSet.spec.template.spec.volumes 当中有那么一串代码:

yaml 复制代码
      - name: redis-data
        persistentVolumeClaim:
          claimName: deploy-redis-nfs-pvc

这串代码是要使用到 deploy-redis-nfs-pvc 这个pvc做数据存储,并给这个挂载取一个名字叫做 redis-data,然后在 StatefulSet.spec.template.spec.containers 有那么一串代码:

yaml 复制代码
        - name: redis-data
          mountPath: /data

这串代码的意思是使用名为 redis-data 数据挂载,并把它挂在到pod的 /data 目录当中

挂载配置文件

StatefulSet.spec.template.spec.volumes 当中有那么一串代码:

yaml 复制代码
      - name: redis-config
        configMap:
          name: deploy-redis-config
          items:
          - key: redis.conf
            path: redis.conf

这串代码的意思是读取 deploy-redis-config 这个configmap并命名为 redis-config,然后获取里面的 redis.conf 配置文件,命名为 redis.conf,然后在 StatefulSet.spec.template.spec.containers 有那么一串代码:

yaml 复制代码
        - name: redis-config
          mountPath: /usr/local/etc
          readOnly: true

这串代码的意思是使用名为 redis-config 配置文件,并把它以只读的方式挂在到pod的 /usr/local/etc 当中

通过指定的配置文件启动redis

在 `StatefulSet.spec.template.spec.containers当中有这么一行代码:

yaml 复制代码
      - command:
        - "redis-server"
        - "/usr/local/etc/redis.conf"

这行代码的意思是使用 /usr/local/etc/redis.conf 配置文件启动redis,这个配置文件是我们在configmap当中配置的,当我们执行部署的这个yaml之后,可以查看结果:

执行一下命令查看部署进度:

bash 复制代码
kubectl get all -o wide -n deploy-test

看到这个就代表部署完成了:

集群内部访问

StatefulSet应用的访问地址为:

txt 复制代码
<pod名称>.<service名称>.<命名空间名称>.svc.cluster.local

那么这次暴露的pod访问地址就是:

txt 复制代码
deploy-redis-0.deploy-redis-svc.deploy-test.svc.cluster.local

尝试解析验证一下:

外部链接Redis

我们可以直接使用 IntelliJ IDEA 或其他链接工具尝试链接:

显示链接成功(如果有密码注意输入密码):

并且操作也没问题:

我们来到数据目录,查看容器内的数据已经成功暴露到nfs的目录当中:
到这里在Kubernetes上安装redis就已经完成了!

相关推荐
AAA@峥14 小时前
容器数据不丢失:Docker 分层存储 + Volume 共享、备份迁移完整指南
运维·docker·容器
十年磨一剑~16 小时前
docker 为何每次 docker tag才能 docker push
docker·容器·eureka
gs8014018 小时前
记一次多 Agent 架构在单节点 K8s 触发的 PID 耗尽与 Pod 驱逐(Evicted)大摸排
容器·架构·kubernetes
bukeyiwanshui18 小时前
20260701 k8s Metric Server
容器·贪心算法·kubernetes
江湖有缘19 小时前
基于Docker环境部署tillywork开源工作管理工具
docker·容器·开源
鸿儒51721 小时前
MR-50国产化GPU docker配置方法
docker·容器·mr
Zhu7581 天前
在k8s集群部署ApacheHadoop单节点单数据副本
云原生·容器·kubernetes
Akamai中国1 天前
Akamai收购安全企业浏览器提供商LayerX
人工智能·云原生·云计算·云服务
摇滚侠1 天前
云原生 Java 架构师的第一课 K8s+Docker+KubeSphere+DevOps 51-60
java·云原生·kubernetes