跳转到内容

RocketMQ on Kubernetes 运维面试题

3 道题
分类
Kubernetes
子分类
middleware-ops
题目数
3 道
已阅读 0 / 3 题
7 RocketMQ Operator 的架构与 Kubernetes 部署流程是怎样的

答案:

RocketMQ Operator 基于 Kubernetes Operator 模式实现 RocketMQ 集群的自动化部署、扩缩容与生命周期管理,通过 CRD 定义 NameServer、Broker 等资源并以自定义调度逻辑编排 Pod 的创建与更新。

[分层展开]

  • Operator 架构:基于 controller-runtime 框架;通过 Custom Resource(CR)描述 RocketMQ 集群拓扑;Controller 监听 CR 变更并执行 Reconcile 循环将实际状态调整为目标状态。
  • 核心 CRDNameService 定义 NameServer 集群;Broker 定义 Broker 组(主从关系);TopicTransfer 定义 Topic 自动创建与负载均衡;Console 部署 RocketMQ 控制台。
  • Controller 职责:NameServer Controller 管理 NameServer Pod 的创建、更新、滚动升级;Broker Controller 管理 Broker StatefulSet 的扩缩容与镜像升级。
  • 部署流程:安装 Operator(Helm Chart 或 YAML);创建 NameServer CR 拉起 NameServer 集群;创建 Broker CR 拉起 Broker StatefulSet;Topic 经 CR 或 API 创建;Producer/Consumer 通过 K8s Service 访问。
# NameService CR 示例
apiVersion: rocketmq.apache.org/v1alpha1
kind: NameService
metadata:
  name: name-service
spec:
  size: 2
  image: apache/rocketmq:5.3.0
  hostNetwork: false
  resources:
    requests:
      memory: 512Mi
      cpu: 250m
    limits:
      memory: 1Gi
      cpu: 500m

# Broker CR 示例
apiVersion: rocketmq.apache.org/v1alpha1
kind: Broker
metadata:
  name: broker
spec:
  size: 2
  clusterName: DefaultCluster
  brokerImage: apache/rocketmq:5.3.0
  nameServers: name-service:9876
  replicationMode: DLedger
  storage:
    size: 100Gi
    storageClassName: ssd
8 RocketMQ 在 Kubernetes 上的 StatefulSet 配置有哪些关键要点

答案:

RocketMQ Broker 与 NameServer 以 StatefulSet 形式部署在 Kubernetes 上,关键配置包括稳定网络标识、持久化存储绑定、反亲和性调度与资源限制。

[分层展开]

  • 稳定网络标识:StatefulSet 为每个 Pod 分配固定网络标识(如 broker-0.broker-svc.default.svc.cluster.local);Dledger 模式依赖固定标识进行 Raft 通信。
  • PodManagementPolicy:使用 OrderedReady 策略确保 Pod 顺序启动,Dledger 场景下确保 n0 先启动以完成选举。
  • PVC 模板:通过 volumeClaimTemplates 为每个 Pod 自动创建 PVC;Pod 重调度后 PVC 自动重新挂载,数据不丢失。
  • 反亲和性(anti-affinity):通过 podAntiAffinity 将同一 Broker Group 的 Pod 分散到不同节点,避免单点故障。
  • Headless Service:配置 clusterIP: None 的 Headless Service,为 StatefulSet 提供 DNS 解析;Dledger 节点通过 DNS 发现彼此。
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: broker
spec:
  serviceName: broker-svc
  replicas: 3
  podManagementPolicy: OrderedReady
  selector:
    matchLabels:
      app: broker
  template:
    metadata:
      labels:
        app: broker
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - broker
            topologyKey: kubernetes.io/hostname
      containers:
      - name: broker
        image: apache/rocketmq:5.3.0
        command:
        - sh
        - mqbroker
        args:
        - -n
        - name-service:9876
        - -c
        - /home/rocketmq/conf/broker.conf
        ports:
        - containerPort: 10911
          name: remoting
        - containerPort: 40911
          name: dledger
        resources:
          requests:
            memory: 2Gi
            cpu: 1
          limits:
            memory: 4Gi
            cpu: 2
        volumeMounts:
        - name: data
          mountPath: /home/rocketmq/store
        - name: config
          mountPath: /home/rocketmq/conf
      volumes:
      - name: config
        configMap:
          name: broker-config
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: ["ReadWriteOnce"]
      storageClassName: ssd
      resources:
        requests:
          storage: 200Gi
