Helm部署高可用redis k8s分片集群

安装部署

添加bitnami仓库并查找redis

复制代码
helm repo add bitnami https://charts.bitnami.com/bitnami
​
helm repo update
[kmning@k8s-register-node ~]$ helm search repo redis
NAME                    CHART VERSION   APP VERSION     DESCRIPTION
bitnami/redis           17.10.1         7.0.11          Redis(R) is an open source, advanced key-value ...
bitnami/redis-cluster   8.4.4           7.0.11          Redis(R) is an open source, scalable, distribut...
复制代码
拉取chat到本地
复制代码
helm pull bitnami/redis-cluster --version 8.4.4
​
tar -zxvf redis-cluster-8.4.4.tgz
​
cp redis-cluster/values.yaml ./values-test.yaml

对本地values-test.yaml进行修改,配置非常多,根据实际情况进行修改,比如我主要修改了如下内容

复制代码
global:
  imageRegistry: "xxx.com:443"
  ## E.g.
  ## imagePullSecrets:
  ##   - myRegistryKeySecretName
  ##
  imagePullSecrets: []
  storageClass: "managed-nfs-storage"
  redis:
    password: "pwd"

所有用到image的地方改成私服
image:
  registry: xxx:443
  repository: lib-proxy/bitnami/redis-cluster
  ## Bitnami Redis® image tag
  ## ref: https://github.com/bitnami/containers/tree/main/bitnami/redis#supported-tags-and-respective-dockerfile-links
  ##
  tag: 7.0.11-debian-11-r0

persistence:
  ## @param persistence.enabled Enable persistence on Redis®
  ## If enabled, nodes are using Persistent Volume Claims
  ## If disabled, an emptyDir volume is used
  ##
  enabled: true
  ## @param persistence.path Path to mount the volume at, to use other images Redis® images.
  ##
  path: /bitnami/redis/data
  ## @param persistence.subPath The subdirectory of the volume to mount to, useful in dev environments and one PV for multiple services
  ##
  subPath: ""
  ## @param persistence.storageClass Storage class of backing PVC
  ## If defined, storageClassName: <storageClass>
  ## If set to "-", storageClassName: "", which disables dynamic provisioning
  ## If undefined (the default) or set to null, no storageClassName spec is
  ##   set, choosing the default provisioner.  (gp2 on AWS, standard on
  ##   GKE, AWS & OpenStack)
  ##
  storageClass: "managed-nfs-storage"

helm安装redis集群

复制代码
kubectl create ns redis
helm -n redis install redis-cluster  redis-cluster-8.4.4.tgz  -f values-test.yaml \
--set useBundledSystemChart=true

安装后打印

复制代码
kmning@k8s-master-1:~/redis-k8s-cluster$ helm -n redis install redis-cluster  redis-cluster-8.4.4.tgz  -f values-test.yaml \
> --set useBundledSystemChart=true
NAME: redis-cluster
LAST DEPLOYED: Thu Apr 27 08:44:02 2023
NAMESPACE: redis
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: redis-cluster
CHART VERSION: 8.4.4
APP VERSION: 7.0.11** Please be patient while the chart is being deployed **


To get your password run:
    export REDIS_PASSWORD=$(kubectl get secret --namespace "redis" redis-cluster -o jsonpath="{.data.redis-password}" | base64 -d)

You have deployed a Redis&reg; Cluster accessible only from within you Kubernetes Cluster.INFO: The Job to create the cluster will be created.To connect to your Redis&reg; cluster:

1. Run a Redis&reg; pod that you can use as a client:
kubectl run --namespace redis redis-cluster-client --rm --tty -i --restart='Never' \
 --env REDIS_PASSWORD=$REDIS_PASSWORD \
--image k8s-register-node.com:443/lib-proxy/bitnami/redis-cluster:7.0.11-debian-11-r0 -- bash

2. Connect using the Redis&reg; CLI:

redis-cli -c -h redis-cluster -a $REDIS_PASSWORD

