OKD/OpenShift Operator 实践:手动部署 vs Operator 管理 Redis 对比
·
OKD/OpenShift Operator 实践:手动部署 vs Operator 管理 Redis 对比
本文通过在 OKD 4.21 单节点集群上部署 Redis,对比传统手动部署与 Operator 管理两种方式的差异,帮助大家深入理解 Kubernetes Operator 的价值。
📋 环境信息
| 项目 | 版本/信息 |
|---|---|
| 平台 | OKD 4.21.0 (okd-scos) |
| Kubernetes | v1.34.1 |
| 部署模式 | SNO (Single Node OpenShift) |
| 存储 | LVMS (lvms-vg1) |
| Redis Operator | Opstree Redis Operator v0.15.1 |
🎯 实验目标
- 在 OKD 集群上安装 Redis Operator
- 分别使用手动部署和 Operator 两种方式部署 Redis
- 对比两种方式的优劣
一、安装 Redis Operator
1.1 查看可用的 Operator
# 在 OperatorHub 中搜索 Redis Operator
oc get packagemanifests -n openshift-marketplace | grep -i redis
输出:
redis-operator Community Operators 22h
1.2 创建 Subscription 订阅 Operator
Redis Operator 默认安装在 openshift-operators 命名空间,可以管理所有命名空间的 Redis 实例。
# 检查 Operator 安装状态
oc get csv -n openshift-operators | grep redis
输出:
redis-operator.v0.15.1 Redis Operator 0.15.1 Succeeded
1.3 查看 Operator 创建的 CRD
oc get crd | grep redis
输出:
redis.redis.redis.opstreelabs.in 2026-01-13T06:22:12Z
redisclusters.redis.redis.opstreelabs.in 2026-01-13T06:22:13Z
redisreplications.redis.redis.opstreelabs.in 2026-01-13T06:22:13Z
redissentinels.redis.redis.opstreelabs.in 2026-01-13T06:22:13Z
Operator 提供了 4 种 Redis 部署模式:
- Redis - 单节点模式
- RedisCluster - 集群模式
- RedisReplication - 主从复制模式
- RedisSentinel - 哨兵模式
二、方式一:手动部署 Redis
2.1 创建命名空间
oc create namespace redis-manual
2.2 创建所需资源
手动部署需要分别创建以下资源:
ConfigMap(配置文件)
apiVersion: v1
kind: ConfigMap
metadata:
name: redis-config
namespace: redis-manual
data:
redis.conf: |
bind 0.0.0.0
port 6379
maxmemory 128mb
maxmemory-policy allkeys-lru
PersistentVolumeClaim(持久化存储)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: redis-data
namespace: redis-manual
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: lvms-vg1
Deployment(部署)
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis-manual
namespace: redis-manual
spec:
replicas: 1
selector:
matchLabels:
app: redis-manual
template:
metadata:
labels:
app: redis-manual
spec:
containers:
- name: redis
image: quay.io/opstree/redis:v7.0.12
ports:
- containerPort: 6379
resources:
requests:
memory: 128Mi
cpu: 100m
limits:
memory: 256Mi
cpu: 200m
Service(服务)
oc expose deployment redis-manual --port=6379 -n redis-manual
2.3 验证部署
oc get pods,svc,pvc -n redis-manual
输出:
NAME READY STATUS RESTARTS AGE
pod/redis-manual-7d5cd487cd-kpz89 1/1 Running 0 34s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/redis-manual ClusterIP 172.30.19.43 <none> 6379/TCP 8s
NAME STATUS VOLUME CAPACITY ACCESS MODES
persistentvolumeclaim/redis-data Pending lvms-vg1
三、方式二:使用 Operator 部署 Redis
3.1 创建命名空间
oc create namespace redis-demo
3.2 创建 Redis CR(Custom Resource)
只需要一个简单的 YAML 文件:
apiVersion: redis.redis.opstreelabs.in/v1beta2
kind: Redis
metadata:
name: redis-operator
namespace: redis-demo
spec:
kubernetesConfig:
image: quay.io/opstree/redis:v7.0.12
imagePullPolicy: IfNotPresent
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 200m
memory: 256Mi
storage:
volumeClaimTemplate:
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: lvms-vg1
redisExporter:
enabled: true
image: quay.io/opstree/redis-exporter:v1.44.0
应用配置:
oc apply -f redis-operator.yaml
3.3 验证部署
oc get pods,svc,pvc -n redis-demo
输出:
NAME READY STATUS RESTARTS AGE
pod/redis-operator-0 2/2 Running 0 24s
NAME TYPE CLUSTER-IP PORT(S) AGE
service/redis-operator ClusterIP 172.30.77.14 6379/TCP,9121/TCP 24s
service/redis-operator-additional ClusterIP 172.30.46.59 6379/TCP 24s
service/redis-operator-headless ClusterIP None 6379/TCP 24s
NAME STATUS CAPACITY
persistentvolumeclaim/redis-operator-redis-operator-0 Bound 1Gi
注意观察:Operator 自动创建了:
- StatefulSet(而非 Deployment,更适合有状态应用)
- 3 个 Service(主服务、附加服务、Headless 服务)
- PVC(自动管理存储)
- 2 个容器(Redis + Exporter 监控)
四、📊 对比总结
| 对比维度 | 手动部署 | Operator 部署 |
|---|---|---|
| YAML 文件数量 | 4 个 (ConfigMap/PVC/Deployment/Service) | 1 个 (Redis CR) |
| 代码行数 | ~80 行 | ~30 行 |
| Pod 类型 | Deployment | StatefulSet ✅ |
| 自动创建资源 | 无 | Service×3、PVC、StatefulSet |
| 监控支持 | ❌ 需手动配置 | ✅ 内置 redis-exporter (9121端口) |
| 健康检查 | ❌ 需手动配置 | ✅ 自动配置 |
| 高可用模式 | ❌ 需自己实现 | ✅ 支持 Cluster/Replication/Sentinel |
| 升级管理 | 手动操作 | 修改 CR 自动完成 |
| 故障恢复 | 需人工介入 | Operator 自动处理 |
资源对比图
┌─────────────────────────────────────────────────────────────┐
│ 手动部署 │
├─────────────────────────────────────────────────────────────┤
│ ConfigMap + PVC + Deployment + Service │
│ ↓ ↓ ↓ ↓ │
│ 配置文件 存储 Pod管理 网络访问 │
│ │
│ 需要分别创建和维护 4 个独立资源 │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ Operator 部署 │
├─────────────────────────────────────────────────────────────┤
│ Redis CR │
│ ↓ │
│ ┌───────────────┐ │
│ │ Operator │ │
│ └───────┬───────┘ │
│ ┌─────────────┼─────────────┐ │
│ ↓ ↓ ↓ │
│ StatefulSet Service×3 PVC │
│ ↓ │
│ Pod (Redis + Exporter) │
│ │
│ 只需创建 1 个 CR,Operator 自动管理所有资源 │
└─────────────────────────────────────────────────────────────┘
五、🎓 Operator 核心优势
5.1 声明式管理
# 想要 3 节点集群?只需修改 CR:
spec:
clusterSize: 3
5.2 内置最佳实践
- 自动使用 StatefulSet(有状态应用最佳实践)
- 自动配置健康检查和就绪探针
- 自动创建 Headless Service(用于集群发现)
5.3 运维自动化
- 故障恢复:Pod 异常时自动重建
- 滚动更新:版本升级零停机
- 扩缩容:修改 CR 自动完成
5.4 可观测性
- 内置 Prometheus Exporter
- 开箱即用的监控指标(端口 9121)
六、🧹 清理资源
# 删除手动部署的 Redis
oc delete namespace redis-manual
# 删除 Operator 部署的 Redis
oc delete redis redis-operator -n redis-demo
oc delete namespace redis-demo
七、💡 总结
| 场景 | 推荐方式 |
|---|---|
| 学习 K8s 原生资源 | 手动部署 |
| 简单测试环境 | 手动部署 |
| 生产环境 | Operator ✅ |
| 需要高可用 | Operator ✅ |
| 需要监控告警 | Operator ✅ |
| 多实例管理 | Operator ✅ |
Operator 本质上是将运维专家的经验编码成软件,让复杂的有状态应用管理变得简单可靠。对于 Redis、MySQL、PostgreSQL、Kafka 等有状态应用,强烈推荐使用 Operator 进行管理。
参考资料
📝 作者:OKD 学习笔记
📅 日期:2026年1月13日
🏷️ 标签:OKD, OpenShift, Kubernetes, Operator, Redis, 云原生
更多推荐


所有评论(0)