一、前言
在K8s1.19.6上部署Redis5.0.8 集群,采用StatefulSet模式进行部署
二、准备操作
本次部署主要基于该项目:
https://gitee.com/overroot/redis-cluster-on-k8s
这位大佬采取的是ceph存储,但自己的环境是nfs存储故进行改动
dockerfile也是引用这位大佬的,直接从dockerhub直接拉下来一个redis.5.0.8镜像直接用就行
三、StatefulSet简介
statefulset是为了解决有状态服务的问题,而产生的一种资源类型(deployment和replicaSets是解决无状态服务而设计的)
常见的有mysql、redis、elasticsearch等等,带数据的基本上都是有状态服务;无状态服务有nginx、tomcat等等
四、部署过程
1.创建namespace
2.创建redis使用的storageclass
3.创建存储nodeip的PVC
4.创建Configmap
5.创建headless服务和对外service服务
6.创建Redis StatefulSet
7.初始化Redis集群建立三主三从
1.创建namespace
apiVersion: v1
kind: Namespace
metadata:
name: redis
2、创建redis使用的storageclass
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: redis-storageclass
provisioner: nfs-storage-01
allowVolumeExpansion: true
reclaimPolicy: Retain
3、创建存储nodeip的PVC
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: redis-cluster-data-ips-claim
namespace: redis
spec:
accessModes:
- ReadWriteMany
storageClassName: redis-storageclass
resources:
requests:
storage: 100Mi
4、创建redis的Configmap
apiVersion: v1
kind: ConfigMap
metadata:
name: redis-conf
namespace: redis
data:
redis.conf: |
port 6379
dir /data
daemonize yes
cluster-enabled yes
cluster-node-timeout 15000
cluster-config-file nodes.conf
appendonly yes
appendfilename "appendonly.aof"
protected-mode no
5.创建headless服务和对外service服务
kind: Service
apiVersion: v1
metadata:
name: redis-cluster-svc
namespace: redis
labels:
app: redis-cluster
spec:
selector:
app: redis-cluster
clusterIP: None
ports:
- port: 6379
targetPort: 6379
---
apiVersion: v1
kind: Service
metadata:
name: redis-access-service
namespace: redis
spec:
selector:
app: redis-cluster
type: NodePort
ports:
- name: redis-port
protocol: "TCP"
port: 6379
targetPort: 6379
nodePort: 32000
6.创建Redis StatefulSet
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: redis-cluster
namespace: redis
spec:
serviceName: redis-cluster-svc
replicas: 6
selector:
matchLabels:
app: redis-cluster
# updateStrategy:
# type: RollingUpdate
podManagementPolicy: Parallel
template:
metadata:
labels:
app: redis-cluster
spec:
containers:
- name: redis-cluster
image: 192.168.238.156/redis/redis508:latest
imagePullPolicy: Always
command: ["/usr/local/bin/start.sh"]
resources:
limits:
cpu: "0.5"
memory: 512Mi
requests:
cpu: "0.1"
memory: 100Mi
ports:
- containerPort: 6379
name: port1
protocol: TCP
volumeMounts:
- name: data
mountPath: "/data"
- name: redis-conf
mountPath: "/etc/redis/"
- name: data-ips
mountPath: "/data-ips"
env:
- name: TZ
value: "Asia/Shanghai"
- name: MY_POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
volumes:
- name: data-ips
persistentVolumeClaim:
claimName: redis-cluster-data-ips-claim
- name: redis-conf
configMap:
name: redis-conf
items:
- key: redis.conf
path: redis.conf
initContainers:
- name: init-redis
image: 192.168.238.156/busybox/busybox:latest
command:
- sh
- -c
- |
ulimit -n 65536
echo 511 > /proc/sys/net/core/somaxconn
echo 'vm.overcommit_memory=1' > /etc/sysctl.conf
mount -o remount rw /sys
echo 'never' > /sys/kernel/mm/transparent_hugepage/enabled
echo 'never' > /sys/kernel/mm/transparent_hugepage/defrag
securityContext:
privileged: true
volumeClaimTemplates:
- metadata:
name: data
labels:
app: redis-cluster
namespace: redis
spec:
accessModes: [ "ReadWriteMany" ]
storageClassName: redis-storageclass
resources:
requests:
storage: 1Gi
7.初始化Redis集群建立三主三从
因为之前重启了模拟了掉电故障所有k8s节点宕机来看看redis集群是否恢复正常,所以pod节点ip可能有出入但不影响
1、先执行命令查看redis-podip我们好对集群进行配置
kubectl get pods -n redis -owide
2、 等redispod起来后进入到redis-cluster-0
kubectl exec -ti -n redis redis-cluster-0 bash
3、 配置redis集群节点之间相互发现
互相发现只需要在一个节点上操作即可,我这里选择的是redis-cluster-0
6个redis节点已经全部发现
4、配置cluster分配槽位,redis集群部署成功!