参考文档:

https://www.jb51.net/article/275999.htm

https://www.jb51.net/article/276003.htm

https://blog.csdn.net/sebeefe/article/details/124473706

https://blog.csdn.net/jiaohuizhuang6019/article/details/134499235

https://www.zhihu.com/question/448458021/answer/2870967376

https://zhuanlan.zhihu.com/p/445316238

数据目录初始化

1[zhangcong@master ~]$ mkdir -p /home/zhangcong/dev/redis-cluster/data/{1..6}
2[zhangcong@master ~]$ chmod -R 777 redis-cluster

k8s中创建redis集群的namespace

1[zhangcong@master k8s]$ kubectl create ns redis-cluster

创建存储的配置

[zhangcong@master k8s]$ vim redis-cluster-storage.yaml

 1
 2apiVersion: storage.k8s.io/v1
 3kind: StorageClass
 4metadata:
 5  name: redis-sc
 6  namespace: redis-cluster
 7provisioner: nfs-storage
 8---
 9apiVersion: v1
10kind: PersistentVolume
11metadata:
12  name: redis-pv1
13  namespace: redis-cluster
14spec:
15  storageClassName: redis-sc
16  capacity:
17    storage: 2Gi
18  accessModes:
19    - ReadWriteMany
20  hostPath:
21    path: /home/zhangcong/dev/redis-cluster/data/1
22---
23apiVersion: v1
24kind: PersistentVolume
25metadata:
26  name: redis-pv2
27  namespace: redis-cluster
28spec:
29  storageClassName: redis-sc
30  capacity:
31    storage: 2Gi
32  accessModes:
33    - ReadWriteMany
34  hostPath:
35    path: /home/zhangcong/dev/redis-cluster/data/2
36---
37apiVersion: v1
38kind: PersistentVolume
39metadata:
40  name: redis-pv3
41  namespace: redis-cluster
42spec:
43  storageClassName: redis-sc
44  capacity:
45    storage: 2Gi
46  accessModes:
47    - ReadWriteMany
48  hostPath:
49    path: /home/zhangcong/dev/redis-cluster/data/3
50---
51apiVersion: v1
52kind: PersistentVolume
53metadata:
54  name: redis-pv4
55  namespace: redis-cluster
56spec:
57  storageClassName: redis-sc
58  capacity:
59    storage: 2Gi
60  accessModes:
61    - ReadWriteMany
62  hostPath:
63    path: /home/zhangcong/dev/redis-cluster/data/4
64---
65apiVersion: v1
66kind: PersistentVolume
67metadata:
68  name: redis-pv5
69  namespace: redis-cluster
70spec:
71  storageClassName: redis-sc
72  capacity:
73    storage: 2Gi
74  accessModes:
75    - ReadWriteMany
76  hostPath:
77    path: /home/zhangcong/dev/redis-cluster/data/5
78---
79apiVersion: v1
80kind: PersistentVolume
81metadata:
82  name: redis-pv6
83  namespace: redis-cluster
84spec:
85  storageClassName: redis-sc
86  capacity:
87    storage: 2Gi
88  accessModes:
89    - ReadWriteMany
90  hostPath:
91    path: /home/zhangcong/dev/redis-cluster/data/6

应用配置:

1[zhangcong@master k8s]$ kubectl apply -f redis-cluster-storage.yaml

创建headless服务

[zhangcong@master k8s]$ vim redis-cluster-service.yaml

内容如下:

 1apiVersion: v1
 2kind: Service
 3metadata:
 4  labels:
 5    k8s.kuboard.cn/layer: db
 6    k8s.kuboard.cn/name: redis
 7  name: redis-headless-service
 8  namespace: redis-cluster
 9spec:
10  ports:
11    - name: redis-port
12      port: 6379
13      protocol: TCP
14      targetPort: 6379
15  selector:
16    k8s.kuboard.cn/layer: db
17    k8s.kuboard.cn/name: redis
18  clusterIP: None
19---
20apiVersion: v1
21kind: Service
22metadata:
23  labels:
24    k8s.kuboard.cn/layer: db
25    k8s.kuboard.cn/name: redis
26  name: redis-service
27  namespace: redis-cluster
28spec:
29  ports:
30    - name: redis-port
31      port: 6379
32      protocol: TCP
33      targetPort: 6379
34  selector:
35    k8s.kuboard.cn/layer: db
36    k8s.kuboard.cn/name: redis
37  type: NodePort

应用配置:

1[zhangcong@master k8s]$ kubectl apply -f redis-cluster-service.yaml
2service/redis-headless-service created

网络访问:pod名称.headless名称.namespace名称.svc.cluster.local

即:pod名称.redis-headless-service.redis-cluster.svc.cluster.local

创建redis对应pod集群

创建好Headless service后,就可以利用StatefulSet创建Redis 集群节点

vim redis-cluster-deploy.yaml

