「云原生」Redis on K8s 编排部署讲解与实战操作

「云原生」Redis on K8s 编排部署讲解与实战操作

作者:大数据老司机 2022-11-06 21:31:11

云计算

云原生 Redis有三种集群模式:主从模式,Sentinel(哨兵)模式,Cluster模式,这三种模式环境编排部署都会在本文章介绍与实战操作。

一、概述

REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统,是跨平台的非关系型数据库。

Redis有三种集群模式:主从模式,Sentinel(哨兵)模式,Cluster模式,这三种模式环境编排部署都会在本文章介绍与实战操作。

二、redis 主从模式编排部署实战操作

地址:https://artifacthub.io/packages/helm/bitnami/redis

1)下载chart 包

helm repo add bitnami https://charts.bitnami.com/bitnami

helm pull bitnami/redis --version 17.3.7

tar -xf redis-17.3.7.tgz

2)构建镜像

这里就不重新构建镜像了,只是把远程镜像tag一下,推到本地harbor仓库加速下载镜像。有不清楚怎么构建镜像的小伙伴,可以私信或者留言。

docker pull docker.io/bitnami/redis:7.0.5-debian-11-r7

# tag
docker tag docker.io/bitnami/redis:7.0.5-debian-11-r7 myharbor.com/bigdata/redis:7.0.5-debian-11-r7

# 推送镜像到本地harbor仓库
docker push myharbor.com/bigdata/redis:7.0.5-debian-11-r7

3)修改yaml编排

  • redis/templates/master/pv.yaml

新增pv.yaml文件,内容如下:

{{- range .Values.master.persistence.local}}
---
apiVersion: v1
kind: PersistentVolume
metadata:
name:{{.name}}
labels:
name:{{.name}}
spec:
storageClassName:{{ $.Values.master.persistence.storageClass}}
capacity:
storage:{{ $.Values.master.persistence.size}}
accessModes:
- ReadWriteOnce
local:
path:{{.path}}
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator:In
values:
-{{.host}}
---
{{- end }}
  • redis/templates/replicas/pv.yaml

新增pv.yaml文件,内容如下:

{{- range .Values.replica.persistence.local}}
---
apiVersion: v1
kind: PersistentVolume
metadata:
name:{{.name}}
labels:
name:{{.name}}
spec:
storageClassName:{{ $.Values.replica.persistence.storageClass}}
capacity:
storage:{{ $.Values.replica.persistence.size}}
accessModes:
- ReadWriteOnce
local:
path:{{.path}}
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator:In
values:
-{{.host}}
---
{{- end }}
  • redis/values.yaml
global:
redis:
password:"123456"

...

image:
registry: myharbor.com
repository: bigdata/redis
tag:7.0.5-debian-11-r7

master:
count:1
persistence:
enabled:true
size:8Gi
storageClass:"local-redis-storage"
local:
- name: redis-0
host:"local-168-182-110"
path:"/opt/bigdata/servers/redis/data/data1"

replica:
replicaCount:2
persistence:
enabled:true
size:8Gi
storageClass:"local-redis-storage"
local:
- name: redis-1
host:"local-168-182-111"
path:"/opt/bigdata/servers/redis/data/data1"
- name: redis-2
host:"local-168-182-112"
path:"/opt/bigdata/servers/redis/data/data1"

4)开始部署

# 创建存储目录
mkdir /opt/bigdata/servers/redis/data/data1

# 先检查语法
helm lint ./redis

# 开始安装
helm install redis ./redis -n redis --create-namespace

NOTES

REVISION:1
TEST SUITE: None
NOTES:
CHART NAME: redis
CHART VERSION:17.3.7
APP VERSION:7.0.5

** Please be patient while the chart is being deployed **

Redis® can be accessed on the following DNS names from within your cluster:

redis-master.redis.svc.cluster.local for read/write operations (port 6379)
redis-replicas.redis.svc.cluster.local for read-only operations (port 6379)



To get your password run:

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

To connect to your Redis® server:

1. Run a Redis® pod that you can use as a client:

