Kubernetes-基于Helm安装部署高可用的Redis

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 1、Redis简介 Redis是一个开放源代码(BSD许可证)的代理,其在内存中存储数据,可以代理数据库、缓存和消息。它支持字符串、散列、列表、集合和位图等数据结构。Redis 是一个高性能的key-value数据库, 它在很大程度改进了memcached这类key/value存储的不足。

1、Redis简介


Redis是一个开放源代码(BSD许可证)的代理,其在内存中存储数据,可以代理数据库、缓存和消息。它支持字符串、散列、列表、集合和位图等数据结构。Redis 是一个高性能的key-value数据库, 它在很大程度改进了memcached这类key/value存储的不足。Redis提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby和Erlang等语言的客户端。
Redis支持master/slave结构,数据可以从master向任意数量的slave上进行同步。Redis 与其它 key – value 缓存产品相比,具有以下三个方面特点:

  • 支持内存的持久化:可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用;
  • 支持多种数据结构:Redis不仅仅只是支持key-value类型的数据,还能够支持字符串、散列和列表等数据结构;
  • 支持主从结构:Redis支持主从结构,保证系统的高可用。

2、基于Sentinel模式的高可用方案

本文中的Redis高可用方案采用Sentinel(哨兵)模式,在集群出现故障的时候自动进行故障转移,保证集群的可用性。Redis Sentinel 为Redis提供了高可用性,这意味着通过使用Sentinel 可以创建一个Redis部署,在没有人为干预的情况下能够抵抗某些类型的失败。Sentiel的完整功能列表如下所示:

  • 监控:不间断的检查master/slave实例否是安装预期正常工作;
  • 通知:当 Redis 实例出现错误的时候,会使用程序(通过 API 接口)通知管理员;
  • 自动故障转移:在master发生故障时,哨兵会开启故障转移处理,将一台slave提升为master,其它的slave被重新配置使用新的master,当应用程序连接时使用新的地址配置;
  • 配置信息:Sentinel作为服务发现的权威来源,客户端连接到Sentinel去获取当前Redis master的地址,如果发生故障转移,Sentinel将会汇报新的服务器地址。

Sentinel本身是一套分布式系统,它被设计成能够进行多个进程间协同工作的模式,这样的好处如下:

  • 多个Sentinel一致明确给定的主机不再可用时,才会执行故障检测,这能够有效错报的概率。
  • 即使只有一个Sentinel在正常运行,Redis也是可用的,从而保证系统具有较高的健壮性。

Sentinel,Redis实例(master和slave)和连接到Sentinel和Redis的客户端的数量,也是一个具有特定属性的更大的分布式系统。在本文中,定制的Redis服务器镜像会确定执行它的Pod是redis的Sentinel、master还是slave,并启动适当的服务。这个Helm chart指示Sentinel状态与环境变量。如果没有设置,新启动的Pod将查询Kunbernetes的活动master。如果不存在,则它使用一种确定的方法来检测它是否应该作为master启动,然后将“master”或“slave”写入到称为redis-role的标签中。
redis-role=master Pod是集群启动的关键。在它们完成启动,sentinel将处于等待整体。所有其他的Pod等待sentinel识别主节点。运行Pod并设置标签podIP和runID。runID是每个redis服务器生成的唯一run_ID值的前几个字符。
在正常操作中,应该只有一个redis=master Pod。如果失败,Sentinel将提名一个新的master,并适当地改变所有的redis-role的值。
通过执行如下命令可以查看Pod所承担的角色:

$ kubectl get pods -L redis-role -namespace=kube-public

3、安装部署

2.1 环境要求

2.2 Helm char配置

下表列示了Redis chart的配置参数和默认值:

参数 描述 默认值
redis_image Redis镜像 quay.io/smile/redis:4.0.6r2
resources.master Redis主节点CPU/内存的资源请求/限制 Memory: 200Mi, CPU: 100m
resources.slave Redis从节点CPU/内存的资源请求/限制 Memory: 200Mi, CPU: 100m
resources.sentinel 哨兵节点CPU/内存的资源请求/限制 Memory: 200Mi, CPU: 100m
replicas.servers redis master/slave pods的副本数量 3
replicas.sentinels sentinel pods的副本数量 3
nodeSelector 为Pod指派的Node标签 {}
tolerations 为Pod指派的可容忍标签 []
servers.serviceType 设置”LoadBalancer”能够通过VPC进行访问 ClusterIP
servers.annotations 参考应用模式
rbac.create 是否应该创建RBAC资源 true
serviceAccount.create 是否创建代理所使用的service account名称 true
serviceAccount.name 被使用的service account。如果未进行设置,同时如果serviceAccount.create被设置为true,则Kubernetes会在后台以模板的全名创建一个service account。

