前置资料
安装 Helm
官方github
Helm 安装 bitnami/redis 集群
helm repo add bitnami https://charts.bitnami.com/bitnami
## 查看安装版本
helm search repo list
NAME CHART VERSION APP VERSION DESCRIPTION
bitnami/kube-state-metrics 3.2.1 2.5.0 kube-state-metrics is a simple service that lis...
bitnami/redis 17.1.3 7.0.4 部署主从集群,可选择是否启用 Redis Sentinel
bitnami/redis-cluster 8.2.1 7.0.4 部署具有分片的 Redis 集群拓扑
helm repo update
## 将chart包下载到本地
export REDIS_VERSION=8.2.1
helm pull bitnami/redis-cluster --version $REDIS_VERSION
Redis | Redis 集群 |
---|---|
支持多个数据库 | 仅支持一个数据库。如果你有一个大数据集更好 |
单写点(单主) | 多个写入点(多个主控) |
先决条件
- Kubernetes 1.19+
- Helm 3.2.0+
- 底层基础设施中的 PV 供应商支持
安装部署 Redis 集群
## 创建命令空间
export REDIS_NAMESPACE=redis-cluster
kubectl create ns $REDIS_NAMESPACE
创建values.yaml
cat > values.yaml << ERIC
##
global:
## 持久卷的全局存储类
storageClass: "rook-ceph-block"
## Redis 密码(覆盖auth.password)
# redis:
# password: ""
## 安装集群
image:
## 镜像下载地址
registry: docker.io
## 镜像
repository: bitnami/redis-cluster
## 镜像 tag
tag: 7.0.4-debian-11-r4
## 是否调试
debug: false
## 是否使用,用户密码
usePassword: false
#password: ""
##
service:
ports:
redis: 6379
## 当前支持的类型 ClusterIP (默认) 与 LoadBalancer
type: ClusterIP
##
cluster:
## 默认创建 3主3从(副本),所以节点数应始终 >= 6,否则集群创建将失败
nodes: 6
## 集群中每个 master 的副本数
replicas: 1
update:
## 当前部署的 Redis 节点数
currentNumberOfNodes: 6
## 当前部署的 Redis 副本数
currentNumberOfReplicas: 1
# ##
# externalAccess:
# ## 是否启动从k8s集群外部访问Redis,默认 (false)
# ## 这个操作会让每一个Pod都对应一个Service,并且每个Service都需要一个 LoadBalancer IP,所以不建议使用这个功能
# enabled: false
# service:
# type: LoadBalancer
# port: 6379
ERIC
## 安装部署
helm install redis ./redis-cluster-$REDIS_VERSION.tgz -f values.yaml -n $REDIS_NAMESPACE
#### 如果安装成功,会输出如下信息
NAME: redis
LAST DEPLOYED: Mon Sep 5 19:37:03 2022
NAMESPACE: redis-cluster
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: redis-cluster
CHART VERSION: 8.2.1
APP VERSION: 7.0.4** Please be patient while the chart is being deployed **
...... 省略
## 查看集群信息
kubectl -n redis-cluster get all -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/redis-redis-cluster-0 1/1 Running 3 11h 10.100.78.244 k8s-worker-04 <none> <none>
pod/redis-redis-cluster-1 1/1 Running 1 29m 10.100.55.211 k8s-worker-05 <none> <none>
pod/redis-redis-cluster-2 1/1 Running 0 11h 10.100.165.157 k8s-worker-06 <none> <none>
pod/redis-redis-cluster-3 1/1 Running 0 11h 10.100.78.211 k8s-worker-04 <none> <none>
pod/redis-redis-cluster-4 1/1 Running 0 11h 10.100.55.233 k8s-worker-05 <none> <none>
pod/redis-redis-cluster-5 1/1 Running 0 11h 10.100.165.180 k8s-worker-06 <none> <none>
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service/redis-redis-cluster ClusterIP 10.96.7.97 <none> 6379/TCP 11h app.kubernetes.io/instance=redis,app.kubernetes.io/name=redis-cluster
service/redis-redis-cluster-headless ClusterIP None <none> 6379/TCP,16379/TCP 11h app.kubernetes.io/instance=redis,app.kubernetes.io/name=redis-cluster
NAME READY AGE CONTAINERS IMAGES
statefulset.apps/redis-redis-cluster 6/6 11h redis-redis-cluster docker.io/bitnami/redis-cluster:7.0.4-debian-11-r4
卸载
helm delete redis -n $REDIS_NAMESPACE
注意
,如果首次安装失败,需要进行完全卸载才行,因为PV中会留有缓存## 进行完全卸载,删除命名空间 kubectl delete ns $REDIS_NAMESPACE
测试,安装客户端容器
## 启动后会自动进入容器
kubectl run -ti --rm client-tools --image=rdocker pull cnagent/client-tools:1.0.0
## 在容器内测试,通过负载链接Redis集群
[root@client-tools app]# redis-cli -h redis-redis-cluster.redis-cluster -p 6379
## 测试Redis集群联通性
redis-redis-cluster.redis-cluster:6379> PING
PONG
问题
## 尝试连接 redis-redis-cluster-0
redis-cli -h redis-redis-cluster-0.redis-redis-cluster-headless.redis-cluster -p 6379
## 并且通过 redis-redis-cluster-0 进行数据库操作
redis-redis-cluster-0.redis-redis-cluster-headless.redis-cluster:6379> SET name Eric
#### 引发一个异常,告诉你要使用 10.100.165.180 也就是 redis-redis-cluster-5 进行操作
(error) MOVED 5798 10.100.165.180:6379
## 尝试连接 redis-redis-cluster-5
redis-cli -h redis-redis-cluster-5.redis-redis-cluster-headless.redis-cluster -p 6379
##
redis-redis-cluster-5.redis-redis-cluster-headless.redis-cluster:6379> SET name Eric
OK
redis-redis-cluster-5.redis-redis-cluster-headless.redis-cluster:6379> GET name
"Eric"