内容如下:

 1kind: ConfigMap
 2apiVersion: v1
 3metadata:
 4  name: redis-configmap
 5  namespace: redis-cluster
 6data:
 7  redisConfig: |
 8    # 一般配置
 9    bind 0.0.0.0
10    port 6379
11    daemonize no
12    requirepass 123456
13    appendonly yes
14    # 集群配置
15    cluster-enabled yes
16    cluster-config-file nodes.conf
17    cluster-node-timeout 5000
18---
19apiVersion: apps/v1
20kind: StatefulSet
21metadata:
22  name: redis
23  namespace: redis-cluster
24  labels:
25    k8s.kuboard.cn/layer: db
26    k8s.kuboard.cn/name: redis
27spec:
28  replicas: 6
29  selector:
30    matchLabels:
31      k8s.kuboard.cn/layer: db
32      k8s.kuboard.cn/name: redis
33  serviceName: redis-headless-service
34  template:
35    metadata:
36      labels:
37        k8s.kuboard.cn/layer: db
38        k8s.kuboard.cn/name: redis
39    spec:
40      terminationGracePeriodSeconds: 20
41      containers:
42        - name: redis
43          image: docker.io/library/redis:7.2.4
44          command: ["redis-server", "/etc/redis/redis.conf"]
45          ports:
46            - name: redis
47              containerPort: 6379
48              protocol: "TCP"
49            - name: cluster
50              containerPort: 16379
51              protocol: "TCP"
52          volumeMounts:
53            - name: "redis-conf"
54              mountPath: "/etc/redis"
55            - name: "redis-data"
56              mountPath: "/data"
57      volumes:
58        - name: "redis-conf"
59          configMap:
60            name: redis-configmap
61            items:
62              - key:  "redisConfig"
63                path: "redis.conf"
64  volumeClaimTemplates:
65    - metadata:
66        name: redis-data
67      spec:
68        accessModes: [ "ReadWriteMany" ]
69        resources:
70          requests:
71            storage: 1Gi
72        storageClassName: redis-sc

应用配置:

[zhangcong@master k8s]$ kubectl apply -f redis-cluster-deploy.yaml

查看 pod

1[zhangcong@master k8s]$ kubectl get all -n redis-cluster -o wide
2NAME          READY   STATUS    RESTARTS   AGE   IP             NODE         NOMINATED NODE   READINESS GATES
3pod/redis-0   1/1     Running   0          46s   10.244.0.111   master.com   <none>           <none>
4pod/redis-1   1/1     Running   0          43s   10.244.0.112   master.com   <none>           <none>
5pod/redis-2   1/1     Running   0          40s   10.244.0.113   master.com   <none>           <none>
6pod/redis-3   1/1     Running   0          37s   10.244.0.114   master.com   <none>           <none>
7pod/redis-4   1/1     Running   0          35s   10.244.0.115   master.com   <none>           <none>
8pod/redis-5   1/1     Running   0          32s   10.244.0.116   master.com   <none>           <none>

创建redis集群,查看集群状态

 1
 2### 进入任意一个pod
 3[zhangcong@master k8s]$ kubectl -n redis-cluster exec -it redis-0 -- /bin/sh
 4
 5 
 6### 创建master节点(任选三个节点)
 7
 8# redis-cli --cluster create 10.244.0.111:6379 10.244.0.112:6379 10.244.0.113:6379 10.244.0.114:6379 10.244.0.115:6379 10.244.0.116:6379 --cluster-replicas 1 -a 123456
 9......
10......
11......
12Can I set the above configuration? (type 'yes' to accept): yes
13......
14......
15......
16[OK] All nodes agree about slots configuration.
17>>> Check for open slots...
18>>> Check slots coverage...
19[OK] All 16384 slots covered.
20### 以上表示创建集群成功
21
22
23### 进入集群中,查看集群状态
24# redis-cli -a 123456
25Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
26127.0.0.1:6379> CLUSTER NODES
271b3f389f5277355abf442c3ce4379c25636541c6 10.244.0.116:6379@16379 slave fa68666c16412f3c5b4f14391be4863a189c4a06 0 1705759378000 2 connected
28cb864d798272e4ce2144d4f75ee514c929d889f1 10.244.0.114:6379@16379 slave 669a7052925dba198d4291a7e381e9d31cc447fe 0 1705759379857 3 connected
29669a7052925dba198d4291a7e381e9d31cc447fe 10.244.0.113:6379@16379 master - 0 1705759378849 3 connected 10923-16383
30bb99c0071e850fc9480966f2e61b3d6e848dc748 10.244.0.111:6379@16379 myself,master - 0 1705759378000 1 connected 0-5460
31fa68666c16412f3c5b4f14391be4863a189c4a06 10.244.0.112:6379@16379 master - 0 1705759379000 2 connected 5461-10922
328448862f61fc780c955aa5a0e26860a641fd08ca 10.244.0.115:6379@16379 slave bb99c0071e850fc9480966f2e61b3d6e848dc748 0 1705759378000 1 connected