在helm install中使用–set key=value 格式设置上述的参数值,例如:

$ helm install \
 --set redis_image=quay.io/smile/redis:4.0.6r2 \
 stable/redis-ha

2.3 持久化

redis将持久化数据保存在容器的/redis-master-datal路径下,安装时会创建一个PersistentVolumeClaim ,并将其挂接到容器内的目录。因此,需要在Kubernetes中提前提供一个PersistentVolume。

2.4 通过Chart安装Redis

通过执行如下的命令,在Kubernetes中部署Redis:

$ helm install stable/redis-ha --name=redis-ha --namespace=kube-public

通过上述命令,将以默认的配置在Kubernetes中部署Redis。默认情况下,chart会安装部署3个Sentinel Pod,1个master Pod和2个slave Pod。

3、Helm Chart分析

MySQL Chart的目录如下,其中,values为默认的配置文件,用于为部署提供默认值。templates目录下的YAML文件是在Kubernetes进行部署的配置文件。

redis-ha
--templates # 模板目录,当与values.yaml组合时,将生成有效的Kubernetes清单文件。 ----NOTES.txt
----_helpers.tpl
----redis-auth-secret.yaml
----redis-master-service.yalm
----redis-role.yaml
----redis-rolebinding.yaml
----redis-sentinel-deployment.yaml
----redis-sentinel-service.yaml
----redis-server-deployment.yaml
----redis-serviceaccount.yaml 
----redis-slave-service.yaml 
--Chart.yaml # 描述chart的信息 --README.md # 可读的chart介绍文件 --values.yaml # 默认配置文件

3.1 values.yaml

在values.yaml配置文件中设置了通过helm进行部署时的默认值。在values.yaml中,首先,定义了主Pod和哨兵Pod的请求和限制资源的要求;接着,通过nodeSelector和容忍度为Pod定义调度到哪个Node上;以及,指定容器所使用的镜像和其它的相关信息。

## Configure resource requests and limits ## ref: http://kubernetes.io/docs/user-guide/compute-resources/ ##
resources:
 server:
 requests:
 memory: 200Mi
 cpu: 100m
 limits:
 memory: 700Mi
 sentinel:
 requests:
 memory: 200Mi
 cpu: 100m
 limits:
 memory: 200Mi ## Node labels and tolerations for pod assignment ## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector  ## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#taints-and-tolerations-beta-feature
 nodeSelector: {}
 tolerations: [] ## Redis image version
redis_image: quay.io/smile/redis:4.0.8r0 ## replicas number for each component
replicas:
 servers: 3
 sentinels: 3
servers:
 serviceType: ClusterIP # [ClusterIP|LoadBalancer]
 annotations: {}

rbac: # Specifies whether RBAC resources should be created
 create: true

serviceAccount: # Specifies whether a ServiceAccount should be created
 create: true # The name of the ServiceAccount to use. # If not set and create is true, a name is generated using the fullname template
 name: ## Configures redis with AUTH (requirepass & masterauth conf params)
auth: false ## Redis password ## Defaults to a random 10-character alphanumeric string if not set and auth is true ## ref: https://github.com/kubernetes/charts/blob/master/stable/redis-ha/templates/redis-auth-secret.yaml ## ## redisPassword:

3.2 redis-server-deployment.yaml

此YAML配置文件用于定义Redis master/slave的部署。

apiVersion: extensions/v1beta1
kind: Deployment
metadata: # Pay attention to the redis-role label at runtime. The self-determination logic in the image sets  # this value accordingly.
 name: {{ template "redis-ha.fullname" . }}-server
 labels:
 name: {{ template "redis-ha.fullname" . }}-server
 redis-node: "true" {{ include "labels.standard" . | indent 4 }}
