Kubernetes上部署redis
- 环境准备
- 创建命名空间
- 准备PV和PVC
- 安装nfs
- 准备PV
- 准备PVC
- 部署redis
- 创建redis的配置文件
- 部署脚本
- 挂载数据目录
- 挂载配置文件
- 通过指定的配置文件启动redis
- 集群内部访问
- 外部链接Redis
环境准备
首先你需要一个Kubernetes环境,可参考我写的文章:https://blog.csdn.net/m0_51510236/article/details/130842122
创建命名空间
我们可以选择以下两种方式创建命名空间,我此次创建的命名空间名字是deploy-test
,可以更改,这里只做演示:
- 命令直接创建
kubectl create namespace deploy-test
- 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
:
yum install -y nfs-utils
如图三台服务器都以完成安装:
然后我们在主服务器或nfs服务器上执行这两行命令:
mkdir -p /data/nfs/redis
cat >> /etc/exports << EOF
/data/nfs/redis *(rw,sync,no_root_squash)
EOF
这行命令是暴露 /data/nfs/redis
给nfs客户端访问的目录,用于redis数据和日志的存放目录,结下来我们需要开启nfs服务端,执行以下这行命令:
systemctl enable --now nfs-server
暴露后来查看暴露结果:
showmount -e nfs服务端地址
测试如图:
好的,接下来nfs就安装好了
准备PV
直接上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,除了改一下名字其他的没啥好修改的:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: deploy-redis-nfs-pvc # pvc名字namespace: deploy-test # 命名空间
spec:accessModes:- ReadWriteMany # 多节点读写storageClassName: "nfs" # 存储类类型为nfsresources:requests:storage: 1Gi # 申请存储空间的大小volumeName: deploy-redis-nfs-pv # 对应上面的pv名字
查看pvc的创建:
查看它两的状态(kubectl get pv,pvc -o wide -n deploy-test
):
部署redis
创建redis的配置文件
首先我们先规定好配置文件内容(注意修改你的密码):
# 关闭保护模式
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:
kubectl create configmap deploy-redis-config -n deploy-test --from-file=redis.conf --dry-run=client -o yaml
上面这行命令会根据 redis.conf
生成一个yaml文件:
所以创建这个configmap的yaml文件为:
apiVersion: v1
data:redis.conf: |# 关闭保护模式protected-mode no# redis链接密码requirepass redis# 日志级别loglevel warning# 日志存放目录logfile "/data/redis.log"# 数据文件目录dir /datadbfilename dump.rdb# 数据库数量databases 16# 保存数据库到数据文件save 900 1save 300 10save 60 10000
kind: ConfigMap
metadata:name: deploy-redis-confignamespace: deploy-test
创建configmap如图:
部署脚本
apiVersion: v1
kind: Service
metadata:name: deploy-redis-svcnamespace: deploy-testlabels:app: redis
spec:ports:- port: 6379name: redistargetPort: 6379nodePort: 30379selector:app: redistype: NodePortsessionAffinity: ClientIP---apiVersion: apps/v1
kind: StatefulSet
metadata:name: deploy-redisnamespace: deploy-test
spec:selector:matchLabels:app: redis # 必须匹配 .spec.template.metadata.labelsserviceName: "deploy-redis-svc"replicas: 1template:metadata:labels:app: redis # 必须匹配 .spec.selector.matchLabelsspec:terminationGracePeriodSeconds: 10containers:- command:- "redis-server"- "/usr/local/etc/redis.conf"name: redisimage: redis:5.0.14ports:- containerPort: 6379name: redisvolumeMounts:- name: redis-datamountPath: /data- name: redis-configmountPath: /usr/local/etcreadOnly: truevolumes:- name: redis-datapersistentVolumeClaim:claimName: deploy-redis-nfs-pvc- name: redis-configconfigMap:name: deploy-redis-configitems:- key: redis.confpath: redis.conf
接下来讲解一下里面比较重要的脚本
挂载数据目录
在 StatefulSet.spec.template.spec.volumes
当中有那么一串代码:
- name: redis-datapersistentVolumeClaim:claimName: deploy-redis-nfs-pvc
这串代码是要使用到 deploy-redis-nfs-pvc
这个pvc做数据存储,并给这个挂载取一个名字叫做 redis-data
,然后在 StatefulSet.spec.template.spec.containers
有那么一串代码:
- name: redis-datamountPath: /data
这串代码的意思是使用名为 redis-data
数据挂载,并把它挂在到pod的 /data 目录当中
挂载配置文件
在 StatefulSet.spec.template.spec.volumes
当中有那么一串代码:
- name: redis-configconfigMap:name: deploy-redis-configitems:- key: redis.confpath: redis.conf
这串代码的意思是读取 deploy-redis-config
这个configmap并命名为 redis-config
,然后获取里面的 redis.conf
配置文件,命名为 redis.conf
,然后在 StatefulSet.spec.template.spec.containers
有那么一串代码:
- name: redis-configmountPath: /usr/local/etcreadOnly: true
这串代码的意思是使用名为 redis-config
配置文件,并把它以只读的方式挂在到pod的 /usr/local/etc 当中
通过指定的配置文件启动redis
在 `StatefulSet.spec.template.spec.containers当中有这么一行代码:
- command:- "redis-server"- "/usr/local/etc/redis.conf"
这行代码的意思是使用 /usr/local/etc/redis.conf
配置文件启动redis,这个配置文件是我们在configmap当中配置的,当我们执行部署的这个yaml之后,可以查看结果:
执行一下命令查看部署进度:
kubectl get all -o wide -n deploy-test
看到这个就代表部署完成了:
集群内部访问
StatefulSet应用的访问地址为:
<pod名称>.<service名称>.<命名空间名称>.svc.cluster.local
那么这次暴露的pod访问地址就是:
deploy-redis-0.deploy-redis-svc.deploy-test.svc.cluster.local
尝试解析验证一下:
外部链接Redis
我们可以直接使用 IntelliJ IDEA
或其他链接工具尝试链接:
显示链接成功(如果有密码注意输入密码):
并且操作也没问题:
我们来到数据目录,查看容器内的数据已经成功暴露到nfs的目录当中:
到这里在Kubernetes上安装redis就已经完成了!