ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

使用 Helm 在 Kubernetes 上部署 Apache Druid:完整配置与实战指南

使用 Helm 在 Kubernetes 上部署 Apache Druid:完整配置与实战指南 【免费下载链接】charts⚠️(OBSOLETE) Curated applications for Kubernetes项目地址https://gitcode.com/gh_mirrors/chart/charts点击查看免费下载Apache Druid 是一款高性能的实时分析数据库本指南基于本仓库incubator/druid目录下的 Helm Chart系统讲解如何在 Kubernetes 集群中安装、配置和运维 Druid。通过阅读本文你将掌握 Druid 六大核心组件Overlord、Broker、Coordinator、Historical、Middle Manager、Router的部署方式、全部可配置参数的作用与默认值以及如何通过环境变量、ConfigMap、Ingress 和持久化存储实现生产级部署。一、仓库与 Chart 概览本仓库的incubator/druid目录包含一个完整的 Apache Druid Helm ChartChart 版本0.2.18对应应用版本0.19.0用于将 Druid 部署到 Kubernetes 集群。Chart 结构如下Chart.yamlChart 元数据名称、版本、描述、关键字 olap/database/analyticsvalues.yaml所有可配置参数及其默认值values.yamlrequirements.yaml依赖声明Zookeeper、MySQL、PostgreSQLtemplates/Kubernetes 资源模板按组件分目录组织README.md官方使用文档README.md从 Chart.yaml 可以看到该 Chart 声明了deprecated: true这是仓库归档后的标记。注意本仓库自 2020 年 11 月起停止更新Chart 已被标记为弃用仅适用于学习参考或兼容旧版本场景不建议用于新项目生产部署。Chart 通过 requirements.yaml 声明了三个可选依赖依赖版本启用条件zookeeper2.1.4zookeeper.enabled默认 truemysql1.6.4mysql.enabled默认 falsepostgresql8.6.4postgresql.enabled默认 true二、快速安装一条命令拉起 Druid2.1 安装 Charthelm install --namespace druid --name druid incubator/druid该命令会在druid命名空间中创建一个名为druid的 release。安装成功后# 查看 release 状态 helm status druid如需删除整个部署连同 PVC 一起清除helm delete --purge druid2.2 访问 Druid 控制台安装完成后Chart 自带的 NOTES.txt 会根据router.serviceType的类型给出访问提示。默认serviceType为ClusterIP此时可以通过端口转发访问export POD_NAME$(kubectl get pods --namespace druid -l appdruid,releasedruid -o jsonpath{.items[0].metadata.name}) kubectl port-forward $POD_NAME 8080:8888然后访问http://127.0.0.1:8080即可打开 Druid Router 控制台。如果设置了router.serviceType为NodePort或LoadBalancer对应访问方式如下# NodePort 方式 export NODE_PORT$(kubectl get --namespace druid -o jsonpath{.spec.ports[0].nodePort} services druid-router) export NODE_IP$(kubectl get nodes --namespace druid -o jsonpath{.items[0].status.addresses[0].address}) echo http://$NODE_IP:$NODE_PORT # LoadBalancer 方式IP 可能需要几分钟才能就绪 kubectl get svc -w druid-router export SERVICE_IP$(kubectl get svc --namespace druid druid-router -o jsonpath{.status.loadBalancer.ingress[0].ip}) echo http://$SERVICE_IP:8888三、核心架构六个可部署组件Druid 采用查询节点、摄取节点、协调节点分离的分布式架构本 Chart 默认将其中六个核心服务打包为独立工作负载组件默认启用工作负载类型默认端口默认副本核心职责Overlord否Deployment80811接收摄取任务并下发调度Broker是Deployment80821接收客户端查询请求路由到各节点Coordinator是Deployment80811管理数据段segment的加载、均衡与保留Historical是StatefulSet80831加载并服务已发布的数据段Middle Manager是StatefulSet80911启动 Peon 执行实时摄取任务Router是Deployment88881统一查询入口路由到 Broker 等节点每个组件的源码模板位于templates/component/目录下例如 templates/broker/、templates/historical/。3.1 无状态组件与有状态组件的取舍从模板结构可以清晰看出两类组件的差异Deployment无状态Broker、Coordinator、Overlord、Router 使用 Deployment。它们的核心状态元数据、数据段信息存储在外部依赖ZooKeeper 元数据库中因此可以随时扩缩容、滚动更新。查看 broker/deployment.yaml 可知容器启动参数为args: [ broker ]通过broker.config注入 JVM 与处理线程等私有配置。StatefulSet有状态Historical 和 Middle Manager 使用 StatefulSet且默认开启持久化。因为它们需要在本地磁盘缓存/写入数据段segment持久卷保证了节点重启后数据不丢失。每个 Pod 会获得稳定的网络标识与独立的 PVC见 historical/statefulset.yaml。以 historical/statefulset.yaml 为例其持久化通过volumeClaimTemplates实现volumeClaimTemplates: - metadata: name: data spec: accessModes: - ReadWriteOnce resources: requests: storage: 4Gi数据挂载点为/opt/druid/var/druid/。若设置historical.persistence.enabled: false则改用emptyDir临时卷。四、Chart 前缀与命名规范Chart 前缀为避免多个 release 或组件之间资源名冲突本 Chart 会自动以 release 名称作为前缀拼接所有资源名。命名逻辑定义在 _helpers.tpl全局资源名{{ release-name }}-{{ chart-name }}例如druid-druid会被自动去重为druid组件资源名{{ fullname }}-{{ component.name }}例如druid-broker、druid-historical、druid-middleManager这些名称会作为 Pod 标签app、component、release、chart、heritage被注入到所有资源中方便通过 label 进行选择和运维。五、URL 前缀六个对外端点本 Chart 暴露 6 个 HTTP 端点分别对应六大组件Druid Overlord8081Druid Broker8082Druid Coordinator8081Druid Historical8083Druid Middle Manager8091Druid Router8888每个组件都配套了Service与可选的Ingress模板。Service 默认类型为ClusterIP可通过各组件的serviceType调整为NodePort或LoadBalancer。5.1 配置 Ingress每个组件都支持独立的 Ingress 配置例如 Brokerbroker: ingress: enabled: false annotations: {} # kubernetes.io/ingress.class: nginx # kubernetes.io/tls-acme: true path: / hosts: - chart-example.local tls: [] # - secretName: chart-example-tls # hosts: # - chart-example.local参数说明enabled是否创建 Ingress 资源默认falseannotationsIngress 注解例如指定 Ingress Controller 类型或启用 Lets Encrypt 自动签发 TLS 证书kubernetes.io/tls-acme: truepathAPI 的访问路径默认/hosts域名列表默认[ chart-example.local ]需替换为实际域名tlsTLS 证书配置可引用已创建的 SecretIngress 模板实现在各组件的ingress.yaml中例如 broker/ingress.yaml。六、Druid 配置的两种注入方式6.1 全局配置ConfigMapconfigVarsChart 会将configVars中的键值对渲染为一个 ConfigMap模板见 configmap.yaml并通过envFrom.configMapRef注入到所有组件的容器环境中。默认内容如下configVars: # DRUID env vars DRUID_USE_CONTAINER_IP: true ## Druid Common Configurations druid_extensions_loadList: [druid-histogram, druid-datasketches, druid-lookups-cached-global, postgresql-metadata-storage] druid_metadata_storage_type: postgresql druid_metadata_storage_connector_connectURI: jdbc:postgresql://postgres:5432/druid druid_metadata_storage_connector_user: druid druid_metadata_storage_connector_password: druid druid_storage_type: local druid_indexer_logs_type: file druid_indexer_logs_directory: /opt/data/indexing-logs ## Druid Emitting Metrics druid_emitter: noop druid_emitter_logging_logLevel: debug druid_emitter_http_recipientBaseUrl: http://druid_exporter_url:druid_exporter_port/druid这些键值对应 Druid 的配置规范Druid 会将环境变量名中的_转换为.后作为配置属性。要点DRUID_USE_CONTAINER_IP: true让 Druid 使用容器 IP 进行节点间通信Kubernetes 环境必需druid_extensions_loadList指定要加载的扩展默认加载druid-histogram直方图、druid-datasketches近似聚合、druid-lookups-cached-global全局缓存查找以及元数据存储扩展druid_metadata_storage_type与连接参数元数据存储连接信息。该值会被下方 6.3 的依赖配置逻辑按需覆盖druid_storage_type: localsegment 深度存储类型druid_emitter: noop指标发射器可按需改为logging或http6.2 组件私有配置config每个组件的config字段只对该组件生效用于覆盖全局配置典型如 JVM 堆参数与处理线程数broker: config: DRUID_XMX: 512m DRUID_XMS: 512m DRUID_MAXDIRECTMEMORYSIZE: 400m druid_processing_buffer_sizeBytes: 50000000 druid_processing_numMergeBuffers: 2 druid_processing_numThreads: 1在 Deployment/StatefulSet 模板中组件私有配置以普通env注入优先级高于envFrom的 ConfigMap例如 broker/deployment.yamlenv: - name: DRUID_XMX value: 512m envFrom: - configMapRef: name: druidDruid Docker 入口点会读取这些环境变量并将其转换为 Druid 的 JVM/运行时配置因此修改config即可完成 JVM 堆、直接内存、处理缓冲等调优无需修改镜像。6.3 依赖组件自动注入的配置configmap.yaml 会根据依赖开关自动生成对应的元数据连接配置当zookeeper.enabled: true时自动设置druid_zk_service_host: release-zookeeper-headless:2181否则使用zkHosts自定义值当postgresql.enabled: true时自动覆盖元数据存储类型为postgresql并注入连接串jdbc:postgresql://release-postgresql:5432/druid、用户名与密码当mysql.enabled: true时自动覆盖为mysql类型并注入jdbc:mysql://release-mysql:3306/druid连接串七、完整的配置参数表以下参数表完整继承自 README.md并结合 values.yaml 补充了实际默认值供部署时直接参考。7.1 镜像与全局配置参数描述默认值image.repository容器镜像名称apache/druidimage.tag镜像标签0.19.0image.pullPolicy镜像拉取策略IfNotPresentimage.pullSecrets私有仓库镜像拉取 Secret[]configMap.enabled是否以 ConfigMap 方式注入 Druid 配置trueconfigVars所有组件共享的 Druid 配置变量见上文gCloudStorage.enabled是否挂载 Google Cloud 凭据 SecretfalsegCloudStorage.secretName挂载为 Google Cloud 凭据的 Secret 名称google-cloud-keyzkHosts自定义 ZooKeeper 地址zookeeper.enabledfalse时使用druid-zookeeper-headless:2181注释示例7.2 Broker默认启用参数描述默认值broker.enabled是否启用 brokertruebroker.name组件名称brokerbroker.replicaCount副本数Deployment1broker.port服务端口8082broker.serviceTypeService 类型ClusterIPbroker.resources资源请求与限制{}broker.podAnnotationsPod 注解{}broker.nodeSelector节点选择器{}broker.tolerations容忍度[]broker.config私有配置如JAVA_OPTSDRUID_XMX/XMS512m等broker.affinity亲和性策略{}broker.ingress.enabled是否启用 Ingressfalsebroker.ingress.hostsIngress 域名[ chart-example.local ]broker.ingress.pathIngress 路径/broker.ingress.annotationsIngress 注解{}broker.ingress.tlsIngress TLS 配置[]7.3 Coordinator默认启用参数描述默认值coordinator.enabled是否启用 coordinatortruecoordinator.name组件名称coordinatorcoordinator.replicaCount副本数Deployment1coordinator.port服务端口8081coordinator.serviceTypeService 类型ClusterIPcoordinator.resources资源请求与限制{}coordinator.podAnnotationsPod 注解{}coordinator.nodeSelector节点选择器{}coordinator.tolerations容忍度[]coordinator.config私有配置如JAVA_OPTSDRUID_XMX/XMS256mcoordinator.affinity亲和性策略{}coordinator.ingress.*Ingress 配置同 brokerfalse//等7.4 Overlord默认禁用参数描述默认值overlord.enabled是否启用独立 overlordfalseoverlord.name组件名称overlordoverlord.replicaCount副本数Deployment1overlord.port服务端口8081overlord.serviceTypeService 类型ClusterIPoverlord.resources资源请求与限制{}overlord.config私有配置如JAVA_OPTS另支持javaOpts: -Xms1G -Xmx1Goverlord.ingress.*Ingress 配置同 broker7.5 Historical默认启用StatefulSet参数描述默认值historical.enabled是否启用 historicaltruehistorical.name组件名称historicalhistorical.replicaCount副本数StatefulSet1historical.port服务端口8083historical.serviceTypeService 类型ClusterIPhistorical.resources资源请求与限制{}historical.podAnnotationsPod 注解{}historical.nodeSelector节点选择器{}historical.securityContext自定义安全上下文{ fsGroup: 1000 }historical.tolerations容忍度[]historical.config私有配置如JAVA_OPTSDRUID_XMX/XMS512m等historical.persistence.enabled是否启用持久化truehistorical.persistence.size持久卷大小4Gihistorical.persistence.storageClass持久卷存储类nil未指定则使用集群默认historical.persistence.accessMode访问模式ReadWriteOncehistorical.antiAffinity反亲和策略soft/hardsofthistorical.nodeAffinity节点亲和策略{}historical.ingress.*Ingress 配置同 brokerhistorical.podDisruptionBudgetPDBenabled/maxUnavailablefalse/1historical.updateStrategyStatefulSet 更新策略RollingUpdate7.6 Middle Manager默认启用StatefulSet参数描述默认值middleManager.enabled是否启用 middleManagertruemiddleManager.name组件名称middle-managermiddleManager.replicaCount副本数StatefulSet1middleManager.port服务端口8091middleManager.serviceTypeService 类型ClusterIPmiddleManager.resources资源请求与限制{}middleManager.podAnnotationsPod 注解{}middleManager.nodeSelector节点选择器{}middleManager.securityContext自定义安全上下文{ fsGroup: 1000 }middleManager.tolerations容忍度[]middleManager.config私有配置DRUID_XMX/XMS64m、druid_indexer_runner_javaOptsArray等middleManager.persistence.*持久化配置true/4Gi/ReadWriteOncemiddleManager.antiAffinity反亲和策略softmiddleManager.nodeAffinity节点亲和策略{}middleManager.autoscaling.enabled是否启用 HPA 水平扩缩容falsemiddleManager.autoscaling.minReplicasHPA 最小副本数2middleManager.autoscaling.maxReplicasHPA 最大副本数5middleManager.autoscaling.metricsHPA 指标CPU/内存利用率CPU、内存 60%middleManager.ingress.*Ingress 配置同 brokermiddleManager.podDisruptionBudgetPDBfalse/1middleManager.updateStrategyStatefulSet 更新策略RollingUpdate7.7 Router默认启用参数描述默认值router.enabled是否启用 routertruerouter.name组件名称routerrouter.replicaCount副本数Deployment1router.port服务端口8888router.serviceTypeService 类型ClusterIProuter.resources资源请求与限制{}router.podAnnotationsPod 注解{}router.nodeSelector节点选择器{}router.tolerations容忍度[]router.config私有配置DRUID_XMX/XMS128mrouter.affinity亲和性策略{}router.ingress.*Ingress 配置同 broker八、深入源码组件如何被实例化8.1 统一的环境变量注入模式所有组件的模板都遵循同一套模式容器启动参数args指定 Druid 服务类型私有配置走env全局配置走envFrom.configMapRef健康检查统一为/status/health探针。以 router/deployment.yaml 为例containers: - name: druid image: apache/druid:0.19.0 args: [ router ] env: - name: DRUID_XMX value: 128m envFrom: - configMapRef: name: druid livenessProbe: initialDelaySeconds: 60 httpGet: path: /status/health port: 8888探针延迟 60 秒启动是为了等待 Druid JVM 完成初始化避免误判。8.2 Middle Manager 的 HPA 自动扩缩容Middle Manager 是唯一支持水平自动扩缩容的组件摄取负载通常波动较大。HPA 模板见 middleManager/hpa.yaml默认定义了两个指标CPU 与内存平均利用率达 60% 时触发扩容副本范围 2~5autoscaling: enabled: false minReplicas: 2 maxReplicas: 5 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 60 - type: Resource resource: name: memory target: type: Utilization averageUtilization: 60启用时需确保集群部署了 metrics-server 或等效指标源。8.3 反亲和与滚动更新Historical 与 Middle Manager 的 StatefulSet 支持antiAffinity参数soft/hard实现逻辑见 historical/statefulset.yamlsoft默认preferredDuringSchedulingIgnoredDuringExecution调度器尽量将同组件 Pod 分散到不同节点但不强制hardrequiredDuringSchedulingIgnoredDuringExecution以kubernetes.io/hostname为拓扑键强制分散保证数据副本分布在不同的物理节点上避免单点故障同时二者均支持podDisruptionBudget默认关闭maxUnavailable: 1与RollingUpdate更新策略保障节点维护或升级期间服务的可用性。8.4 命名辅助函数_helpers.tpl 定义了druid.name、druid.fullname、druid.chart以及各组件专属的druid.component.fullname模板函数。所有名称都被截断至 63 字符满足 Kubernetes DNS 命名规范从而保证集群内服务发现如release-zookeeper-headless:2181可用。九、生产部署实践建议9.1 依赖选型默认部署会附带 ZooKeeperzookeeper.enabled: true和 PostgreSQLpostgresql.enabled: true两个子 Chart。对于生产环境通常建议元数据存储默认使用 PostgreSQLdruid_metadata_storage_type: postgresql。若已有外部元数据库可关闭postgresql.enabled并通过configVars或zkHosts手动指定连接地址ZooKeeperDruid 依赖 ZooKeeper 进行节点协调与任务分发若已有外部 ZooKeeper 集群设置zookeeper.enabled: false并配置zkHosts深度存储默认druid_storage_type: local配合 PVC大规模场景可改为 HDFS 或 S3 等分布式存储9.2 资源规划默认配置中的 JVM 参数偏向小规模验证Broker 512m、Coordinator 256m、Historical 512m、Middle Manager 64m、Router 128m。生产环境请结合数据量、查询并发和摄取吞吐量通过各组件的config与resources合理上调尤其注意 Historical 和 Middle Manager 的DRUID_MAXDIRECTMEMORYSIZE与处理缓冲参数需要匹配内存配额。9.3 Google Cloud Storage 集成若使用 GCS 作为深度存储可启用gCloudStorage: enabled: true secretName: google-cloud-key开启后Chart 会在 ConfigMap 中注入GOOGLE_APPLICATION_CREDENTIALS: /var/secrets/google/key.json创建 Secret模板见 secrets.yaml将google.gcsAPIKey中的凭据写入key.json在 StatefulSet 中以 Secret 卷方式挂载到/var/secrets/google见 historical/statefulset.yaml十、故障排查与运维提示查看健康状态所有组件均暴露/status/health端点可用于存活与就绪探针。kubectl get pods看到Ready状态即代表组件通过健康检查端口转发访问控制台Router 默认ClusterIP使用kubectl port-forward即可在本地访问 Druid Web 控制台配置热更新修改configVars后helm upgrade会更新 ConfigMap但环境变量注入只在容器启动时生效需要滚动重启 Pod 使配置生效归档说明本 Chart 及仓库已停止维护若在生产环境使用请关注 Apache Druid 官方镜像与 Kubernetes 生态的后续演进十一、总结通过本 Chart你可以用一条helm install命令在 Kubernetes 上完整拉起 Apache Druid 的六大核心组件并通过values.yaml精细控制每个组件的镜像、端口、副本数、JVM 参数、持久化、亲和性、自动扩缩容与 Ingress 暴露方式。其核心设计——全局 ConfigMap 组件私有环境变量——使得 Druid 的复杂配置体系得以在 Helm 的声明式框架下被清晰管理是学习 Druid 分布式架构与 Helm 编排的最佳参考实现之一。进一步阅读完整的默认配置注释见 values.yaml资源模板见 templates/ 目录。赞分享【免费下载链接】charts⚠️(OBSOLETE) Curated applications for Kubernetes项目地址https://gitcode.com/gh_mirrors/chart/charts点击查看免费下载相关推荐使用 Helm Chart 在 Kubernetes 上部署 Apache Answer完整配置指南与源码级解析使用 Helm Chart 在 Kubernetes 上部署 Apache Answer完整配置指南与源码级解析 Apache Answer 是一款面向团队的后端前端企业应用OneUptime Runner AI 修复实战把未解决异常变成一个可评审的 Pull RequestOneUptime Runner AI 修复实战把未解决异常变成一个可评审的 Pull Request 本文基于 OneUptime 仓库中文档 App/Fe在 Kubernetes 上部署 LogstashBitnami Helm Chart 完整配置与多管道实战指南在 Kubernetes 上部署 LogstashBitnami Helm Chart 完整配置与多管道实战指南 导读 Logstash 是 ELK 栈中的核云原生容器编排创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表