spec:
 replicas: {{ .Values.replicas.servers }} template:
 metadata:
 labels:
 app: {{ template "redis-ha.name" . }}
 release: {{ .Release.Name }}
 component: server
 name: {{ template "redis-ha.fullname" . }}-server
 redis-node: "true"
 spec:
 serviceAccountName: {{ template "redis-ha.serviceAccountName" . }} {{- if .Values.nodeSelector }}
 nodeSelector: {{ toYaml .Values.nodeSelector | indent 8 }} {{- end }} {{- if .Values.tolerations }}
 tolerations: {{ toYaml .Values.tolerations | indent 8 }} {{- end }}
 containers: - name: redis
 image: {{ .Values.redis_image }}
 resources: {{ toYaml .Values.resources.server | indent 10 }}
 env: - name: REDIS_SENTINEL_SERVICE_HOST
 value: "redis-sentinel" - name: REDIS_CHART_PREFIX
 value: {{ template "redis-ha.fullname" . }}- {{- if .Values.auth }} - name: REDIS_PASS
 valueFrom:
 secretKeyRef:
 name: {{ template "redis-ha.fullname" . }}
 key: auth
{{- end }}
 ports: - containerPort: 6379
 volumeMounts: - mountPath: /redis-master-data
 name: data
 volumes: - name: data

3.3 redis-master-service.yaml

此YAML配置文件为定义了redis master的服务,此服务暴露6379端口,以供在集群中使用。

apiVersion: v1
kind: Service
metadata:
 name: {{ template "redis-ha.fullname" . }}-master-svc
 labels: {{ include "labels.standard" . | indent 4 }}
 annotations: {{ toYaml .Values.servers.annotations | indent 4 }}
spec:
 ports: - port: 6379
 protocol: TCP
 targetPort: 6379
 selector:
 app: {{ template "redis-ha.name" . }}
 release: "{{ .Release.Name }}"
 redis-node: "true"
 redis-role: "master"
 type: "{{ .Values.servers.serviceType }}"

3.4 redis-slave-service.yaml

此YAML配置文件为定义了redis slave的服务,此服务暴露6379端口,以供在集群中使用。

apiVersion: v1
kind: Service
metadata:
 name: {{ template "redis-ha.fullname" . }}-slave-svc
 labels:
 role: service
{{ include "labels.standard" . | indent 4 }}
 annotations: {{ toYaml .Values.servers.annotations | indent 4 }}
spec:
 ports: - port: 6379
 protocol: TCP
 targetPort: 6379
 selector:
 app: {{ template "redis-ha.name" . }}
 release: "{{ .Release.Name }}"
 redis-node: "true"
 redis-role: "slave"
 type: "{{ .Values.servers.serviceType }}"

3.5 redis-sentinel-deployment.yaml

此YAML文件定义Sentinel部署,Sentinel用于监控和管理对于Redis的访问。

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
 name: {{ template "redis-ha.fullname" . }}-sentinel
 labels: {{ include "labels.standard" . | indent 4 }}
spec:
 replicas: {{ .Values.replicas.sentinels }} template:
 metadata:
 labels:
 app: {{ template "redis-ha.name" . }}
 release: {{ .Release.Name }}
 component: sentinel
 name: {{ template "redis-ha.fullname" . }}-sentinel
 spec:
 serviceAccountName: {{ template "redis-ha.serviceAccountName" . }} {{- if .Values.nodeSelector }}
 nodeSelector: {{ toYaml .Values.nodeSelector | indent 8 }} {{- end }} {{- if .Values.tolerations }}
 tolerations: {{ toYaml .Values.tolerations | indent 8 }} {{- end }}
 containers: - name: sentinel
 image: {{ .Values.redis_image }}
 resources: {{ toYaml .Values.resources.sentinel | indent 10 }}
 env: - name: SENTINEL
 value: "true" - name: REDIS_CHART_PREFIX
 value: {{ template "redis-ha.fullname" . }}- {{- if .Values.auth }} - name: REDIS_PASS
 valueFrom:
 secretKeyRef:
 name: {{ template "redis-ha.fullname" . }}
 key: auth
{{- end }}
 ports: - containerPort: 26379

3.6 redis-sentinel-service.yaml

此YAML文件用于在集群内容暴露Sentinel部署,以供其它应用访问和调用。

apiVersion: v1
kind: Service
metadata:
 name: {{ template "redis-ha.fullname" . }}-sentinel
 labels:
 name: {{ template "redis-ha.name" . }}-sentinel-svc
 role: service
{{ include "labels.standard" . | indent 4 }}
spec:
 ports: - port: 26379
 targetPort: 26379
 selector:
 app: {{ template "redis-ha.name" . }}
 release: "{{ .Release.Name }}"
 redis-role: "sentinel"

