Kubernetes集群中用三个节点部署Redis集群
本文介绍了在Kubernetes集群中部署Redis三主三从集群的配置方案。主要内容包括:1) 使用ConfigMap配置Redis主从节点参数,包括集群模式、认证密码等;2) 通过PersistentVolumeClaim为每个节点提供30GB持久化存储;3) 定义Headless Service用于服务发现;4) 使用StatefulSet部署主从节点,设置节点亲和性确保Pod分布在指定节点上
#Redis集群三主部署
#定义kubernetes ConfigMap资源用于配置Redis集群
apiVersion: v1
kind: ConfigMap
metadata:
name: redis-conf
namespace: redis-tool
data:
redis.conf: |
protected-mode no
appendonly yes
cluster-enabled yes #启用集群模式
cluster-config-file /var/lib/redis/nodes.conf #集群配置文件路径
cluster-node-timeout 5000 #节点超时时间(毫秒)
dir /var/lib/redis
port 6379 #监听端口
requirepass M2@25_redis #客户端连接密码
masterauth M2@25_redis #主从复制密码
---
#定义了一个Kubernetes PersistentVolumeClaim(PVC)资源
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
annotations:
volume.beta.kubernetes.io/storage-class: nfs-provisioner #指定存储类
volume.beta.kubernetes.io/storage-provisioner: choerodon.io/nfs-client-provisioner #NFS供应器
name: redis-data #pvc的名字需要和StatefulSet中的名字相同
namespace: redis-tool #命名空间
spec:
accessModes:
- ReadWriteMany #支持多节点读写
resources:
requests:
storage: 30Gi #请求30GB的存储空间
---
#定义了一个Kubernetes Headless Service资源
apiVersion: v1
kind: Service
metadata:
name: redis-service-master #服务名
namespace: redis-tool
labels:
app: redis
spec:
ports:
- name: redis-port
port: 6379 #master端口号
clusterIP: None
selector:
app: redis
appCluster: redis-cluster
---
#定义一个Kubernetes StatefulSet资源配置文件,用于部署一个高可用的Redis集群
apiVersion: apps/v1
kind: StatefulSet
metadata:
namespace: redis-tool
name: redis-app-master #有状态应用名称
spec:
serviceName: "redis-service-master"
replicas: 3 #副本数
selector:
matchLabels:
app: redis #使用标签选择器匹配
template:
metadata:
labels:
app: redis
appCluster: redis-cluster
spec:
hostNetwork: true
dnsPolicy: ClusterFirstWithHostNet
terminationGracePeriodSeconds: 20
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:#通过节点亲和性将Pod调度到指定的节点上
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values: #部署集群的节点IP
- 192.168.2.180
- 192.168.2.181
- 192.168.2.182
containers:
- name: redis
image: core.harbor.domain:443/tool/redis:5.0.5 #镜像地址
command:
- "redis-server"
args:
- "/etc/redis/redis.conf"
- "--protected-mode"
- "no"
- --cluster-announce-ip
- "$(MY_POD_IP)"
env:
- name: MY_POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
resources:
requests:
cpu: "100m"
memory: "100Mi"
ports:
- name: redis
containerPort: 6379 #redis服务端口
protocol: "TCP"
- name: cluster
containerPort: 16379 #集群总线端口
protocol: "TCP"
volumeMounts:
- name: "redis-conf"
mountPath: "/etc/redis" #挂在ConfigMap在这个目录
- name: "redis-data"
mountPath: "/var/lib/redis" #为每个Pod创建30GB的持久化存储挂载到这个目录
volumes:
- name: "redis-conf"
configMap:
name: "redis-conf"
items:
- key: "redis.conf"
path: "redis.conf"
volumeClaimTemplates: #动态卷声明模板
- metadata:
name: redis-data
spec:
accessModes: [ "ReadWriteMany" ]
resources:
requests:
storage: 30Gi
---
#Redis集群三从部署
##定义kubernetes ConfigMap资源用于配置Redis集群
apiVersion: v1
kind: ConfigMap
metadata:
name: redis-conf-slave
namespace: redis-tool
data:
redis.conf: |
protected-mode no
appendonly yes
cluster-enabled yes
cluster-config-file /var/lib/redis/nodes.conf
cluster-node-timeout 5000
dir /var/lib/redis
port 26379
requirepass M2@25_redis
masterauth M2@25_redis
---
#定义了一个Kubernetes Headless Service资源
apiVersion: v1
kind: Service
metadata:
name: redis-service-slave
namespace: redis-tool
labels:
app: redis
spec:
ports:
- name: redis-port
port: 16379
clusterIP: None
selector:
app: redis
appCluster: redis-cluster
---
#定义一个Kubernetes StatefulSet资源配置文件,用于部署一个高可用的Redis集群
apiVersion: apps/v1
kind: StatefulSet
metadata:
namespace: redis-tool
name: redis-app-slave
spec:
serviceName: "redis-service-slave"
replicas: 3
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
appCluster: redis-cluster
spec:
hostNetwork: true
dnsPolicy: ClusterFirstWithHostNet
terminationGracePeriodSeconds: 20
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- 192.168.2.180
- 192.168.2.181
- 192.168.2.182
containers:
- name: redis
image: core.harbor.domain:443/tool/redis:5.0.5
command:
- "redis-server"
args:
- "/etc/redis/redis.conf"
- "--protected-mode"
- "no"
- --cluster-announce-ip
- "$(MY_POD_IP)"
env:
- name: MY_POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
resources:
requests:
cpu: "100m"
memory: "100Mi"
ports:
- name: redis
containerPort: 16379
protocol: "TCP"
- name: cluster
containerPort: 16380
protocol: "TCP"
volumeMounts:
- name: "redis-conf"
mountPath: "/etc/redis"
- name: "redis-data"
mountPath: "/var/lib/redis"
volumes:
- name: "redis-conf"
configMap:
name: "redis-conf-slave"
items:
- key: "redis.conf"
path: "redis.conf"
volumeClaimTemplates: #动态卷声明模板
- metadata:
name: redis-data
spec:
accessModes: [ "ReadWriteMany" ]
resources:
requests:
storage: 30Gi
最后集群初始化
redis-cli --cluster create 192.168.2.180:6379 192.168.2.181:6379 192.168.2.182:6379 192.168.2.180:16379 192.168.2.181:16379 192.168.2.182:16379 --cluster-replicas 1 -a M2@25_redis
更多推荐


所有评论(0)