# 1. nfs-redis-data的nfs存储类

---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  annotations:
    k8s.kuboard.cn/storageType: nfs_client_provisioner
  name: nfs-redis-data
parameters:
  archiveOnDelete: 'false'
provisioner: nfs-nfs-redis-data
reclaimPolicy: Retain
volumeBindingMode: Immediate

---
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations: {}
  labels:
    app: eip-nfs-nfs-redis-data
  name: eip-nfs-nfs-redis-data
  namespace: kube-system
spec:
  progressDeadlineSeconds: 600
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: eip-nfs-nfs-redis-data
  strategy:
    type: Recreate
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: eip-nfs-nfs-redis-data
    spec:
      containers:
        - env:
            - name: PROVISIONER_NAME
              value: nfs-nfs-redis-data
            - name: NFS_SERVER
              value: 172.16.109.178
            - name: NFS_PATH
              value: /data
          image: 'eipwork/nfs-subdir-external-provisioner:v4.0.2'
          imagePullPolicy: IfNotPresent
          name: nfs-client-provisioner
          resources: {}
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          volumeMounts:
            - mountPath: /persistentvolumes
              name: nfs-client-root
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      serviceAccount: eip-nfs-client-provisioner
      serviceAccountName: eip-nfs-client-provisioner
      terminationGracePeriodSeconds: 30
      volumes:
        - name: nfs-client-root
          persistentVolumeClaim:
            claimName: nfs-pvc-nfs-redis-data

---
apiVersion: v1
kind: PersistentVolume
metadata:
  annotations:
    pv.kubernetes.io/bound-by-controller: 'yes'
  finalizers:
    - kubernetes.io/pv-protection
  name: nfs-pv-nfs-redis-data
spec:
  accessModes:
    - ReadWriteMany
  capacity:
    storage: 20Gi
  claimRef:
    apiVersion: v1
    kind: PersistentVolumeClaim
    name: nfs-pvc-nfs-redis-data
    namespace: kube-system
  nfs:
    path: /data
    server: 172.16.109.178
  persistentVolumeReclaimPolicy: Retain
  storageClassName: nfs-storageclass-provisioner
  volumeMode: Filesystem

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  annotations:
    pv.kubernetes.io/bind-completed: 'yes'
  finalizers:
    - kubernetes.io/pvc-protection
  name: nfs-pvc-nfs-redis-data
  namespace: kube-system
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 20Gi
  storageClassName: nfs-storageclass-provisioner
  volumeMode: Filesystem
  volumeName: nfs-pv-nfs-redis-data
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111

可直接通过kuboard UI页面直接创建。

# 2. configmap.yaml

apiVersion: v1
data:
  redis.conf: |
    appendonly yes
    protected-mode no
    cluster-enabled yes          
    cluster-config-file /var/lib/redis/nodes.conf 
    cluster-node-timeout 5000    
    dir /var/lib/redis        
    port 6379
kind: ConfigMap
metadata:
  name: redis-cluster-configmap
1
2
3
4
5
6
7
8
9
10
11
12
13

# 3. StatefulSet.yaml

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: redis-app
spec:
  serviceName: redis-cluster-service
  replicas: 6
  selector:
    matchLabels:
      app: redis
      appCluster: redis-cluster
  template:
    metadata:
      labels:
        app: redis
        appCluster: redis-cluster
    spec:
      containers:
      - name: redis
        image: redis:latest
        imagePullPolicy: IfNotPresent
        command:
          - "redis-server"
        args:
          - "/etc/redis/redis.conf"
          - "--protected-mode"
          - "no"
        resources:
          requests:
            cpu: "100m"
            memory: "100Mi"
        ports:
        - name: redis
          containerPort: 6379
          protocol: "TCP"
        - name: cluster
          containerPort: 16379
          protocol: "TCP"
        volumeMounts:
          - name: redis-conf
            mountPath: /etc/redis
          - name: redis-pv-claim
            mountPath: /var/lib/redis
      volumes:
      - name: redis-conf
        configMap:
          name: redis-cluster-configmap
          items:
            - key: "redis.conf"
              path: "redis.conf"
  volumeClaimTemplates:
  - metadata:
      name: redis-pv-claim
    spec:
      accessModes: [ "ReadWriteMany","ReadWriteOnce"]
      resources:
        requests:
          storage: 1G
      storageClassName: nfs-redis-data
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59