3.7 redis-serviceaccount.yaml

如果rbac.create的值为true,此YAML文件将创建一个名为{{template “redis-ha.serviceAccountName”.}}的service account。

{{- if .Values.serviceAccount.create -}}
apiVersion: v1
kind: ServiceAccount
metadata:
 name: {{ template "redis-ha.serviceAccountName" . }}
 labels:
 app: "redis-ha"
 chart: {{ .Chart.Name }}-{{ .Chart.Version }}
 heritage: {{ .Release.Service }}
 release: {{ .Release.Name }} {{- end -}}

3.8 redis-role.yaml

如果rbac.create的值为true,则此YAML文件将会定义名为{{template “redis-ha.fullname” .}}一个角色,此角色拥有获取、列示和修改pods的权限。

{{- if .Values.rbac.create -}}
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: Role
metadata:
 name: {{ template "redis-ha.fullname" . }}
 labels: {{ include "labels.standard" . | indent 4 }}
rules: - apiGroups: - ""
 resources: - pods
 verbs: - get - list
 - patch
{{- end -}}

3.9 redis-rolebinding.yaml

如果rbac.create的值为true,将上述创建的service account和角色进行绑定。

{{- if .Values.rbac.create -}}
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: RoleBinding
metadata:
 name: {{ template "redis-ha.fullname" . }}
 labels: {{ include "labels.standard" . | indent 4 }}
roleRef:
 apiGroup: rbac.authorization.k8s.io
 kind: Role
 name: {{ template "redis-ha.fullname" . }}
subjects: - kind: ServiceAccount
 name: {{ template "redis-ha.serviceAccountName" . }} {{- end -}}

3.10 redis-auth-secret.yaml

如果auth的值为true,则会创建一个保密字典。

{{- if .Values.auth -}}
apiVersion: v1
kind: Secret
metadata:
 name: {{ template "redis-ha.fullname" . }}
 labels: {{ include "labels.standard" . | indent 4 }}
type: Opaque
data: {{- if .Values.redisPassword }}
 auth: {{ .Values.redisPassword | b64enc | quote }} {{- else }}
 auth: {{ randAlphaNum 10 | b64enc | quote }} {{- end }} {{- end -}}

4、Redis部署环境验证

在Kubernetes集群中,可以通过DNS名称{{ template “redis-ha.fullname” . }}.{{ .Release.Namespace }}.svc.cluster.local和端口6379访问redis集群。
如果设置了认证的话,通过下面的步骤连接Redis:
1)获取随机创建的redis密码:
echo $(kubectl get secret {{ template “redis-ha.fullname” . }} -o “jsonpath={.data[‘auth’]}” | base64 -D)
2)使用客户端连接Redis master Pod:
kubectl exec -it $(kubectl get pod -o jsonpath='{range .items[*]}{.metadata.name} {.status.containerStatuses[0].state}{“\n”}{end}’ -l redis-role=master | grep running | awk ‘{print $1}’) bash
3)在容器内使用Redis CLI连接:
redis-cli -a <REDIS-PASS-FROM-SECRET>
如果未设置认证的话,通过下面的步骤连接Redis:
1)可以通过下面的命令运行Redis Pod,作为客户端:

获取当前系统中的Pods:

$ kubectl get pods -L redis-role --namespace=kube-public

以名称为redis-ha-redis-ha-server-79659c558f-lgrtg的Pod作为客户端:

$ kubectl exec -it redis-ha-redis-ha-server-79659c558f-lgrtg --namespace=kube-public bash

2)使用Redis CLI:

获取Redis的master服务名称:

