以下将详细介绍如何使用 Kubernetes(K8S)部署 Redis Cluster 集群,并给出相应的 YAML 代码。
1. 准备工作
在开始部署之前,需要确保已经安装并配置好 Kubernetes 集群,并且 kubectl
可以正常与集群通信。
2. 部署 Redis Cluster
2.1 创建 Namespace (可选)
创建一个名为 redis-cluster-namespace.yaml
的文件,内容如下:
yaml
apiVersion: v1
kind: Namespace
metadata:
name: redis-cluster
使用以下命令创建 Namespace:
bash
kubectl apply -f redis-cluster-namespace.yaml
2.1 创建 Redis 配置文件 ConfigMap
Redis Cluster 需要特定的配置,我们可以通过 ConfigMap 来管理这些配置。创建一个名为 redis-config.yaml
的文件,内容如下:
yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: redis-config
namespace: redis-cluster
data:
redis.conf: |
port 6379
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
# 如果需要密码认证,取消注释并替换密码
# requirepass yourpassword
# masterauth yourpassword
上述配置文件中,cluster-enabled yes
开启了 Redis Cluster 功能,cluster-config-file nodes.conf
指定了集群配置文件的名称,cluster-node-timeout 5000
表示节点超时时间为 5 秒,appendonly yes
开启了 AOF 持久化。
使用以下命令创建 ConfigMap:
bash
kubectl apply -f redis-config.yaml
2.2 创建 Redis 服务
创建一个名为 redis-service.yaml
的文件,用于定义 Redis 服务,内容如下:
yaml
apiVersion: v1
kind: Service
metadata:
name: redis-cluster-service
namespace: redis-cluster
spec:
selector:
app: redis-cluster
ports:
- protocol: TCP
port: 6379
targetPort: 6379
type: ClusterIP
这个服务将用于在集群内部暴露 Redis 节点,使用以下命令创建服务:
bash
kubectl apply -f redis-service.yaml
2.3 创建 Redis 有状态集(StatefulSet)
创建一个名为 redis-statefulset.yaml
的文件,用于定义 Redis 有状态集,内容如下:
yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: redis-cluster
namespace: redis-cluster
spec:
serviceName: redis-cluster-service
replicas: 6
selector:
matchLabels:
app: redis-cluster
template:
metadata:
labels:
app: redis-cluster
spec:
containers:
- name: redis
image: redis:6.2-alpine
ports:
- containerPort: 6379
- containerPort: 16379
command: ["/bin/sh", "-c"]
args:
- >
cp /redis-config/redis.conf /data/redis.conf &&
redis-server /data/redis.conf
volumeMounts:
- name: redis-config
mountPath: /redis-config
- name: redis-data
mountPath: /data
# 存活探针
livenessProbe:
exec:
command: ["redis-cli", "ping"]
initialDelaySeconds: 5
periodSeconds: 5
# 就绪探针
readinessProbe:
exec:
command: ["redis-cli", "ping"]
initialDelaySeconds: 5
periodSeconds: 5
volumes:
- name: redis-config
configMap:
name: redis-config
volumeClaimTemplates:
- metadata:
name: redis-data
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "standard" # 修改为你的存储类
resources:
requests:
storage: 1Gi
上述有状态集创建了 6 个 Redis 节点(一般 Redis Cluster 建议使用 6 个节点,3 主 3 从),并挂载了之前创建的 ConfigMap 和持久化存储卷。使用以下命令创建有状态集:
bash
kubectl apply -f redis-statefulset.yaml
2.4 创建 Redis 集群
等待所有 Redis 节点启动完成后,可以使用以下命令创建 Redis Cluster:
bash
kubectl exec -it redis-cluster-0 -- redis-cli --cluster create \
$(kubectl get pods -l app=redis-cluster -o jsonpath='{range.items[*]}{.status.podIP}:6379 ') \
--cluster-replicas 1
上述命令中,--cluster-replicas 1
表示每个主节点有 1 个从节点。
3. 验证 Redis Cluster 部署
可以使用以下命令进入任意一个 Redis 节点的容器,并验证集群是否正常工作:
bash
kubectl exec -it redis-cluster-0 -- redis-cli cluster info
kubectl exec -it redis-cluster-0 -- redis-cli cluster nodes
如果上述命令能够正常输出集群信息和节点信息,则说明 Redis Cluster 部署成功。
总结
通过以上步骤,我们使用 Kubernetes 的 ConfigMap、Service 和 StatefulSet 成功部署了 Redis Cluster 集群。在实际生产环境中,还可以根据需要调整配置和资源,以满足业务需求。