kubectl run --namespace redis redis-client --restart='Never' --env REDIS_PASSWORD=$REDIS_PASSWORD --image myharbor.com/bigdata/redis:7.0.5-debian-11-r7 --command -- sleep infinity

Use the following command to attach to the pod:

kubectl exec --tty -i redis-client \
--namespace redis -- bash

2. Connect using the Redis® CLI:
REDISCLI_AUTH="$REDIS_PASSWORD" redis-cli -h redis-master
REDISCLI_AUTH="$REDIS_PASSWORD" redis-cli -h redis-replicas

To connect to your database from outside the cluster execute the following commands:

kubectl port-forward --namespace redis svc/redis-master 6379:6379 &
REDISCLI_AUTH="$REDIS_PASSWORD" redis-cli -h 127.0.0.1-p 6379

5)测试验证

kubectl get pods,svc -n redis -owide

# 登录master,可读可写
kubectl exec -it redis-master-0-n redis -- redis-cli -h redis-master -a $(kubectl get secret --namespace redis redis -o jsonpath="{.data.redis-password}" | base64 -d)

# 登录slave,只读
kubectl exec -it redis-master-0-n redis -- redis-cli -h redis-replicas -a $(kubectl get secret --namespace redis redis -o jsonpath="{.data.redis-password}" | base64 -d)

6)卸载

helm uninstall redis-sentinel -n redis-sentinel
# delete ns
kubectl delete ns redis-sentinel --force
# delete pv
kubectl delete pv `kubectl get pv|grep ^redis-|awk '{print $1}'` --force

