终态部署、易扩展、无感升级,Doris Operator 支持高效 Kubernetes 容器化部署方案

技术分享
2025/01/14
SelectDB 技术团队

容器化凭借其灵活性、跨平台性、自动化管理和极致弹性,吸引了众多企业的关注。一些企业希望将 Apache Doris 容器化部署,以实现高效的资源利用与部署迭代。Kubernetes 提供的编排和管理功能,能完成大规模容器部署,但 Kubernetes 自身的复杂性也导致众多企业面临部署复杂、运维困难、使用难度高等挑战。

为满足用户在 Kubernetes 平台上对 Doris 的高效部署和运维要求,飞轮科技推出了 Doris 的 Kubernetes Operator 开源项目(简称:Doris Operator),并捐赠给 Apache 基金会。 该工具集成了原生 Kubernetes 资源的复杂管理能力,并融合了 Doris 组件间的分布式协同、用户集群形态的按需定制等经验,为用户提供了一个更简洁、高效、易用的容器化部署方案。

本文将深入探讨 Doris Operator 在 Kubernetes 上如何实现 Doris 数据仓库部署及管理,包括架构设计、关键功能以及使用演示。通过这些内容,帮助读者更好地理解并应用 Doris Operator。

Doris Operator 是什么?

Doris Operator 由 Apache Doris 商业化公司飞轮科技主导开发 ,旨在实现 Doris 在 Kubernetes 上的高效管控,帮助用户减少运维管理和学习成本的同时,提供强大的功能和灵活的配置能力。Doris Operator(初始版本 24.0.0)经过一年多时间的打磨及完善,已于 2024 年下半年正式开源,并捐赠给 Apache 基金会,成为 Apache Doris 的子项目。

Doris Operator 基于 Kubernetes CustomResourceDefinitions(CRD)实现了 Doris 在 Kubernetes 平台的配置、管理和调度。

Doris Operator 是什么?.png

Doris Operator 能够根据用户自定义的期望状态,自动创建 Pods 及其他资源以启动服务。通过自动注册机制,可将所有启动的服务整合成一个完整的 Doris 集群。这一实现显著降低了在 Doris 集群中处理配置信息、节点发现与注册、访问通信及健康检查等生产环境必备操作的复杂性和学习成本。当前:

  • Doris Operator 兼容 Kubernetes 1.20 及以后版本的标准 Kubernetes 环境
  • Doris Operator 支持 Apache Doris 2.0 及以后版本的部署安装、配置管理、扩缩容、升级和故障管理等关键功能

Doris Operator 架构形态

Doris Operator 的设计基于二层调度器的原理。每个组件的第一层调度使用原生的 StatefulSet 和 Service 资源直接管理相应的 Pod 服务,这使其能够完全兼容开源 Kubernetes 集群,包括公有云、私有云以及自建的 Kubernetes 平台。

Doris Operator 架构形态.png

基于 Doris Operator 提供的部署定义,用户可自定义 Doris 部署状态,并通过 Kubernetes 的 kubectl 管理命令将其下发到 Kubernetes 集群中。Doris Operator 会根据自定义状态将每个服务的部署转换为 StatefulSet 及其附属资源(如 Service),再通过 StatefulSet 调度出期望的 Pods。它通过抽象 Doris 集群的终态,简化了 StatefulSet 规格中不必要的配置,从而降低了用户的学习成本。

关键能力

接下来,将从以下几个方面介绍 Doris Operator:终态部署、易扩展、无感升级、宿主机系统配置、存储配置以及运行时调试。通过对关键能力的介绍,全面展示 Doris Operator 的强大功能和实际应用价值。

01 终态部署

Kubernetes 采用终态运维模式来管理服务,而 Doris Operator 则定义了一种能够描述 Doris 集群的资源类型——DorisCluster。用户可以参考相关文档和使用示例,轻松配置所需的集群。

用户通过 Kubernetes 的命令行工具 kubectl,可以将配置下发到 Kubernetes 集群中。Doris Operator 会自动构建所需的集群,并实时更新集群状态至相应的资源中。这一过程确保了集群的高效管理与监控,极大地简化了运维操作。

举例说明,通过如下简单配置即可让 Doris Operator 启动一个最简单、用于功能测试的集群。

  1. 自动拉起集群: 将以下配置下发 Kubernetes 集群后,Doris Operator 将自动拉起一个包含一个 FE 和一个 BE 的集群,并将状态显示到部署的资源中。
kind: DorisCluster
metadata:
  name: doriscluster-sample
spec:
  feSpec:
    image: apache/doris:fe-ubuntu-2.1.7
    replicas: 1
  beSpec:
    replicas: 1
    image: apache/doris:be-ubuntu-2.1.7
  1. 查看部署状态: 通过 Kubernetes 的命令行工具查看集群的部署状态,部署完成的状态如下
kind: DorisCluster
metadata:
  name: doriscluster-sample
