Kubernetes学习总结(16)—— Kubernetes 实战之部署 Redis 集群
发布日期:2025-04-03 06:15:30 浏览次数:8 分类:精选文章

本文共 3743 字,大约阅读时间需要 12 分钟。

(username, 分数) Deploy Redis 集群 在 Kubernetes 中 (latest version)

部署 Redis 集群 在 Kubernetes 中 是 个 有 技术挑战 的 工作。 以下 是 这 个 文章 的 优化版本.


一、问题分析

在 Kubernetes 上 部署 Redis 集群 和 部署普通 应用 实质上 没什 大 不同,但需要 注意 几个关键问题.

  • Redis 是一个有状态的应用:每个 Pod 内部 的 缓存 数据 都 不 一样,且 Pod 的 IP 会 随时 更变。这意味着普通的 Deployment 和 Service 无法 满足需求,因此需要改 用 StatefulSet + Headless Service.

  • 数据持久化:Redis 虽然 基于 内存'l缓存,但依然需要 持久 化存储 以 保证 故障 复减 后 可恢复 数据. 集群 部署 需要 使用 共享 文件 系统 + PV (持久 卷) 来 让 所有 Pod 共享 一 次 持久 化 存储.


  • 二、概念介绍

    1. Headless Service

    Headless Service 是 Service 中 没 有 指定 Cluster IP 的 特殊 Service. 它 的 DNS 解析 结果 不是一个 Cluster IP,而是它 所 关联 的 所有 Pod 的 IP 列表. 这种方式 在 Kubernetes 中 适合 需要 每个 Pod 的 IP 精确 确知 的场景.

    2. StatefulSet

    StatefulSet 是 Kubernetes 中 用于 管理 有 状态 应用 的 特殊 资源. 它 的 特点 是 每个 Pod 都 有 唯一 的 网络标识,并且按照 数字 规律 生成,例如 redis-0, redis-1等. StatefulSet 还 配合 Headless Service 使用,确保每个 Pod 的 存储 不会 被销毁.


    三、方案设计

    为了 实现 Redis 集群 在 Kubernetes 中 的 有 状态 部署, 可 以 采用以下 方案:

  • 共享 文件 系统:使用 NFS 等 共享 文件 系统 为 Redis 集群 提供 持久 化 存储.

  • 配置 PV 和 PVC:为每个 Pod 分配 持久 卷,确保 数据 的 持久 化 存储.

  • 创建 ConfigMap:上传 Redis 配置 文件, 并 配置 集群 参数.

  • 创建 Headless Service:配置 DNS 解析 格式 为 <podname>.<headless service name>.

  • 创建 StatefulSet:指定服务名称、副本数、磁盘存储等 参数.


  • 四、实际操作

    1. 创建 ConfigMap

  • 打开 文本 편집 器, 创建 配置 文件 redis.conf.

    appendonly yescluster-enabled yescluster-node-timeout 5000dir /var/lib/redisport 6379
  • 运行以下 命令 创建 ConfigMap:

    kubectl create configmap redis-conf --from-file redis.conf
  • 2. 创建 Headless Service

    apiVersion: v1kind: Servicemetadata:  name: redis-service  labels:    app: redis  spec:    ports:    - name: redis-port      port: 6379    clusterIP: None    selector:      app: redis

    3. 创建 StatefulSet

    apiVersion: apps/v1beta1kind: StatefulSetmetadata:  name: redis-appspec:  serviceName: redis-service  replicas: 6  template:    metadata:      labels:        app: redis        appCluster: redis-cluster    spec:      terminationGracePeriodSeconds: 20      affinity:        podAntiAffinity:          preferredDuringSchedulingIgnoredDuringExecution:          - weight: 100            podAffinityTerm:              labelSelector:                matchExpressions:                - key: app                  operator: In                  values: [redis]      topologyKey: kubernetes.io/hostname  containers:  - name: redis    image: registry.cn-qingdao.aliyuncs.com/gold-faas/gold-redis:1.0    command: [redis-server, /etc/redis/redismodify]    args:    - /etc/redis/redismodify    - --protected-mode    - no    resources:      requests:        cpu: 100m        memory: 100Mi      limits:        cpu: 200m        memory: 200Mi    ports:    - name: redis      containerPort: 6379      protocol: TCP    - name: cluster      containerPort: 16379      protocol: TCP    volumeMounts:    - name: redis-conf      mountPath: /etc/redis    - name: redis-data      mountPath: /var/lib/redisvolumes:  - name: redis-conf    configMap:      name: redis-conf      items:        - key: redis.conf          path: redis.conf  - name: redis-data    emptyDir: {}

    4. 初始化 Redis 集群

  • 创建一个 Ubuntu 噬 осуществ Redis 集群 管理节点.

    kubectl run -i --tty redis-cluster-manager --image=ubuntu --restart=Never /bin/bash
  • 在 Pod 内_THAT安装必要 工具 并 工具.

    wget http://download.redis.io/releases/redis-5.0.3.tar.gztar -xzf redis-5.0.3.tar.gzcd redis-5.0.3makecp src/redis-cli /usr/local/bin/
  • 3. 添加所有 Redis 节点 以完成集群 初始化: ```bash redis-cli --cluster create YOUR_MASTER_IP:6379 redis-cli --cluster add-node OTHER_MASTER_UB
    1. 进入一个 Redis 节点,验证 集群 状态.

    2. 五、部署后的 操作

      创建完成后,可以通过部署一个 Service 来 绕过 Headless Service:

      service:  apiVersion: v1  kind: Service  metadata:    name: gold-redis    labels:      app: redis  spec:    ports:    - name: redis-direct      protocol: TCP      port: 6379    selector:      app: redis

      总结

      通过以上步骤,可以 在 Kubernetes 中 部署一个高可用性 Redis 集群。StatefulSet 和 Headless Service 的 结合 为 有 状态 应用 提供了 可靠 的 部署方式.

    上一篇:Kubernetes学习总结(17)—— Kubernetes 快速入门需要掌握的知识点总结
    下一篇:Kubernetes学习总结(15)—— Kubernetes 实战之部署 Mysql 集群

    发表评论

    最新留言

    感谢大佬
    [***.8.128.20]2025年05月04日 07时57分17秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章

    Kubernetes学习总结(9)—— 基础架构的未来是 K8s,那么 K8s 的未来在何方? 2025-04-03
    kubernetes实战(十三):k8s使用helm持久化部署harbor集成openLDAP登录 2025-04-03
    Kubernetes实战(一)-Kubernetes集群搭建 2025-04-03
    Kubernetes实战(七)-优先级调度(Pod Priority Preemption) 2025-04-03
    Kubernetes实战(三十一)-Calico网络部署(推荐) 2025-04-03
    Kubernetes实战(三十三)-外部Etcd集群部署与调优(更安全的数据存储策略) 2025-04-03
    Kubernetes实战(三十二)-Kubeadm 安装 Kubernetes v1.24.0 2025-04-03
    Kubernetes实战(三十)-HTTP 7层路由机制(Ingress) 2025-04-03
    Kubernetes实战(三)-定向调度(NodeSelector) 2025-04-03
    Kubernetes实战(九)-初始化容器(Init Container) 2025-04-03
    Kubernetes实战(二十七)-集群访问外部服务(Endpoints) 2025-04-03
    Kubernetes实战(二十三)-kubernetes二进制文件方式部署集群(安全)(上) 2025-04-03
    Kubernetes实战(二十九)-集群资源管理(CPU & Memory) 2025-04-03
    Kubernetes实战(二十二)-Etcd 集群部署(安全) 2025-04-03
    Kubernetes实战(二十五)-Flannel 网络部署(不推荐,不支持 Etcd3) 2025-04-03
    Kubernetes实战(二十八)-环境共享与隔离(Namespace) 2025-04-03
    Kubernetes实战(二十六)-高可用负载均衡与外部服务(Service) 2025-04-03
    Kubernetes实战(二十四)-kubernetes二进制文件方式部署集群(安全)(下) 2025-04-03
    Kubernetes实战(十三)-标签选择器(Label) 2025-04-03
    Kubernetes实战(十五)-敏感数据管理(Secret) 2025-04-03