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" # 存储类类型为nfs
resources:
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 /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如图:
部署脚本
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
当中有那么一串代码:
- name: redis-data
persistentVolumeClaim:
claimName: deploy-redis-nfs-pvc
这串代码是要使用到 deploy-redis-nfs-pvc
这个pvc做数据存储,并给这个挂载取一个名字叫做 redis-data
,然后在 StatefulSet.spec.template.spec.containers
有那么一串代码:
- name: redis-data
mountPath: /data
这串代码的意思是使用名为 redis-data
数据挂载,并把它挂在到pod的 /data 目录当中
挂载配置文件
在 StatefulSet.spec.template.spec.volumes
当中有那么一串代码:
- 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
有那么一串代码:
- name: redis-config
mountPath: /usr/local/etc
readOnly: 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就已经完成了!