Kubernetes(K8S)部署 Redis Cluster 集群

以下将详细介绍如何使用 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 集群。在实际生产环境中,还可以根据需要调整配置和资源,以满足业务需求。

相关推荐
70后写java的老码农5 分钟前
docker-compose 部署 Redis Stack Server 6.2.6-v19
redis·docker
weirong8 分钟前
图解 client-go Informer:手写一个 mini-Informer 才敢说懂
kubernetes
.冰块.20 分钟前
流量大了自动加 Pod!K8s HPA 扩缩容与 ResourceQuota/LimitRange 资源管控实战
linux·云原生·容器·kubernetes·hpa·quota·limitrange
方便面不加香菜1 小时前
Docker Container -- 容器命令详解
运维·docker·容器
小南家的青蛙1 小时前
Redis监控与告警体系化实践
redis·监控方案·告警方案
我不会起名字3222 小时前
Redis 从 0 到 1(二十七):JSON 体积是 Protobuf 的 3.7 倍?3 种序列化的 Go 基准测试
redis·go·序列化·protobuf·messagepack
我不会起名字3222 小时前
Redis 从 0 到 1(二十六):INFO memory 里 8 个关键数字——内存构成与容量规划
redis·容量规划·内存·info·listpack
我不会起名字3222 小时前
Redis 从 0 到 1(二十五):连接池又打满了——PoolSize 公式、泄漏排查与 PoolStats
redis·连接池·go-redis·排查·poolstats
我不会起名字3222 小时前
Redis 从 0 到 1(二十三):一个热 key 打到 10 万 QPS——hotkey 与本地缓存的 Go 实现
redis·缓存·go·qps·hotkey