spec:
  beSpec:
    replicas: 1
    image: apache/doris:be-ubuntu-2.1.7
  feSpec:
    image: apache/doris:fe-ubuntu-2.1.7
    replicas: 1
  status:
    beStatus:
      accessService: doriscluster-sample-be-service
      componentCondition:
        lastTransitionTime: "2024-12-20T07:47:13Z"
        message: ""
        phase: available
        reason: ""
        subResourceName: doriscluster-sample-be
      runningInstances:
      - doriscluster-sample-be-0
    feStatus:
      accessService: doriscluster-sample-fe-service
      componentCondition:
        lastTransitionTime: "2024-12-20T07:47:13Z"
        message: ""
        phase: available
        reason: ""
        subResourceName: doriscluster-sample-fe
      runningInstances:
      - doriscluster-sample-fe-0

02 易扩展

Doris Operator 在基于云盘的环境中支持并发实时横向扩容。Doris 的所有组件服务均通过 Kubernetes 的 StatefulSet 进行部署和管理。在部署或扩容时,采用 StatefulSet 的 Paralle 模式创建 Pods,这样理论上可以在启动一个节点的时间内启动所有副本。每个副本的启动互不干扰,当某个服务启动失败时,其他服务的启动不会受到影响。

Doris Operator 采用并发模式启动服务,并内置分布式架构,极大简化了服务扩展的过程。用户只需设置副本数量,即可轻松完成扩容,彻底解放了运维操作的复杂性。

03 无感变更

在分布式环境中,服务重启可能会引发服务的暂时不稳定。尤其对于数据库这类对稳定性要求极高的服务而言,如何在重启过程中保证服务的稳定性是一个非常重要的课题。Doris 在 Kubernetes 上通过三种机制确保服务重启过程中的稳定性,从而实现业务在重启和升级过程中无感知的体验。

机制一:优雅退出策略

Doris 的 BE 服务实现了优雅退出策略。当服务接收到终止信号时,它会等待当前节点上所有查询任务执行完成后再退出。为了兼顾时效性并防止大查询占用过长时间,Doris Operator 提供了超时退出策略,与优雅退出结合使用。在部署服务时,用户可以设置超时时间,一旦超过该时间,服务将被强制终止。

机制二:滚动重启

Doris Operator 采用滚动变更策略,以确保服务的高稳定性。在变更过程中,每当一个节点完成变更后,才会进行下一个节点的变更,这样可以避免一次性变更过多节点导致服务不稳定。如果某个节点的变更失败,系统会重试该节点的变更,直到该节点服务恢复健康后,再继续进行后续节点的变更。

机制三:主动停止查询分配

在 BE 服务主动退出时,它会向 FE 服务发送通知,以停止分配新的查询任务。当 BE 服务重新启动并恢复正常后,FE 服务会通过反向检测确认这一状态,并恢复新的查询任务分配。Doris 通过主动汇报和反向检查机制,实现了服务的安全退出,并能够在 BE 服务健康时及时处理任务。

Doris Operator 采用三种机制实现服务的无感变更,确保在容器化环境中仍能保持极高的稳定性。在不断追求稳定性的过程中,Doris 正在实现落盘与重试机制。未来,Doris Operator 将持续演化,增强对 Doris 内核的配置能力。

04 宿主机系统配置

在某些场景中,需要配置宿主机系统参数来达到 Apache Doris 的理想性能。而在容器化场景下,宿主机的部署不确定和参数修改难度高给用户带来挑战。为解决该问题,Doris Operator 通过利用 Kubernetes 的初始化容器,实现了宿主机参数的可配置化。

Doris Operator 允许用户配置在宿主机上执行的命令,并通过初始化容器使其生效。为了提升可用性,Doris Operator 抽象了 Kubernetes 初始化容器的配置方式,使宿主机命令的设置更加简单直观。

以下是设置 BE 所在的宿主机对操作系统可用最大内存块数量的配置示例:

kind: DorisCluster
metadata:
  name: doriscluster-sample-system-params
spec:
  feSpec:
    replicas: 1
    image: apache/doris:fe-ubuntu-2.1.7
  beSpec:
    replicas: 3
    image: apache/doris:be-ubuntu-2.1.7
    systemInitialization:
      command: ["/sbin/sysctl", "-w", "vm.max_map_count=2000000"]

05 存储配置

Doris Operator 采用 Kubernetes StorageClass 模式为各个服务提供存储配置。它允许用户自定义挂载目录,在自定义启动配置时,如果修改了存储目录,可以在自定义资源中将该目录设置为持久化位置,从而使服务使用容器内指定的目录来存储数据。

默认配置存储 FE 元数据目录和 BE 数据目录的配置如下:

kind: DorisCluster
metadata:
  name: doriscluster-sample
