手动在集群内部署 Redis 会比较零散,本文通过 Helm 安装 Redis 单节点和集群模式的服务,使用 Bitnami 社区维护的 Redis Chart 仓库,其中的服务大多经过良好封装及验证,可靠性及易用性都有所保障,适合在测试、要求不高的生产环境中使用。
准备 StorageClass
一般由集群维护者创建 StorageClass 及 Elastic File System (EFS) 。
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: efs-sc
mountOptions:
- tls
parameters:
directoryPerms: '700'
fileSystemId: fs-01bfa2ujlc834285d
provisioningMode: efs-ap
provisioner: efs.csi.aws.com
reclaimPolicy: Delete
volumeBindingMode: Immediate
开发人员使用存储时知晓 StorageClass 的名称(efs-sc)
部署 6.2 版本 Redis Standalone
Bitnami Redis Chart 页面: Bitnami Redis Chart
部署命令如下
# 添加仓库
$ helm repo add bitnami https://charts.bitnami.com/bitnami
# 安装 Redis
$ helm install redis-62 bitnami/redis --version 16.13.2 \
--set-string master.persistence.storageClass=efs-sc \
--set-string replica.persistence.storageClass=efs-sc \
--set-string image.tag=6.2.14-debian-11-r2 \
--set replica.replicaCount=0 \
--set auth.enabled=false \
-n common
# 卸载 Redis
# $ helm uninstall redis-62 -n common
参数说明:
- 因项目对 Redis 版本有要求,指定 Redis Chart 的版本为 16.13.2 是因为其是最后一个使用 6.2.x 版本的 Helm Chart
- 此处指定了 StorageClass,如果所需的 StorageClass 为 Default 默认时,无需通过参数显示指定
- 16.13.2 版本 Chart 内默认是 6.2.7 版本的 Redis,通过参数设置为 6.2.14 是因为这个 Tag 只支持 linux/amd64(此处查看)直到近期 bitnami/redis 镜像才支持 linux/arm64 架构(此处查看)并且推送了 6.2 版本的多架构镜像。因 EKS 集群使用的是 Arm 架构的节点,所以此处进行了替换,否则不推荐替换镜像版本。
- 默认创建 3 个副本,在测试环境只部署单个主节点即可
- 集群内服务访问 Redis 无需密码,通过开关关闭
- Redis 服务被部署到 common 命名空间
部署 7.x 版本 Redis Standalone
跟 6.2 部署同理,命令如下,7.x 版本镜像支持 arm64,无需替换
7.0 版本
$ helm install redis-70 bitnami/redis --version 17.17.1 \
--set-string master.persistence.storageClass=efs-sc \
--set-string replica.persistence.storageClass=efs-sc \
--set replica.replicaCount=0 \
--set auth.enabled=false \
-n common
7.2 版本
$ helm install redis-72 bitnami/redis --version 18.6.1 \
--set-string master.persistence.storageClass=efs-sc \
--set-string replica.persistence.storageClass=efs-sc \
--set replica.replicaCount=0 \
--set auth.enabled=false \
-n common
部署 6.2 版本 Redis Cluster
Bitnami Redis Cluster Chart 页面:Bitnami Redis Cluster Chart
$ helm install redis-cluster-62 bitnami/redis-cluster --version 7.6.4 \
--set-string global.storageClass=efs-sc \
--set-string image.tag=6.2.14-debian-11-r2 \
--set cluster.nodes=3 \
--set cluster.replicas=0 \
--set usePassword=false \
-n common
参数说明:
- 跟 Standalone Redis 一样,6.2 版本的镜像标签需要替换。
- 可以通过 cluster.nodes 设置主从数量,此处从节点如果设置为 1,那么 nodes 值需为 6,因为 nodes = masters + masters * replicas,文档说明中,masters 最少为 3 个,本例从节点设置为 0,nodes 可以设置为 3
- 集群部署变量中指定 StorageClass 和关闭密码的变量不一样,需要注意下
部署 7.x 版本 Redis Cluster
跟 6.2 部署同理,7.x 版本镜像支持 arm64,无需替换
7.0 版本
$ helm install redis-cluster-70 bitnami/redis-cluster --version 8.8.2 \
--set-string global.storageClass=efs-sc \
--set cluster.nodes=3 \
--set cluster.replicas=0 \
--set usePassword=false \
-n common
7.2 版本
$ helm install redis-cluster-72 bitnami/redis-cluster --version 9.1.4 \
--set-string global.storageClass=efs-sc \
--set cluster.nodes=3 \
--set cluster.replicas=0 \
--set usePassword=false \
-n common
连接集群内 Redis 服务
访问地址
在集群中可以通过以下地址访问 Redis(如果 replica.replicaCount 设置为 0,则没有 read-only 副本可用)
# Redis Standalone 地址
redis-62-master.common.svc.cluster.local for read/write operations (port 6379)
redis-62-replicas.common.svc.cluster.local for read-only operations (port 6379)
# Redis Cluster 地址
redis-cluster-62.common.svc.cluster.local (port 6379)
获取密码
默认 Redis 部署会生成随机登录密码,可以使用 kubectl 获取(如果 auth.enabled=false,则 Redis 无密码)
export REDIS_PASSWORD=$(kubectl get secret --namespace common redis-62 -o jsonpath="{.data.redis-password}" | base64 -d)
执行后,密码存储在 REDIS_PASSWORD 环境变量中
本地访问
获取到密码后,可以通过集群内容器访问,也可以直接通过命令,通过 port-forward 从本地访问到 EKS 内的 Redis
$ kubectl port-forward --namespace common svc/redis-62-master 6379:6379 &
REDISCLI_AUTH="$REDIS_PASSWORD" redis-cli -h 127.0.0.1 -p 6379