安装NFS

NFS安装可以参照我前面的几篇文章,这边就略过了

cat /etc/exports
/redis/pv *(async,insecure,no_root_squash,no_subtree_check,rw)

mkdir -p /redis
systemctl restart rpcbind
systemctl restart nfs

创建名称空间

apiVersion: v1
kind: Namespace
metadata:
name: redis-cluster
labels:
name: redis-cluster

创建configmap

准备一份redis.conf文件放到/redis目录下,修改redis.conf下面配置

bind 0.0.0.0
dir /data
pidfile /data/redis_6379.pid
logfile "/data/redis.log"
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 15000
appendonly yes
protected-mode no
requirepass 123456
masterauth 123456
kubectl create configmap redis-conf --from-file=/redis/redis.conf -n redis-cluster

创建headless

apiVersion: v1
kind: Service
metadata:
name: myredis
namespace: redis-cluster
spec:
clusterIP: None
selector:
app: myredis
ports:
- port: 6379

创建statefulset

我这边是使用基于storageclass的nfs,动态提供pv,基于storageclass的nfs-client请查看前面的文章

apiVersion: apps/v1
kind: StatefulSet
metadata:
name: redis-cluster
namespace: redis-cluster
spec:
replicas: 6
selector:
matchLabels:
app: myredis
serviceName: myredis
volumeClaimTemplates:
- metadata:
name: redis-data
annotations:
volume.beta.kubernetes.io/storage-class: "managed-nfs-storage"
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 1Gi
template:
metadata:
labels:
app: myredis
spec:
volumes:
- name: redis-conf
configMap:
name: redis-conf
containers:
- name: redis
image: redis:5.0.5
imagePullPolicy: IfNotPresent
ports:
- containerPort: 6379
volumeMounts:
- mountPath: /data/redis.conf
name: redis-conf
subPath: redis.conf
- mountPath: /data
name: redis-data
command:
- redis-server
- /data/redis.conf

构建集群

可以看出来我们的6个redis都起来了,并且每个redis都有自己的存储


下面我们在创建一个基础centos7的容器,通过redis-cli去构建集群

kubectl run -it centos7 --image=centos:7 --restart=Never -n redis-cluster /bin/bash

安装redis

yum install -y gcc vim wget make bind-utils
cd /usr/local/src
wget http://download.redis.io/releases/redis-5.0.3.tar.gz
cd redis-5.0.5
make
cd src
make install

使用redis-cli构建集群

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

如上,命令 dig +short redis-cluster-0.myredis.redis-cluster.svc.cluster.local 用于将pod的域名转化为ip

到此为止,我们的redis cluster集群已经创建完毕

测试

redis-cli -c -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.

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:895
cluster_stats_messages_pong_sent:845
cluster_stats_messages_sent:1740
cluster_stats_messages_ping_received:840
cluster_stats_messages_pong_received:895
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:1740


127.0.0.1:6379> cluster nodes
b1d33e5a9d30c2c6e698e67eb0bee8a6cf81713b 10.244.2.72:6379@16379 myself,master - 0 1600394683000 1 connected 0-5460
eac16b517d15281bbd9519ae7e30225734fba776 10.244.1.108:6379@16379 master - 0 1600394684000 2 connected 5461-10922
c17c159a5eacc2ff856b7237e100f1ae6fd62f83 10.244.2.74:6379@16379 slave eac16b517d15281bbd9519ae7e30225734fba776 0 1600394685000 5 connected
72827e742cb17b844794b78ef1874551ee14358d 10.244.2.73:6379@16379 master - 0 1600394685791 3 connected 10923-16383
353c8a0f85491bfb3f7347281846ae99bd072b2b 10.244.1.110:6379@16379 slave 72827e742cb17b844794b78ef1874551ee14358d 0 1600394684000 6 connected
e15013580f59ce4f0f197ffdc69b6c86ceea5185 10.244.1.109:6379@16379 slave b1d33e5a9d30c2c6e698e67eb0bee8a6cf81713b 0 1600394684000 4 connected