spec:
  feSpec:
    replicas: 1
    image: apache/doris:fe-ubuntu-2.1.7
     persistentVolumes:
     - mountPath: /opt/apache-doris/fe/doris-meta
       name: fe-meta
       persistentVolumeClaimSpec:
         accessModes:
         - ReadWriteOnce
         resources:
           requests:
             storage: 10Gi
  beSpec:
    replicas: 3
    persistentVolumes:
    - mountPath: /opt/apache-doris/be/storage
      name: be-storage
      persistentVolumeClaimSpec:
        accessModes:
        - ReadWriteOnce
        resources:
          requests:
            storage: 10Gi
    image: apache/doris:be-ubuntu-2.1.7

Doris Operator 提供自定义定制 annotations 的能力,能够适应各种私有云环境。此外,Doris Operator 还提供了实时在线扩容的 Beta 版本(计划在 25.0.0 版本中正式发布)。在云盘模式下,允许在运行时扩展磁盘容量,无需重启服务。如需启用磁盘扩容功能,请将 persistentVolume 的 provisioner 设置为 Operator,示例如下:

kind: DorisCluster
metadata:
  name: doriscluster-sample
spec:
  feSpec:
    replicas: 1
    image: apache/doris:fe-ubuntu-2.1.7
     persistentVolumes:
     - mountPath: /opt/apache-doris/fe/doris-meta
       name: fe-meta
       persistentVolumeClaimSpec:
         accessModes:
         - ReadWriteOnce
         resources:
           requests:
             storage: 10Gi
  beSpec:
    replicas: 3
    persistentVolumes:
    - mountPath: /opt/apache-doris/be/storage
      name: be-storage
      provisioner: Operator
      persistentVolumeClaimSpec:
        accessModes:
        - ReadWriteOnce
        resources:
          requests:
            storage: 10Gi
    image: apache/doris:be-ubuntu-2.1.7

注意:如果使用运行时修改存储的能力后,以后 provisioner 的值不会再允许修改。

06 运行时调试

容器化服务对于 Trouble Shotting 来说最大挑战之一是如何在运行时进行调试。Doris Operator 在追求可用性和易用性的同时,也为问题定位提供了更便利的条件。在 Doris 的基础镜像中,预置了多种用于问题定位的工具。当需要实时查看状态时,可以通过 kubectl 提供的 exec 命令进入容器,使用内置工具进行故障排查。

当服务因未知原因无法启动时,Doris Operator 提供了Debug运行模式。当一个 Pod 被设置为Debug启动模式时,容器将自动进入运行状态。这时可通过exec命令进入容器,手动启动服务并进行问题定位。详细使用请参考: Doris Operator 的官网

集群创建及管理使用演示

01 创建集群

使用如下配置创建 3 个 FE 和 3 个 BE 的简易测试集群:

kind: DorisCluster
metadata:
  labels:
    app.kubernetes.io/name: doriscluster
    app.kubernetes.io/instance: doriscluster-sample
  name: doriscluster-sample
spec:
  feSpec:
    replicas: 3
    image: apache/doris:fe-ubuntu-2.1.7
    service:
      type: NodePort
  beSpec:
    replicas: 3
    image: apache/doris:be-ubuntu-2.1.7

执行命令如下:

kubectl apply -f doriscluster-sample.yaml
kubectl get pods

部署方式和结果检测:

部署方式和结果检测.gif

02 集群管理

部署集群后,可直接通过修改部署资源对应组件的副本数进行扩缩容。当修改后,Doris Operator 接收后会根据指定的服务的副本数对服务进行扩缩容。将 BE 服务从 3 副本数扩充到 5 副本数样例如下:

执行命令如下:

kubectl get pods
kubectl patch doriscluster doriscluster-sample --type merge --patch '{"spec":{"beSpec":{"replicas":3}}}'
kubectl get pods

集群管理.gif

通过直接修改 BE 的副本数,Doris Operator 接收变更后会自动创建新的 Pod 节点,将服务加入 Doris 集群中。

除上述主要功能外,Doris Operator 还提供了 Kubernetes 服务调度及其他能力,可通过: Kubernetes 部署 详细了解。

未来规划

  • 终态化: Doris Operator 未来将会把 Doris 在 Kubernetes 所有运维操作终态化,用户只需要通过 Kubernetes 的设置资源方式就可以实现所有 Doris 的管控。
  • 精细化: 未来 Doris Operator 会与 Doris 更紧密的结合,提供更加清晰明了的服务侧写,帮助用户更加清晰的感知 Doris 状态。借助 Doris 提供的可观测性服务及管理能力,在 Kubernetes 平台上实现精细化管理,推动 Doris 的 serverless 无感知化发展,为用户提供更稳定保障。
  • 自动化与智能化: 实现基于 Kubernetes 平台的服务自动化运维管理,可基于当前数据库的状态侧写以及历史可观测性信息,将 Doris 服务维稳到最佳状态。从最简单的自动化扩缩容,到服务状态的自我诊断,最终到服务最佳状态的调整,迈向 AI 智能化之境。