$ kubectl get svc --namespace=kube-public
$ redis-cli -h redis-ha-redis-ha-master-svc.kube-public -p 6379
本文转自kubernetes中文社区- Kubernetes-基于Helm安装部署高可用的Redis
相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
3月前
|
关系型数据库 应用服务中间件 nginx
Docker一键安装中间件(RocketMq、Nginx、MySql、Minio、Jenkins、Redis)
本系列脚本提供RocketMQ、Nginx、MySQL、MinIO、Jenkins和Redis的Docker一键安装与配置方案,适用于快速部署微服务基础环境。
|
19天前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
175 5
kde
|
20天前
|
存储 NoSQL Redis
手把手教你用 Docker 部署 Redis
Redis是高性能内存数据库,支持多种数据结构,适用于缓存、消息队列等场景。本文介绍如何通过Docker快速拉取轩辕镜像并部署Redis,涵盖快速启动、持久化存储及docker-compose配置,助力开发者高效搭建稳定服务。
kde
424 6
|
6月前
|
NoSQL 数据可视化 关系型数据库
安装 Redis
本文主要介绍了Linux系统下Redis的安装步骤,包括卸载旧版本、下载新版本、编译安装以及配置启动等详细操作,并解释了Redis默认端口6379的由来。同时,文章还简要说明了Windows环境下Redis的下载与服务安装方法。最后,推荐了几款Redis可视化管理工具,如RedisView、QuickRedis、AnotherRedisDesktopManager和RedisPlus,提供了它们的功能特点及下载链接,方便用户根据需求选择合适的工具进行数据库管理。
479 1
|
5月前
|
消息中间件 NoSQL Linux
Redis的基本介绍和安装方式(包括Linux和Windows版本),以及常用命令的演示
Redis(Remote Dictionary Server)是一个高性能的开源键值存储数据库。它支持字符串、列表、散列、集合等多种数据类型,具有持久化、发布/订阅等高级功能。由于其出色的性能和广泛的使用场景,Redis在应用程序中常作为高速缓存、消息队列等用途。
880 16
|
5月前
|
JSON NoSQL Redis
在Rocky9系统上安装并使用redis-dump和redis-load命令的指南
以上步骤是在Rocky9上使用redis-dump和redis-load命令顺利出行的秘籍。如果在实行的过程中,发现了新的冒险和挑战,那么就像一个勇敢的航海家,本着探索未知的决心,解决问题并前进。
189 14
|
8月前
|
存储 NoSQL Redis
Docker 部署 Redis
在使用 Docker 部署 Redis 时,为实现数据持久化,需正确挂载容器内的数据目录到宿主机。推荐命令如下: ``` docker run -d --name redis -v /mnt/data/redis:/data -p 6379:6379 redis ``` 该命令将宿主机的 `/mnt/data/redis` 目录挂载到容器的 `/data` 目录,确保 Redis 数据持久化。此路径更通用,适合大多数场景。避免使用不匹配的挂载路径,如 `/var/lib/redis` 或 `/mnt/data/redis` 到非默认目录,以防止数据无法正确持久化。
|
7月前
|
NoSQL Ubuntu 网络安全
在 Ubuntu 20.04 上安装和配置 Redis
在 Ubuntu 20.04 上安装和配置 Redis 的步骤如下:首先更新系统包,然后通过 `apt` 安装 Redis。安装后,启用并启动 Redis 服务,检查其运行状态。可选配置包括修改绑定 IP、端口等,并确保防火墙设置允许外部访问。最后,使用 `redis-cli` 测试 Redis 功能,如设置和获取键值对。
308 1
|
7月前
|
人工智能 运维 Kubernetes
2025 超详细!Lens Kubernetes IDE 多平台下载安装与集群管理教程
Lens 是一款企业级 Kubernetes 可视化操作平台,2025版实现了三大技术革新:AI智能运维(异常检测准确率98.7%)、多云联邦管理(支持50+集群)和实时3D拓扑展示。本文介绍其安装环境、配置流程、核心功能及高阶技巧,帮助用户快速上手并解决常见问题。适用于 Windows、macOS 和 Ubuntu 系统,需满足最低配置要求并前置依赖组件如 kubectl 和 Helm。通过 Global Cluster Hub 实现多集群管理,AI辅助故障诊断提升运维效率,自定义监控看板和插件生态扩展提供更多功能。
|
7月前
|
NoSQL Java Redis
微服务——SpringBoot使用归纳——Spring Boot 中集成Redis——Redis 安装
本教程介绍在 VMware 虚拟机(CentOS 7)或阿里云服务器中安装 Redis 的过程,包括安装 gcc 编译环境、下载 Redis(官网或 wget)、解压安装、修改配置文件(如 bind、daemonize、requirepass 等设置)、启动 Redis 服务及测试客户端连接。通过 set 和 get 命令验证安装是否成功。适用于初学者快速上手 Redis 部署。
177 0

推荐镜像

更多