基于StatefulSet控制器运行Redis Cluster

redis集群规划

  redis0——>master

  redis1——>master

  redis2——>master

  redis3——>slave

  redis4——>slave

  redis5——>slave

 

构建镜像

       创建redis.conf

       新增集群配置和aof持久化,注意要将集群的配置文件nodes.conf放在nfs共享存储上,可以使用脚本动态修改pod ip

root@deploy:/dockerfile/project/redis-cluster# cat redis.conf
bind 0.0.0.0
port 6379
daemonize no
pidfile /var/run/redis_6379.pid
loglevel warning
logfile "/usr/local/redis/logs/redis.log"
dbfilename dump.rdb
dir /usr/local/redis/data
save 900 1
save 5 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error no
requirepass 123456
cluster-enabled yes
cluster-config-file /usr/local/redis/data/nodes.conf
cluster-node-timeout 5000
appendonly yes
appendfilename "appendonly.aof"

 

  nfs server配置

       创建nfs共享目录

root@harbor:/data/k8sdata# mkdir redis-cluster/redis{0..5} -p

    

  配置nfs server

root@harbor:/data/k8sdata# cat /etc/exports
/data/k8sdata *(rw,sync,no_root_squash)
root@harbor:/data/k8sdata# exportfs -r

 

  创建构建镜像脚本

root@master1:/dockerfile/project/redis-cluster# vim build-command.sh
#!/bin/bash
TAG=$1
nerdctl build -t harbor.cncf.net/project/redis:${TAG} .
nerdctl push harbor.cncf.net/project/redis:${TAG}

 

  创建Dockerfile

root@deploy:/dockerfile/project/redis-cluster# cat Dockerfile
FROM harbor.cncf.net/os/ubuntu:20.04
ADD redis-6.2.6.tar.gz /usr/local/src
RUN cd /usr/local/src/redis-6.2.6 && \
make MALLOC=jemalloc && \
make PREFIX=/usr/local/redis install
RUN cd /usr/local/redis && \
mkdir /usr/local/redis/conf && \
mkdir /usr/local/redis/logs && \
mkdir /usr/local/redis/data
ENV PATH=$PATH:/usr/local/redis/bin
ADD redis.conf /usr/local/redis/conf/redis.conf
EXPOSE 6379
RUN rm -f /usr/local/src/redis-6.2.6.tar.gz

 

 

创建k8s资源

  使用statefulset控制器创建redis集群

       创建pv

root@master1:/dockerfile/project/redis-cluster/pv# cat redis-cluster-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: redis-cluster-pv0
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
nfs:
server: 192.168.100.15
path: /data/k8sdata/redis-cluster/redis0
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: redis-cluster-pv1
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
nfs:
server: 192.168.100.15
path: /data/k8sdata/redis-cluster/redis1
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: redis-cluster-pv2
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
nfs:
server: 192.168.100.15
path: /data/k8sdata/redis-cluster/redis2
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: redis-cluster-pv3
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
nfs:
server: 192.168.100.15
path: /data/k8sdata/redis-cluster/redis3
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: redis-cluster-pv4
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
nfs:
server: 192.168.100.15
path: /data/k8sdata/redis-cluster/redis4
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: redis-cluster-pv5
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
nfs:
server: 192.168.100.15
path: /data/k8sdata/redis-cluster/redis5
root@master1:/dockerfile/project/redis-cluster/pv# kubectl apply -f redis-cluster-pv.yaml
persistentvolume/redis-cluster-pv0 created
persistentvolume/redis-cluster-pv1 created
persistentvolume/redis-cluster-pv2 created
persistentvolume/redis-cluster-pv3 created
persistentvolume/redis-cluster-pv4 created
persistentvolume/redis-cluster-pv5 created

 

       查看pv

      

  创建redis statefulset控制器和svc

root@deploy:/dockerfile/project/redis-cluster# cat redis.yaml
apiVersion: v1
kind: Service
metadata:
name: redis
namespace: redis-test
labels:
app: redis
spec:
selector:
app: redis
appCluster: redis-cluster
ports:
- name: client
port: 6379
targetPort: 6379
- name: cluster
port: 16379
targetPort: 16379
clusterIP: None
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: redis
namespace: redis-test
spec:
serviceName: redis
replicas: 6
selector:
matchLabels:
app: redis
appCluster: redis-cluster
template:
metadata:
labels:
app: redis
appCluster: redis-cluster
spec:
terminationGracePeriodSeconds: 20
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- redis
topologyKey: kubernetes.io/hostname
containers:
- name: redis
image: harbor.cncf.net/project/redis:6.2.6
imagePullPolicy: Always
command: ["redis-server", "/usr/local/redis/conf/redis.conf"]
env:
- name: POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
resources:
requests:
cpu: "500m"
memory: "500Mi"
ports:
- containerPort: 6379
name: redis
protocol: TCP
- containerPort: 16379
name: cluster
protocol: TCP
volumeMounts:
- name: data
mountPath: /usr/local/redis/data
volumeClaimTemplates:
- metadata:
name: data
namespace: redis-test
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 5Gi

 

       查看pods

     

    查看pvc

   初始化redis创建集群

       进入data-redis-0 pod

root@master1:/dockerfile/project/redis-cluster# kubectl exec -it redis-0 -- bash

 

       安装dig

root@redis-0:/# apt install dnsutils -y

 

  初始化命令

redis-cli -a 123456 --cluster create --cluster-replicas 1 \
`dig +short redis-0.redis.redis-test.svc.cluster.local`:6379 \
`dig +short redis-1.redis.redis-test.svc.cluster.local`:6379 \
`dig +short redis-2.redis.redis-test.svc.cluster.local`:6379 \
`dig +short redis-3.redis.redis-test.svc.cluster.local`:6379 \
`dig +short redis-4.redis.redis-test.svc.cluster.local`:6379 \
`dig +short redis-5.redis.redis-test.svc.cluster.local`:6379

 

       创建redis集群

   

  验证node节点对应redis角色

   

  对应关系

  10.200.166.138——redis-0 master

  10.200.104.16——redis-1 master

  10.200.166.140——redis-2 master

  10.200.104.20——redis-3 slave

  10.200.166.141——redis-4 slave

  10.200.104.21——redis-5 slave

 

 

  

  查看集群状态信息

      

  登录集群节点验证写入数据

      

  故障测试:

       删除slave节点pod,验证redis集群自动更换pod ip。

       删除pod前,记录pod原IP

 

      

  删除后验证新pod ip已经从新加入集群

 

posted @   PunchLinux  阅读(94)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
  1. 1 Get Lucky Daft Punnk
  2. 2 烦恼歌 张学友
  3. 3 Way Back Home Conor Maynard
  4. 4 Put A Little Love In Your Heart Jackie DeShannon
  5. 5 菊次郎的夏天 久石譲
  6. 6 一丝不挂 陈奕迅
  7. 7 日落大道 梁博
  8. 8 Rage your dream m.o.v.e
  9. 9 Don't Be So Shy Imany
  10. 10 芒种 腾格尔
烦恼歌 - 张学友
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

Not available

点击右上角即可分享
微信分享提示