查看已安装chat

复制代码
kmning@k8s-master-1:~/redis-k8s-cluster$ helm -n redis list
NAME            NAMESPACE       REVISION        UPDATED                                 STATUS          CHART                   APP VERSION
redis-cluster   redis           1               2023-04-27 08:33:55.88999883 +0000 UTC  deployed        redis-cluster-8.4.4     7.0.11

查看服务部署情况

复制代码
kmning@k8s-master-1:~/redis-k8s-cluster$ kubectl get sts -n redis
NAME            READY   AGE
redis-cluster   6/6     4m27s
euht@k8s-master-1:~/redis-k8s-cluster$ kubectl get pods -n redis
NAME              READY   STATUS    RESTARTS        AGE
redis-cluster-0   1/1     Running   1 (3m26s ago)   4m33s
redis-cluster-1   1/1     Running   1 (3m18s ago)   4m33s
redis-cluster-2   1/1     Running   0               4m33s
redis-cluster-3   1/1     Running   0               4m33s
redis-cluster-4   1/1     Running   1 (3m25s ago)   4m33s
redis-cluster-5   1/1     Running   1 (3m6s ago)    4m33s
euht@k8s-master-1:~/redis-k8s-cluster$ kubectl get svc -n redis
NAME                     TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)              AGE
redis-cluster            ClusterIP   10.43.252.164   <none>        6379/TCP             5m23s
redis-cluster-headless   ClusterIP   None            <none>        6379/TCP,16379/TCP   5m24s
kmning@k8s-master-1:~/redis-k8s-cluster$ kubectl get pvc -n redis
NAME                         STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS          AGE
redis-data-redis-cluster-0   Bound    pvc-42ac9dea-3dda-4c43-90c6-4cd59f5af8b9   8Gi        RWO            managed-nfs-storage   15m
redis-data-redis-cluster-1   Bound    pvc-3c5cc893-dc6d-4f2a-b485-00544564a5b5   8Gi        RWO            managed-nfs-storage   15m
redis-data-redis-cluster-2   Bound    pvc-064448ee-240e-4658-b161-c96da01c977d   8Gi        RWO            managed-nfs-storage   15m
redis-data-redis-cluster-3   Bound    pvc-198311a6-2c25-41d6-ae0f-6e6c055b1a20   8Gi        RWO            managed-nfs-storage   15m
redis-data-redis-cluster-4   Bound    pvc-419b04c2-ff80-4907-aafc-3adaf33242a2   8Gi        RWO            managed-nfs-storage   15m
redis-data-redis-cluster-5   Bound    pvc-92a0de8f-d073-4430-9c64-a06e86aa3041   8Gi        RWO            managed-nfs-storage   15m

看起来一切正常。默认集群主节点为redis-cluster-0、redis-cluster-2、redis-cluster-4,而集群从节点为redis-cluster-1、redis-cluster-3、redis-cluster-5。

服务验证

复制代码
kubectl exec -it redis-cluster-0 bash -n redis


I have no name!@redis-cluster-client:/$  redis-cli -c -h redis-cluster -a $REDIS_PASSWORD
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
redis-cluster:6379> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:3
cluster_stats_messages_ping_sent:1022
cluster_stats_messages_pong_sent:1006
cluster_stats_messages_meet_sent:1
cluster_stats_messages_sent:2029
cluster_stats_messages_ping_received:1006
cluster_stats_messages_pong_received:1023
cluster_stats_messages_received:2029
total_cluster_links_buffer_limit_exceeded:0
redis-cluster:6379> cluster nodes
dcc21275c8dc404d2fd3d6c18c719face4640e07 10.42.2.38:6379@16379 slave b118e1f8eb353849abe08749540235264887918c 0 1682586093120 3 connected
358ddf185fe7b9f3c88745a15edeb7f513c6e695 10.42.4.15:6379@16379 slave 10eb0915585400a27b725f721d67b7bb11e8babf 0 1682586094125 2 connected
922c7d7ce319276b4693192372d8b217b608d733 10.42.3.17:6379@16379 slave 012396047e02fc8c890dfb838dbb6e3d8e497eb9 0 1682586088098 1 connected
012396047e02fc8c890dfb838dbb6e3d8e497eb9 10.42.0.38:6379@16379 master - 0 1682586092117 1 connected 0-5460
10eb0915585400a27b725f721d67b7bb11e8babf 10.42.1.30:6379@16379 master - 0 1682586095129 2 connected 5461-10922
b118e1f8eb353849abe08749540235264887918c 10.42.5.13:6379@16379 myself,master - 0 1682586045000 3 connected 10923-16383
redis-cluster:6379>

