环境准备
准备Kubernetes
首先你需要一个Kubernetes集群,如图我已经安装好了一个Kubernetes集群:
如果你还没有Kubernetes集群可参考我写的文章:https://blog.csdn.net/m0_51510236/article/details/130842122
准备存储类
你还需要一个可动态供应的存储类,我之前已经写过一篇关于安装NFS动态供给存储类的文章:https://blog.csdn.net/m0_51510236/article/details/132641343(这篇文章的上半部分),如图我已经安装好了一个NFS的存储类(名字为 nfs-client):
部署redis
我之前写过一篇在物理机上安装高可用多主多从的redis集群的文章:https://blog.csdn.net/m0_51510236/article/details/132684529,这篇文章参考的那片物理机上安装集群的步骤来。
准备一个命名空间
为了贴近生产环境,我们先创建一个命名空间:
命令创建
kubectl create namespace deploy-test
yaml文件创建(推荐)
apiVersion: v1 kind: Namespace metadata: name: deploy-test spec: {} status: {}
准备redis配置文件
首先我们需要一个Redis的配置文件,我已经准备好了,注意名字命名为 redis.conf:
# 关闭保护模式 protected-mode no # 日志级别 loglevel warning # 日志存放目录 logfile "/data/redis.log" # 数据文件目录 dir /data dbfilename dump.rdb # 数据库数量 databases 16 # 保存数据库到数据文件 save 900 1 save 300 10 save 60 10000 # 集群相关配置 cluster-enabled yes cluster-config-file nodes-6379.conf cluster-node-timeout 15000
先把这个文件复制到服务器上,如图:
然后我们需要创建一个ConfigMap,可以直接通过下面命令生产ConfigMap的yaml资源清单文件:
kubectl create configmap redis-cluster-config --from-file=redis.conf -n deploy-test --dry-run=client -o yaml
生成了如图:
因为我们真实部署中可能还会将这个应用部署到其他集群,所以我们记得保存这个配置文件:
apiVersion: v1 data: redis.conf: | # 关闭保护模式 protected-mode no # 日志级别 loglevel warning # 日志存放目录 logfile "/data/redis.log" # 数据文件目录 dir /data dbfilename dump.rdb # 数据库数量 databases 16 # 保存数据库到数据文件 save 900 1 save 300 10 save 60 10000 # 集群相关配置 cluster-enabled yes cluster-config-file nodes-6379.conf cluster-node-timeout 15000 kind: ConfigMap metadata: name: redis-cluster-config namespace: deploy-test
我们将这个内容保存到一个文件中,如 redis-deploy.yaml:
准备部署statefulset的资源清单文件
资源清单文件我已经准备好了,下面有详细的说明:
# 创建一个Redis部署要用到的Service 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 # 引用上面定义的Service serviceName: "deploy-redis-svc" # 注意这里部署六个节点,按照本篇文章的逻辑最好不要修改 replicas: 6 template: metadata: labels: app: redis spec: terminationGracePeriodSeconds: 10 containers: - command: # 这里指定使用那个配置文件启动redis-server - "redis-server" - "/usr/local/etc/redis.conf" name: redis # 因为redis6集群对域名支持不好,并且Kubernetes是需要通过域名连接各个pod的,所以我们采用redis7来完成这次部署 # 如果你能拉取到DockerHub上的镜像那么你就使用这个 # image: docker.io/library/redis:7.0.12 # 如果你拉取不到,那么就使用我拉取并推送到国内阿里云的镜像 image: registry.cn-shenzhen.aliyuncs.com/xiaohh-docker/redis:7.0.12 ports: - containerPort: 6379 name: redis volumeMounts: # 挂载redis的数据卷,使用的是我在下面声明的存储类模版 - name: redis-data mountPath: /data # 挂载redis的配置文件 - name: redis-config mountPath: /usr/local/etc readOnly: true volumes: # 读取configmap,获取redis的配置文件,方便上面挂载这个配置文件 - name: redis-config configMap: name: redis-cluster-config items: - key: redis.conf path: redis.conf # 定义存储类模版 volumeClaimTemplates: - metadata: name: redis-data # 这个名字要与上面的对应 namespace: deploy-test spec: accessModes: - ReadWriteMany # 设置多节点读写模式 resources: requests: storage: 1Gi # 申请1个g的存储空间,可根据自己的服务器空间修改 storageClassName: nfs-client # 这里填写你存储类的名字
完整的资源清单文件内容:
apiVersion: v1 kind: Namespace metadata: name: deploy-test spec: {} status: {} --- apiVersion: v1 data: redis.conf: | # 关闭保护模式 protected-mode no # 日志级别 loglevel warning # 日志存放目录 logfile "/data/redis.log" # 数据文件目录 dir /data dbfilename dump.rdb # 数据库数量 databases 16 # 保存数据库到数据文件 save 900 1 save 300 10 save 60 10000 # 集群相关配置 cluster-enabled yes cluster-config-file nodes-6379.conf cluster-node-timeout 15000 kind: ConfigMap metadata: name: redis-cluster-config namespace: deploy-test --- 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 serviceName: "deploy-redis-svc" replicas: 6 template: metadata: labels: app: redis spec: terminationGracePeriodSeconds: 10 containers: - command: - "redis-server" - "/usr/local/etc/redis.conf" name: redis # image: docker.io/library/redis:7.0.12 image: registry.cn-shenzhen.aliyuncs.com/xiaohh-docker/redis:7.0.12 ports: - containerPort: 6379 name: redis volumeMounts: - name: redis-data mountPath: /data - name: redis-config mountPath: /usr/local/etc readOnly: true volumes: - name: redis-config configMap: name: redis-cluster-config items: - key: redis.conf path: redis.conf volumeClaimTemplates: - metadata: name: redis-data namespace: deploy-test spec: accessModes: - ReadWriteMany resources: requests: storage: 1Gi storageClassName: nfs-client
执行文件完成部署
我们可以使用这行命令执行这个文件完成部署:
kubectl apply -f redis-deploy.yaml
执行后如图:
可以通过这行命令监控它的部署:
watch kubectl get all -o wide -n deploy-test
看到6个pod都已经成功运行起来了:
初始化集群
我们部署的pod是statefulset类型的pod,所以我们访问pod的域名格式为 pod名字.service名字.命名空间.svc.cluster.local,所以我们在集群中访问六个redis的地址分别为:
deploy-redis-0.deploy-redis-svc.deploy-test.svc.cluster.local:6379 deploy-redis-1.deploy-redis-svc.deploy-test.svc.cluster.local:6379 deploy-redis-2.deploy-redis-svc.deploy-test.svc.cluster.local:6379 deploy-redis-3.deploy-redis-svc.deploy-test.svc.cluster.local:6379 deploy-redis-4.deploy-redis-svc.deploy-test.svc.cluster.local:6379 deploy-redis-5.deploy-redis-svc.deploy-test.svc.cluster.local:6379
接下来我们需要去到里面的任何一个pod,去执行一行命令,使用这行命令进入到第一个pod:
# 注意修改你自己的命名空间和pod名字 kubectl exec -itn deploy-test pod/deploy-redis-0 bash
进入后如图:
然后我们执行一下下面这行命令:
redis-cli --cluster create --cluster-replicas 1 \ deploy-redis-0.deploy-redis-svc.deploy-test.svc.cluster.local:6379 \ deploy-redis-1.deploy-redis-svc.deploy-test.svc.cluster.local:6379 \ deploy-redis-2.deploy-redis-svc.deploy-test.svc.cluster.local:6379 \ deploy-redis-3.deploy-redis-svc.deploy-test.svc.cluster.local:6379 \ deploy-redis-4.deploy-redis-svc.deploy-test.svc.cluster.local:6379 \ deploy-redis-5.deploy-redis-svc.deploy-test.svc.cluster.local:6379
执行后会出现这个提示:
它问我们这样的一个分配方式行不行,这里直接输入yes然后回车,接下来看到下面这个画面代表集群配置成功:
我们接下来使用这行命令来进入集群:
# -c 的意思是进入集群 redis-cli -c
然后我们输入这行命令来查看集群里的节点:
CLUSTER NODES
可以看到是三master三node的redis集群:
到这里Kubernetes上搭建redis高可用集群就已经完毕了。