第6章 云原生应用实战-Kubernetes部署Redis集群
作者:王珂
邮箱:[49186456@qq.com
前言
本节课程主要给大家介绍如何在Kubernetes中搭建Redis集群。本章介绍自定义Yaml部署单节点的Redis, 下载Chart部署主从Redis,自定义Yaml安装分片集群Redis。
版本信息
Kubernetes 1.23.0
Redis 6.2.7
一、部署单节点Redis
以下是部署一个单节点Redis的Yaml,分别定义了ConfigMap, Service, StatefulSet。需要注意的是我们Redis数据的存储,这里采用StorageClass动态申请存储卷,如果你的Kubernetes尚未配置StorageClass,可参考第2章 云原生应用实战-搭建Kubernetes环境-CSDN博客 第四节 安装StorageClass。
single-redis.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: cm-sso-redis
namespace: dev
data:
redis-config: |
appendonly yes
protected-mode no
dir /data
port 6379
requirepass 123456
---
apiVersion: v1
kind: Service
metadata:
name: svc-sso-redis
namespace: dev
spec:
selector:
app: sso-redis
type: ClusterIP
clusterIP: None
ports:
- port: 6379
targetPort: 6379
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: sts-sso-redis
namespace: dev
labels:
app: sso-redis
spec:
serviceName: svc-sso-redis
replicas: 1
selector:
matchLabels:
app: sso-redis
template:
metadata:
labels:
app: sso-redis
spec:
containers:
- name: pod-sso-redis
image: docker.io/library/redis:6.2.7
command:
- "redis-server"
args:
- "/etc/redis/redis.conf"
ports:
- name: redis-6379
containerPort: 6379
protocol: TCP
volumeMounts:
- name: config
mountPath: /etc/redis
- name: data
mountPath: /data
resources:
limits:
cpu: 1
memory: 4000Mi
requests:
cpu: 100m
memory: 500Mi
volumes:
- name: config
configMap:
name: cm-sso-redis
items:
- key: redis-config
path: redis.conf
volumeClaimTemplates:
- metadata:
name: data
namespace: dev
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: nfs-storage
resources:
requests:
storage: 50Mi
二、部署Redis集群
2.1 部署Redis主从集群
这里我们使用helm包管理工具安装。helm库使用bitnami中的Redis。
1)添加bitnami库
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update
2)检索redis chart
helm search repo redis
# 结果如下
NAME CHART VERSION APP VERSION DESCRIPTION
aliyun/redis 1.1.15 4.0.8 Open source, advanced key-value store. It is of...
aliyun/redis-ha 2.0.1 Highly available Redis cluster with multiple se...
bitnami/redis 17.11.6 7.0.11 Redis(R) is an open source, advanced key-value ...
bitnami/redis-cluster 8.6.6 7.0.11 Redis(R) is an open source, scalable, distribut...
查看安装说明
命令:helm show readme <chart名称>
helm show readme bitnami/redis-cluster
<!--- app-name: Redis® Cluster -->
# Bitnami package for Redis(R) Cluster
Redis(R) is an open source, scalable, distributed in-memory cache for applications. It can be used to store and serve data in the form of strings, hashes, lists, sets and sorted sets.
[Overview of Redis® Cluster](http://redis.io)
......
3)拉取chart
helm pull bitnami/redis
4)解压chart包
tar -xvf redis-17.11.6.tgz
5)修改配置
编辑values.yaml,修改以下几个点
global:
storageClass: "nfs-storage" # 你的kubernetes中需要准备好storageClass
redis:
password: "123456"
service:
type: NodePort
master:
size: 10Mi
slave:
size: 10Mi
6)创建命名空间
kubectl create ns ns-redis
7)执行安装
helm install ms-redis ./redis-17.11.6/ -n ns-redis
卸载命令
helm uninstall ms-redis -n ns-redis
或
helm delete ms-redis -n ns-redis
2.2.部署Redis分片集群
通过自定义Yaml文件部署Redis分片集群。需要事先安装StoarageClass, 可参考第2章 云原生应用实战-搭建Kubernetes环境-CSDN博客 第四节 安装StorageClass。
自定义redis-cluster.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: cm-sso-redis-cluster
namespace: dev
data:
redis-config: |
appendonly yes
protected-mode no
dir /data
port 6379
requirepass 123456
cluster-enabled yes
cluster-config-file /data/nodes.conf
masterauth 123456
daemonize no
---
apiVersion: v1
kind: Service
metadata:
name: svc-sso-redis-cluster
namespace: dev
spec:
selector:
app: sso-redis-cluster
type: ClusterIP
clusterIP: None
ports:
- name: redis-6379
port: 6379
targetPort: 6379
protocol: TCP
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: sts-sso-redis-cluster
namespace: dev
labels:
app: sso-redis-cluster
spec:
serviceName: svc-sso-redis-cluster
replicas: 6
selector:
matchLabels:
app: sso-redis-cluster
template:
metadata:
labels:
app: sso-redis-cluster
spec:
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- sso-redis-cluster
topologyKey: kubernetes.io/hostname
containers:
- name: pod-sso-redis
image: docker.io/library/redis:6.2.7
command:
- "redis-server"
args:
- "/etc/redis/redis.conf"
- "--protected-mode"
- "no"
- "--cluster-announce-ip"
- "$(POD_IP)"
env: # POD_IP的相关配置,如果不配置会导致线上POD重启换IP后,集群状态无法自动同步
- name: POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
ports:
- name: redis-6379
containerPort: 6379
protocol: TCP
volumeMounts:
- name: config
mountPath: /etc/redis
- name: data
mountPath: /data
resources:
limits:
cpu: 1
memory: 4000Mi
requests:
cpu: 100m
memory: 500Mi
volumes:
- name: config
configMap:
name: cm-sso-redis-cluster
items:
- key: redis-config
path: redis.conf
volumeClaimTemplates:
- metadata:
name: data
namespace: dev
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: nfs-storage
resources:
requests:
storage: 50Mi
自动创建Redis集群
Pod创建完成之后默认不会自动创建Redis集群,需要手工执行执行集群初始化命令。
- 自动配置3个master 3个slave集群,执行以下命令初始化集群
kubectl exec -it sts-sso-redis-cluster-0 -n dev -- redis-cli -a 123456 --cluster create --cluster-replicas 1 $(kubectl get pods -n dev -l app=sso-redis-cluster -o jsonpath='{range.items[*]}{.status.podIP}:6379 {end}')
执行之后输入yes
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 10.244.1.59:6379 to 10.244.3.5:6379
Adding replica 10.244.2.58:6379 to 10.244.1.58:6379
Adding replica 10.244.3.6:6379 to 10.244.2.57:6379
M: 3917fd931667343b74bf8858cfb192f323dcd458 10.244.3.5:6379
slots:[0-5460] (5461 slots) master
M: 1ed14676f99d954a485ab1329cad76e7ed23438c 10.244.1.58:6379
slots:[5461-10922] (5462 slots) master
M: bd460c7d13105bcb922831d49eff8893ba54133f 10.244.2.57:6379
slots:[10923-16383] (5461 slots) master
S: fdff3002903770160ac985fc0834362ac370e0df 10.244.3.6:6379
replicates bd460c7d13105bcb922831d49eff8893ba54133f
S: 6c8c8e0bda9f8689670e8404273090003761fba8 10.244.1.59:6379
replicates 3917fd931667343b74bf8858cfb192f323dcd458
S: 504df4d1d5b6f59e55c7b188b437fcd8ee80bdae 10.244.2.58:6379
replicates 1ed14676f99d954a485ab1329cad76e7ed23438c
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
查看集群
kubectl exec -it sts-sso-redis-cluster-0 -n dev -- redis-cli -a 123456 --cluster check $(kubectl get pods -n dev -l app=sso-redis-cluster -o jsonpath='{range.items[0]}{.status.podIP}:6379 {end}')
或者进入pod查看集群
root@sts-sso-redis-cluster-0:/data# redis-cli -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1: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:1
cluster_stats_messages_ping_sent:177
cluster_stats_messages_pong_sent:169
cluster_stats_messages_sent:346
cluster_stats_messages_ping_received:164
cluster_stats_messages_pong_received:177
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:346
127.0.0.1:6379> cluster nodes
995064923579f0a997219f1319d9a9d917dc702f 10.244.3.61:6379@16379 myself,master - 0 1681661439000 1 connected 0-5460
2dc0ee3ee5b987b74d0fef55aeb4aaa284f276ee 10.244.2.84:6379@16379 master - 0 1681661441499 2 connected 5461-10922
613f53b2a3aca5ea49badd802c6c77724d5ff450 10.244.2.85:6379@16379 slave 995064923579f0a997219f1319d9a9d917dc702f 0 1681661440000 1 connected
验证pod挂掉,自动重新创建,redis集群是否正常
# 手动删除redis的一个pod
kubectl delete pod sts-sso-redis-cluster-0
查看redis集群是否正确
kubectl get pods -l app=sso-redis-cluster -n dev -o wide
验证Server域名解析是否正常
# 使用nslookup命令验证redis的无头service是否能正常解析,如下所示,能正常解析(无头server解析返回的是后端全部pod的列表)
# service的域名表现形式:<servicename>.<namespace>.svc.<clusterdomain>
[root@master pods]# kubectl exec -it busybox -- nslookup redis-svc.default.svc.cluster.local
Server: 10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local
Name: redis-svc.default.svc.cluster.local
Address 1: 10.244.2.36 sts-sso-redis-cluster-0.svc-sso-redis-cluster.dev.svc.cluster.local
Address 2: 10.244.2.34 sts-sso-redis-cluster-1.svc-sso-redis-cluster.dev.svc.cluster.local
Address 3: 10.244.2.33 sts-sso-redis-cluster-2.svc-sso-redis-cluster.dev.svc.cluster.local
Address 4: 10.244.2.35 sts-sso-redis-cluster-3.svc-sso-redis-cluster.dev.svc.cluster.local
Address 5: 10.244.2.31 sts-sso-redis-cluster-4.svc-sso-redis-cluster.dev.svc.cluster.local
Address 6: 10.244.2.37 sts-sso-redis-cluster-5.svc-sso-redis-cluster.dev.svc.cluster.local
手动创建Redis集群
总结
以上就是在Kubernetes中部署Redis的内容,生产环境中在Kubernetes中部署Redis集群需要注意的事项还需根据实际情况进行处理。