30 RocketMQ on Kubernetes 生产环境有哪些最佳实践

答案:

RocketMQ on Kubernetes 生产环境最佳实践涵盖集群拓扑规划、资源配置、持久化存储、高可用架构、监控告警、安全加固与运维自动化七个方面。

[分层展开]

集群拓扑规划

组件推荐数量部署形式说明
NameServer3Deployment(无状态)独立于 Broker 部署,避免共享故障域
Broker Master2+(每个 Group)StatefulSet(有状态)Dledger 模式每个 Group 3 副本
Proxy3DeploymentRocketMQ 5.x 启用 gRPC 协议,端口 8080/8443承载客户端连接(替代部分 10911 流量)
Controller3StatefulSetRocketMQ 5.0 自动主从切换

持久化存储

# 使用高性能 SSD StorageClass
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: rocketmq-ssd
provisioner: pd.csi.storage.gke.io  # 以 GCP 为例
parameters:
  type: pd-ssd
reclaimPolicy: Retain
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true

资源配置

resources:
  requests:
    memory: 4Gi
    cpu: 2
  limits:
    memory: 8Gi
    cpu: 4

高可用架构

  • 反亲和性:同一 Broker Group 的 Pod 分散在不同可用区/节点。
  • PodDisruptionBudget:设置 maxUnavailable: 1 阻止维护期间 Broker 全部下线。
  • 健康检查:Liveness Probe 检查进程存活、Readiness Probe 检查 Broker 是否可注册。
livenessProbe:
  exec:
    command:
    - sh
    - -c
    - /home/rocketmq/bin/mqadmin clusterList -n localhost:9876 | grep BROKER
  initialDelaySeconds: 30
  periodSeconds: 10
  
readinessProbe:
  tcpSocket:
    port: 10911
  initialDelaySeconds: 20
  periodSeconds: 5

监控告警

  • Prometheus Exporter + Grafana Dashboard;
  • 关键告警规则:消费者堆积超过 10 万条;Consumer 全部离线(心跳丢失);磁盘使用率超过 80%;Broker 组件宕机;Broker 5xx 错误率突增
# PrometheusRule 示例
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  name: rocketmq-alerts
spec:
  groups:
  - name: rocketmq
    rules:
    - alert: RocketMQConsumerLagHigh
      expr: (rocketmq_broker_offset - rocketmq_consumer_offset) > 100000
      for: 5m
      labels:
        severity: warning
      annotations:
        summary: "Consumer Group {{ $labels.consumer_group }} 堆积超过 10 万"

安全加固

  • 启用 ACL 基于 AK/SK 认证授权;
  • NetworkPolicy 限制 Broker 仅被指定标签的 Pod 访问;
  • NameServer 不对外暴露,仅集群内访问;
  • Secret 管理 AK/SK。

运维自动化

  • 基于 CronJob 的定期备份(VolumeSnapshot + CommitLog 文件备份);
  • 使用 ArgoCD / Flux 进行 GitOps 管理 CR 声明;
  • Helm Chart 版本化管理组件配置;
  • HPA 自动扩缩容 Consumer 实例;
  • 定期演练主从切换与灾备恢复。
# NetworkPolicy 限制 Broker 访问
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: broker-access
spec:
  podSelector:
    matchLabels:
      app: broker
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector:
        matchExpressions:
        - key: app
          operator: In
          values:
          - proxy
          - name-server
    ports:
    - port: 10911
      protocol: TCP