从日志可以看出,三主三从的分片集群已完成搭建。

客户端使用

通过上面的安装,我们已经将Service暴露出来

复制代码
kmning@k8s-master-1:~/redis-k8s-cluster$ kubectl get svc -n redis
NAME                     TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)              AGE
redis-cluster            ClusterIP   10.43.252.164   <none>        6379/TCP             5m23s
redis-cluster-headless   ClusterIP   None            <none>        6379/TCP,16379/TCP   5m24s

可以看出,暴露了一个可负载均衡访问的Service和一个无头Service,可根据需要去使用。正常来讲,我们只需要以分片集群的方式连接可负载均衡的Service即可。

如本文的情况,redis cluster的每个节点都是一个跑在k8s里面的pod,这些pod并不能被外部直接访问,而是通过ingress等方法对外暴露一个访问接口,即只有一个统一的ip:port给外部访问。经由k8s的调度,对这个统一接口的访问会被发送到redis集群的某个节点。这时候对redis的用户来说,看起来这就像是一个单节点的redis。但是,此时无论是直接使用命令行工具redis-cli,还是某种语言的sdk,还是需要按照集群来配置redis的连接信息,才能正确连接,例如

复制代码
spring:
  redis:
    cluster:
      nodes: redis-cluster.redis.svc.cluster.local:6379
    password: yourpwd

当然,这里也可以使用无头Service去灵活连接,把nodes的内容改下如下即可

复制代码
redis-cluster-0.redis-cluster-headless.redis.svc.cluster.local,redis-cluster-1.redis-cluster-headless.redis.svc.cluster.local,redis-cluster-2.redis-cluster-headless.redis.svc.cluster.local,redis-cluster-3.redis-cluster-headless.redis.svc.cluster.local,redis-cluster-4.redis-cluster-headless.redis.svc.cluster.local,redis-cluster-5.redis-cluster-headless.redis.svc.cluster.local
相关推荐
m0_4856146735 分钟前
K8s基础与安装
云原生·容器·kubernetes
运维小贺1 小时前
kubernetes之Pod入门到实战篇
云原生·容器·kubernetes
xiaolyuh1232 小时前
ThreadLocalMap 中弱引用被 GC 后的行为机制解析
java·jvm·redis
Connie14512 小时前
K8s修改Kubelet过程(命令版本)
容器·kubernetes·kubelet
会飞的胖达喵2 小时前
Redis 协议详解与 Telnet 直接连redis
数据库·redis·redis协议
wangbing11252 小时前
redis的存储问题
数据库·redis·缓存
lin张2 小时前
Kubernetes 核心网络方案与资源管理(一)
网络·容器·kubernetes
叽里咕噜怪2 小时前
(二)k8s——kubeadm 部署 K8S 1.20.11 详细版
云原生·容器·kubernetes
zs宝来了2 小时前
大厂面试实录:Spring Boot源码深度解析+Redis缓存架构+RAG智能检索,谢飞机的AI电商面试之旅
spring boot·redis·微服务·大厂面试·java面试·rag·spring ai
迷茫运维路3 小时前
【K8S集群漏洞扫描】kube-proxy进程所监听的443端口证书过期问题分析与解决
linux·容器·kubernetes·漏洞处理