Kubernetes部署Redis实战
·
技术文章大纲:Kubernetes部署Redis实战指南
引言
简要介绍Redis的核心特性(高性能键值存储、缓存、消息队列等)及其在云原生场景中的重要性。
说明Kubernetes部署Redis的优势:弹性扩缩容、高可用性、自动化运维等。
环境准备
- Kubernetes集群要求:版本兼容性(如v1.19+)、节点资源(CPU/内存)。
- 工具依赖:
kubectl、helm(可选)、Redis客户端测试工具。
部署方案选择
- 方案1:直接通过Deployment+Service部署
适用场景:快速测试或单节点Redis实例。 - 方案2:使用StatefulSet部署有状态Redis
适用场景:生产环境需持久化数据、支持Pod有序启停。 - 方案3:Helm Chart部署Redis集群
适用场景:快速部署高可用集群(如bitnami/redis社区Chart)。
详细部署步骤(以StatefulSet为例)
1. 创建持久化存储
示例PVC配置:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: redis-data-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
2. 编写StatefulSet配置
关键字段:
serviceName:定义Headless Service用于Pod DNS解析。volumeClaimTemplates:动态绑定PVC以实现数据持久化。
3. 配置Redis安全性
- 通过
ConfigMap注入redis.conf(如启用密码认证):requirepass your_strong_password
4. 部署Headless Service
用于内部通信和集群发现,示例:
apiVersion: v1
kind: Service
metadata:
name: redis-headless
spec:
clusterIP: None
ports:
- port: 6379
selector:
app: redis
高可用与集群配置
- 主从复制:通过
redis.conf配置replicaof指令。 - Redis Cluster模式:使用多个StatefulSet分片,配置
cluster-enabled yes。
监控与运维
- 集成Prometheus:通过Redis Exporter暴露指标。
- 日志收集:配置Fluentd或Filebeat采集Redis容器日志。
常见问题排查
- 数据持久化失败:检查PVC绑定状态及存储类配置。
- 网络连通性问题:验证Service DNS解析及网络策略。
性能优化建议
- 资源限制:为容器设置合理的
requests/limits(如4核CPU、8GB内存)。 - 内核参数调优:调整
vm.overcommit_memory避免OOM。
########################################
# 1️⃣ Secret(Redis 密码)
########################################
apiVersion: v1
kind: Secret
metadata:
name: redis-secret
type: Opaque
stringData:
REDIS_PASSWORD: StrongPassw0rd!
---
########################################
# 2️⃣ ConfigMap(生产级 Redis 配置)
########################################
apiVersion: v1
kind: ConfigMap
metadata:
name: redis-config
data:
redis.conf: |
bind 0.0.0.0
port 6379
protected-mode yes
# 认证
requirepass ${REDIS_PASSWORD}
# 数据目录
dir /data
############################
# 持久化(生产推荐)
############################
appendonly yes
appendfsync everysec
no-appendfsync-on-rewrite yes
save 900 1
save 300 10
save 60 10000
############################
# 内存 & 淘汰策略
############################
maxmemory 1gb
maxmemory-policy allkeys-lru
############################
# 稳定性
############################
timeout 0
tcp-keepalive 300
############################
# 安全
############################
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command KEYS ""
---
########################################
# 3️⃣ Headless Service(StatefulSet 必需)
########################################
apiVersion: v1
kind: Service
metadata:
name: redis-headless
spec:
clusterIP: None
selector:
app: redis
ports:
- port: 6379
name: redis
---
########################################
# 4️⃣ 对外 Service(如不需要外网可删)
########################################
apiVersion: v1
kind: Service
metadata:
name: redis
spec:
type: NodePort
selector:
app: redis
ports:
- port: 6379
targetPort: 6379
nodePort: 30637
---
########################################
# 5️⃣ StatefulSet(核心)
########################################
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: redis
spec:
serviceName: redis-headless
replicas: 1
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
spec:
terminationGracePeriodSeconds: 30
containers:
- name: redis
image: sealos.hub:5000/repo/redis:7.2
imagePullPolicy: IfNotPresent
command:
- sh
- -c
- |
exec redis-server /etc/redis/redis.conf \
--requirepass "$REDIS_PASSWORD"
env:
- name: REDIS_PASSWORD
valueFrom:
secretKeyRef:
name: redis-secret
key: REDIS_PASSWORD
ports:
- containerPort: 6379
resources:
requests:
cpu: "100m"
memory: "512Mi"
limits:
cpu: "1"
memory: "2Gi"
volumeMounts:
- name: redis-data
mountPath: /data
- name: redis-config
mountPath: /etc/redis
readinessProbe:
exec:
command:
- sh
- -c
- |
redis-cli -a "$REDIS_PASSWORD" ping | grep -q PONG
initialDelaySeconds: 10
periodSeconds: 10
livenessProbe:
exec:
command:
- sh
- -c
- |
redis-cli -a "$REDIS_PASSWORD" ping | grep -q PONG
initialDelaySeconds: 30
periodSeconds: 20
volumes:
- name: redis-config
configMap:
name: redis-config
########################################
# 6️⃣ PVC 模板(每个 Pod 一个盘)
########################################
volumeClaimTemplates:
- metadata:
name: redis-data
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: local-path # ❗ 非 NFS(改成你的本地/云盘)
resources:
requests:
storage: 10Gi
这个是官方的部署方式、我没有云盘就只能使用nfs
官方不推荐
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: redis
spec:
serviceName: redis
replicas: 1
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
spec:
securityContext:
fsGroup: 999
containers:
- name: redis
image: sealos.hub:5000/repo/redis:7.2
command: ["redis-server"]
args:
- "/etc/redis/redis.conf"
ports:
- containerPort: 6379
resources:
requests:
cpu: "100m"
memory: "512Mi"
limits:
cpu: "1"
memory: "2Gi"
volumeMounts:
- name: redis-data
mountPath: /data
- name: redis-config
mountPath: /etc/redis/redis.conf
subPath: redis.conf
volumes:
- name: redis-config
configMap:
name: redis-config
volumeClaimTemplates:
- metadata:
name: redis-data
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: nfs # ✅ 用你真实存在的
resources:
requests:
storage: 10Gi
一下是redis-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: redis-config
data:
redis.conf: |
bind 0.0.0.0
port 6379
protected-mode yes
requirepass StrongPassw0rd!
appendonly yes
appendfsync everysec
dir /data
maxmemory 1500mb
maxmemory-policy allkeys-lru
save 900 1
save 300 10
save 60 10000
kubectl apply -f redis-statefulset.yaml
kubectl apply -f redis-config.yaml
更多推荐
所有评论(0)