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

🎯 实验目标

  1. 在 OKD 集群上安装 Redis Operator
  2. 分别使用手动部署和 Operator 两种方式部署 Redis
  3. 对比两种方式的优劣

一、安装 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, 云原生

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