# 4. Service.yaml

apiVersion: v1
kind: Service
metadata:
  annotations: {}
  name: redis-app
spec:
  ports:
    - name: redis-port
      port: 6379
      protocol: TCP
      targetPort: 6379
  selector:
    app: redis
    appCluster: redis-cluster
  type: NodePort
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 5. 构建集群

找到机器的IP执行构建集群

redis-cli --cluster create \
10.244.169.181:6379 \
10.244.169.182:6379 \
10.244.36.101:6379 \
10.244.169.179:6379 \
10.244.36.106:6379 \
10.244.169.178:6379 \
--cluster-replicas 1
1
2
3
4
5
6
7
8
redis-trib create --replicas 1 \
`dig +short redis-app-0.redis-service.demo-redis.svc.cluster.local`:6379 \
`dig +short redis-app-1.redis-service.demo-redis.svc.cluster.local`:6379 \
`dig +short redis-app-2.redis-service.demo-redis.svc.cluster.local`:6379 \
`dig +short redis-app-3.redis-service.demo-redis.svc.cluster.local`:6379 \
`dig +short redis-app-4.redis-service.demo-redis.svc.cluster.local`:6379 \
`dig +short redis-app-5.redis-service.demo-redis.svc.cluster.local`:6379
1
2
3
4
5
6
7
root@redis-app-0:/data# redis-cli --cluster create \
> 10.244.169.181:6379 \
> 10.244.169.182:6379 \
> 10.244.36.101:6379 \
> 10.244.169.179:6379 \
> 10.244.36.106:6379 \
> 10.244.169.178:6379 \
> --cluster-replicas 1
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 10.244.36.106:6379 to 10.244.169.181:6379
Adding replica 10.244.169.178:6379 to 10.244.169.182:6379
Adding replica 10.244.169.179:6379 to 10.244.36.101:6379
M: 9bcba06b9c362aaca5550dd64ee87c5f77509b3b 10.244.169.181:6379
   slots:[0-5460] (5461 slots) master
M: 8420ddbaae4e568378a128491821338d1ff60b0e 10.244.169.182:6379
   slots:[5461-10922] (5462 slots) master
M: 00c738cc5804e9e292f3978767486499ec5b7dee 10.244.36.101:6379
   slots:[10923-16383] (5461 slots) master
S: ae98709e96acac33c9c435bb3de6a9c9f9bb9702 10.244.169.179:6379
   replicates 00c738cc5804e9e292f3978767486499ec5b7dee
S: b1507f447bf674b8e91df3f8d7f94a158ec9e62b 10.244.36.106:6379
   replicates 9bcba06b9c362aaca5550dd64ee87c5f77509b3b
S: 4625ed3e0a057911f4bf396c428528f873f1c4bc 10.244.169.178:6379
   replicates 8420ddbaae4e568378a128491821338d1ff60b0e
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
.
>>> Performing Cluster Check (using node 10.244.169.181:6379)
M: 9bcba06b9c362aaca5550dd64ee87c5f77509b3b 10.244.169.181:6379
   slots:[0-5460] (5461 slots) master
root@redis-app-0:/data# redis-cli 
127.0.0.1:6379> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:38
cluster_stats_messages_pong_sent:44
cluster_stats_messages_sent:82
cluster_stats_messages_ping_received:39
cluster_stats_messages_pong_received:38
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:82
127.0.0.1:6379> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59

# 6. 测试

redis-app-0执行:

root@redis-app-0:/data# redis-cli -c
127.0.0.1:6379> set test 123
-> Redirected to slot [6918] located at 10.244.169.182:6379
OK
1
2
3
4

redis-app-4执行:

root@redis-app-4:/data# redis-cli -c
127.0.0.1:6379> get test
-> Redirected to slot [6918] located at 10.244.169.182:6379
"123"
1
2
3
4

# 参考资料