一、部署方式
k8s 以statefulset方式部署redis集群
二、statefulset简介
StatefulSet是Kubernetes提供的管理有状态应用的负载管理控制器API。在Pods管理的基础上,保证Pods的顺序和一致性。与Deployment一样,StatefulSet也是使用容器的Spec来创建Pod,与之不同StatefulSet创建的Pods在生命周期中会保持持久的标记(例如Pod Name)。
StatefulSet适用于具有以下特点的应用:
具有固定的网络标记(主机名)
具有持久化存储
需要按顺序部署和扩展
需要按顺序终止及删除
需要按顺序滚动更新
二、安装NFS
2.1 NFS安装与配置
详见NFS服务安装与配置
2.2 创建 redis pv挂载目录
mkdir /data/tools/zk/pv
2.3 将redis pv挂载目录
2.3.1 方法一
直接挂载到NFS共享目录
2.3.2 方法二
将创建的redis pv挂载目录再挂载到NFS共享目录。
注:若都redis pv path都挂载到共享目录,则redis pv path不能相同
举例:
zk3个节点的path 对应NFS共享目录
共享目录1:/data/tools/pv/redis01
共享目录2:/data/tools/pv/redis02
共享目录3:/data/tools/pv/redis03
zk有3个节点要挂3个pv
pv1 name: k8s-pv-redis1
pv1 path:/data/tools/pv/redis01
pv2 name: k8s-pv-redis2
pv2 path:/data/tools/pv/redis02
pv3 name: k8s-pv-redis3
pv3 path:/data/tools/pv/redis03
注:pv path的路径要与NFS共享目录保持一致。
三、创建PV与PVC
3.1 PV与PVC简介
PersistentVolume(PV)是集群中由管理员配置的一段网络存储。 它是集群中的资源,就像节点是集群资源一样。 PV是容量插件,如Volumes,但其生命周期独立于使用PV的任何单个pod。 此API对象捕获存储实现的详细信息,包括NFS,iSCSI或特定于云提供程序的存储系统。
PersistentVolumeClaim(PVC)是由用户进行存储的请求。 它类似于pod。 Pod消耗节点资源,PVC消耗PV资源。Pod可以请求特定级别的资源(CPU和内存)。声明可以请求特定的大小和访问模式(例如,可以一次读/写或多次只读)。
3.2 编写PV与PVC的yaml文件
pv-redis.yaml
kind: PersistentVolume
apiVersion: v1
metadata:
name: pv-redis1
namespace: tools
annotations:
volume.beta.kubernetes.io/storage-class: "anything"
labels:
type: local
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
hostPath:
path:/data/tools/pv/redis01
persistentVolumeReclaimPolicy: Recycle
---
kind: PersistentVolume
apiVersion: v1
metadata:
name: pv-redis2
namespace: tools
annotations:
volume.beta.kubernetes.io/storage-class: "anything"
labels:
type: local
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
hostPath:
path:/data/tools/pv/redis02
persistentVolumeReclaimPolicy: Recycle
---
kind: PersistentVolume
apiVersion: v1
metadata:
name: pv-redis3
namespace: tools
annotations:
volume.beta.kubernetes.io/storage-class: "anything"
labels:
type: local
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
hostPath:
path:/data/tools/pv/redis03
persistentVolumeReclaimPolicy: Recycle
注:以上方式是同时创建PV与PVC的yaml文件
3.3 创建pv与pvc
kubectl apply -fpv-redis.yaml
四、创建redis集群
4.1 编写redis.yaml文件
apiVersion: v1
kind: Service
metadata:
name:k8s-redis-hs
namespace: tools
labels:
app: k8s-redis
spec:
ports:
- port: 6305
name: redis-port
- port: 26305
name: sentinel-port
clusterIP: None
selector:
app: k8s-redis
---
apiVersion: v1
kind: Service
metadata:
name: k8s-redis
namespace: tools
labels:
app: k8s-redis
spec:
ports:
- port: 26305
name: sentinel-port
- port: 6305
name: redis-port
selector:
app: k8s-redis
---
apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
name: k8s-redis-pdb
namespace: tools
spec:
minAvailable: 2
selector:
matchLabels:
app: k8s-redis
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: ecs-k8s-redis #存储卷命名中间的 有状态副本集名称 容器组命名 -0 -1 -2
namespace: tools
spec:
selector:
matchLabels:
app: k8s-redis
serviceName: k8s-redis-hs
replicas: 3
updateStrategy:
type: RollingUpdate
podManagementPolicy: Parallel
template:
metadata:
labels:
app: k8s-redis
spec:
containers:
- name: k8s-redis
imagePullPolicy: Always
image: "redis镜像名称"
resources:
requests:
memory: "1Gi"
limits:
memory: "1Gi"
ports:
- containerPort: 26305
name: sentinel-port
- containerPort: 6305
name: redis-port
command:
- sh
- -c
- "/data/redis-4.0.9/bin/redis.sh \
--servers=3 \
--password=ECS_DEPLOY_REDIS_PASSWD"
#k8s探针,监控应用运行状态
livenessProbe:
initialDelaySeconds: 120 #容器起来多久才开始探测
periodSeconds: 5 #探针活性探测每隔5秒探测一次
timeoutSeconds: 5 #探针活性探测请求超时时间为5秒
failureThreshold: 3 #探测失败阈值,超过3次就代表该容器挂掉了,k8s将自动重启该容器
successThreshold: 1 #探测失败后成功1次就认为是成功的
tcpSocket:
port: 26305
volumeMounts:
- name: datadir
mountPath: /data/redis
volumeClaimTemplates:
- metadata:
name: datadir
annotations:
volume.beta.kubernetes.io/storage-class: "anything"
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 2Gi
4.2 执行redis.yaml文件
kubectl apply -f redis.yaml
4.3 对外暴露访问端口
#创建 redisService.yaml
touch redisService.yaml
#redisService.yaml
apiVersion: v1
kind: Service
metadata:
name: k8s-redis
namespace: tools
labels:
app: k8s-redis
spec:
type: NodePort
ports:
- port: 26305
name: sentinel-port
- port: 6305
name: redis-port
nodePort: 26305
selector:
app: k8s-redis
注:nodePort为对外暴露端口,端口号必须5位数字。建议与redis.yaml合并。
#执行redisService.yaml文件
kubectl apply -fredisService.yaml