rm -fr /opt/bigdata/servers/redis/data/data1/*

三、redis 哨兵模式编排部署实战操作

主从模式的弊端就是不具备高可用性,当master挂掉以后,Redis将不能再对外提供写入操作,因此sentinel应运而生。

1)构建镜像

这里也重新构建镜像了,有不懂构建镜像的小伙伴可以在评论下方留言。这里也只是把远程的镜像推送到本地harbor。

docker pull docker.io/bitnami/redis-sentinel:7.0.5-debian-11-r6
# tag
docker tag docker.io/bitnami/redis-sentinel:7.0.5-debian-11-r6 myharbor.com/bigdata/redis-sentinel:7.0.5-debian-11-r6
# push
docker push myharbor.com/bigdata/redis-sentinel:7.0.5-debian-11-r6

2)修改yaml编排

  • redis-sentinel/values.yaml
replica:
# replica.replicaCount与sentinel.quorum值一样
replicaCount:3
storageClass:"local-redis-storage"
local:
- name: redis-0
host:"local-168-182-110"
path:"/opt/bigdata/servers/redis/data/data1"
- name: redis-1
host:"local-168-182-111"
path:"/opt/bigdata/servers/redis/data/data1"
- name: redis-2
host:"local-168-182-112"
path:"/opt/bigdata/servers/redis/data/data1"

sentinel:
enabled:true
image:
registry: myharbor.com
repository: bigdata/redis-sentinel
tag:7.0.5-debian-11-r6
quorum:3
  • redis-sentinel/templates/replicas/pv.yaml

新增pv.yaml文件,内容如下:

{{- range .Values.sentinel.persistence.local}}
---
apiVersion: v1
kind: PersistentVolume
metadata:
name:{{.name}}
labels:
name:{{.name}}
spec:
storageClassName:{{ $.Values.sentinel.persistence.storageClass}}
capacity:
storage:{{ $.Values.sentinel.persistence.size}}
accessModes:
- ReadWriteOnce
local:
path:{{.path}}
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator:In
values:
-{{.host}}
---
{{- end }}

3)开始部署

# 创建存储目录
mkdir -p /opt/bigdata/servers/redis/data/data1

helm install redis-sentinel ./redis-sentinel -n redis-sentinel --create-namespace

NOTES

NAME: redis-sentinel
LAST DEPLOYED: Fri Nov 422:42:522022
NAMESPACE: redis-sentinel
STATUS: deployed
REVISION:1
TEST SUITE: None
NOTES:
CHART NAME: redis
CHART VERSION:17.3.7
APP VERSION:7.0.5

** Please be patient while the chart is being deployed **

Redis® can be accessed via port 6379on the following DNS name from within your cluster:

redis-sentinel.redis-sentinel.svc.cluster.local for read only operations

For read/write operations, first access the Redis® Sentinel cluster, which is available in port 26379 using the same domain name above.



To get your password run:

export REDIS_PASSWORD=$(kubectl get secret --namespace redis-sentinel redis-sentinel -o jsonpath="{.data.redis-password}" | base64 -d)

To connect to your Redis® server:

1. Run a Redis® pod that you can use as a client:

kubectl run --namespace redis-sentinel redis-client --restart='Never' --env REDIS_PASSWORD=$REDIS_PASSWORD --image myharbor.com/bigdata/redis:7.0.5-debian-11-r7 --command -- sleep infinity

Use the following command to attach to the pod:

kubectl exec --tty -i redis-client \
--namespace redis-sentinel -- bash

2. Connect using the Redis® CLI:
REDISCLI_AUTH="$REDIS_PASSWORD" redis-cli -h redis-sentinel -p 6379 # Read only operations
REDISCLI_AUTH="$REDIS_PASSWORD" redis-cli -h redis-sentinel -p 26379 # Sentinel access

To connect to your database from outside the cluster execute the following commands:

kubectl port-forward --namespace redis-sentinel svc/redis-sentinel 6379:6379 &
REDISCLI_AUTH="$REDIS_PASSWORD" redis-cli -h 127.0.0.1-p 6379

查看

kubectl get pods,svc -n redis-sentinel -owide

4)模拟故障测试

# 查看
kubectl exec -it redis-sentinel-node-0-n redis-sentinel -- redis-cli -h redis-sentinel -a $(kubectl get secret --namespace redis-sentinel redis-sentinel -o jsonpath="{.data.redis-password}" | base64 -d) info replication

模拟故障,kill master pod

kubectl delete pod redis-sentinel-node-0-n redis-sentinel

再次查看master所在节点,master节点已经切换到其它节点了。

再测试读写

# 登录master节点
kubectl exec -it redis-sentinel-node-0-n redis-sentinel -- redis-cli -h redis-sentinel-node-2.redis-sentinel-headless -a $(kubectl get secret --namespace redis-sentinel redis-sentinel -o jsonpath="{.data.redis-password}" | base64 -d)

# 登录slave节点
kubectl exec -it redis-sentinel-node-0-n redis-sentinel -- redis-cli -h redis-sentinel-node-0.redis-sentinel-headless -a $(kubectl get secret --namespace redis-sentinel redis-sentinel -o jsonpath="{.data.redis-password}" | base64 -d)

5)卸载

helm uninstall redis-sentinel -n redis
# delete ns
kubectl delete ns redis --force
# delete pv
kubectl delete pv `kubectl get pv|grep ^redis-|awk '{print $1}'` --force

rm -fr /opt/bigdata/servers/redis/data/data1/*

四、redis 集群模式编排部署实战操作

集群模式可以说是sentinel+主从模式的结合体,通过cluster可以实现主从和master重选功能,所以如果配置两个副本三个分片的话,就需要六个Redis实例。因为Redis的数据是根据一定规则分配到cluster的不同机器的,当数据量过大时,可以新增机器进行扩容。

1)下载chart 包

helm repo add bitnami https://charts.bitnami.com/bitnami

helm pull bitnami/redis-cluster --version 8.2.7

tar -xf redis-cluster-8.2.7.tgz

2)构建镜像

这里就不重新构建镜像了,只是把远程镜像tag一下,推到本地harbor仓库加速下载镜像。有不清楚怎么构建镜像的小伙伴,可以私信或者留言。

docker pull docker.io/bitnami/redis-cluster:7.0.5-debian-11-r9

# tag
docker tag docker.io/bitnami/redis-cluster:7.0.5-debian-11-r9 myharbor.com/bigdata/redis-cluster:7.0.5-debian-11-r9

# 推送镜像到本地harbor仓库
docker push myharbor.com/bigdata/redis-cluster:7.0.5-debian-11-r9

3)修改yaml编排

  • redis-cluster/templates/pv.yaml

新增pv.yaml文件,内容如下:

{{- range .Values.persistence.local}}
---
apiVersion: v1
kind: PersistentVolume
metadata:
name:{{.name}}
labels:
name:{{.name}}
spec:
storageClassName:{{ $.Values.persistence.storageClass}}
capacity:
storage:{{ $.Values.persistence.size}}
accessModes:
- ReadWriteOnce
local:
path:{{.path}}
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator:In
values:
-{{.host}}
---
{{- end }}
password:"123456"

...

image:
registry: myharbor.com
repository: bigdata/redis-cluster
tag:7.0.5-debian-11-r9

...

persistence:
storageClass:"local-redis-cluster-storage"
local:
- name: redis-cluster-0
host:"local-168-182-110"
path:"/opt/bigdata/servers/redis-cluster/data/data1"
- name: redis-cluster-1
host:"local-168-182-110"
path:"/opt/bigdata/servers/redis-cluster/data/data2"
- name: redis-cluster-2
host:"local-168-182-110"
path:"/opt/bigdata/servers/redis-cluster/data/data3"
- name: redis-cluster-3
host:"local-168-182-111"
path:"/opt/bigdata/servers/redis-cluster/data/data1"
- name: redis-cluster-4
host:"local-168-182-111"
path:"/opt/bigdata/servers/redis-cluster/data/data2"
- name: redis-cluster-5
host:"local-168-182-111"
path:"/opt/bigdata/servers/redis-cluster/data/data3"
- name: redis-cluster-6
host:"local-168-182-112"
path:"/opt/bigdata/servers/redis-cluster/data/data1"
- name: redis-cluster-7
host:"local-168-182-112"
path:"/opt/bigdata/servers/redis-cluster/data/data2"
- name: redis-cluster-8
host:"local-168-182-112"
path:"/opt/bigdata/servers/redis-cluster/data/data3"

cluster:
init:true
# 一主两从(三组)
nodes:9
replicas:2

4)开始部署

# 创建存储目录
mkdir -p /opt/bigdata/servers/redis-cluster/data/data{1..3}

helm install redis-cluster ./redis-cluster -n redis-cluster --create-namespace

NOTES

NOTES:
CHART NAME: redis-cluster
CHART VERSION: 8.2.7
APP VERSION: 7.0.5** Please be patient while the chart is being deployed **


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

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

1. Run a Redis® pod that you can use as a client:
kubectl run --namespace redis-cluster redis-cluster-client --rm --tty -i --restart='Never' \
--env REDIS_PASSWORD=$REDIS_PASSWORD \
--image myharbor.com/bigdata/redis-cluster:7.0.5-debian-11-r9 -- bash

2. Connect using the Redis® CLI:

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

查看

kubectl get pods,svc -n redis-cluster -owide

5)故障模拟测试

kubectl exec -it redis-cluster-0-n redis-cluster -- redis-cli -c -h redis-cluster -a $(kubectl get secret --namespace "redis-cluster" redis-cluster -o jsnotallow="{.data.redis-password}" | base64 -d) CLUSTER INFO

kubectl exec -it redis-cluster-0-n redis-cluster -- redis-cli -c -h redis-cluster -a $(kubectl get secret --namespace "redis-cluster" redis-cluster -o jsonpath="{.data.redis-password}" | base64 -d) CLUSTER NODES

删除其中一个master节点

kubectl delete pod redis-cluster-1-n redis-cluster

# 再查看节点情况
kubectl exec -it redis-cluster-0-n redis-cluster -- redis-cli -c -h redis-cluster -a $(kubectl get secret --namespace "redis-cluster" redis-cluster -o jsonpath="{.data.redis-password}" | base64 -d) CLUSTER NODES

6)卸载

helm uninstall redis-cluster -n redis-cluster
# delete ns
kubectl delete ns redis-cluster --force
# delete pv
kubectl delete pv `kubectl get pv|grep ^redis-cluster-|awk '{print $1}'` --force

rm -fr /opt/bigdata/servers/redis-cluster/data/data{1..3}/*

git地址:https://gitee.com/hadoop-bigdata/redis-on-k8s​

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/274220.html<

(0)
运维的头像运维
上一篇2025-05-09 15:29
下一篇 2025-05-09 15:30

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注