1. 项目背景与核心挑战
在传统企业IT架构向云原生转型的过程中,Kubernetes(k8s)已成为事实上的容器编排标准。然而在实际生产环境中,由于安全合规要求,大量企业需要在内网隔离环境下部署云原生应用套件。本次要解决的正是这样一个典型场景:在完全离线的k8s集群中部署DolphinScheduler工作流调度系统和SeaTunnel数据集成工具。
这个组合方案特别适合需要处理以下需求的企业:
- 存在严格网络安全隔离要求的金融、政务等行业
- 需要自动化调度异构数据源ETL流程的场景
- 希望利用声明式配置管理整个数据流水线的团队
关键难点提示:离线环境意味着所有依赖镜像、charts包、系统组件都需要预先下载并完成内部仓库的搭建,任何遗漏都可能导致部署过程中断。
2. 离线环境准备工作
2.1 基础设施规划建议
建议采用以下节点规格作为基准(可根据实际负载调整):
| 节点类型 | CPU | 内存 | 磁盘 | 数量 |
|---|---|---|---|---|
| Master | 4核 | 16G | 100G | 3 |
| Worker | 8核 | 32G | 200G | 至少2 |
网络方面需要确保:
- 所有节点间网络延迟<2ms
- 节点间带宽≥1Gbps
- 提前规划好Pod CIDR和Service CIDR
2.2 离线资源打包清单
需要预先准备的离线资源包括:
基础组件包:
- k8s各节点所需系统依赖(conntrack、socat等)
- 容器运行时(推荐containerd 1.6+)
- Helm 3.10+二进制文件
镜像仓库方案:
# 搭建Harbor私有仓库示例 helm repo add harbor https://helm.goharbor.io helm fetch harbor/harbor --version 1.10.0应用镜像清单:
- DolphinScheduler 3.2.1全套镜像(含web、api、worker等)
- SeaTunnel 2.3.2引擎镜像
- 相关中间件镜像(ZooKeeper、MySQL等)
Helm charts包:
helm repo add dolphinscheduler https://dolphinscheduler.apache.org helm pull dolphinscheduler/dolphinscheduler --version 3.2.1
3. 核心组件部署实战
3.1 DolphinScheduler部署要点
3.1.1 数据库初始化
建议使用独立的MySQL实例(非k8s内部署):
CREATE DATABASE dolphinscheduler DEFAULT CHARACTER SET utf8mb4; CREATE USER 'ds_user'@'%' IDENTIFIED BY 'StrongPass@123'; GRANT ALL PRIVILEGES ON dolphinscheduler.* TO 'ds_user'@'%';3.1.2 Helm定制化配置
关键values.yaml配置项:
postgresql: enabled: false # 禁用内置PG externalDatabase: type: "mysql" host: "mysql.internal" port: "3306" username: "ds_user" password: "StrongPass@123" registry: type: "harbor" url: "harbor.internal" repository: "library/dolphinscheduler"部署命令:
helm install dolphinscheduler ./dolphinscheduler-3.2.1.tgz \ -n ds --create-namespace \ -f values.yaml3.2 SeaTunnel集成方案
3.2.1 引擎部署模式选择
推荐使用Spark on k8s模式:
spark: master: "k8s://https://kubernetes.default.svc" deployMode: "cluster" image: "harbor.internal/library/seatunnel-spark:2.3.2"3.2.2 任务配置示例
典型JDBC源到HDFS的作业配置:
env { execution.parallelism = 3 } source { JdbcSource { url = "jdbc:mysql://mysql.internal:3306/source_db" username = "etl_user" password = "EtlPass@456" query = "SELECT * FROM orders WHERE update_time > '${last_update}'" } } transform { Sql { query = "SELECT user_id, SUM(amount) AS total FROM orders GROUP BY user_id" } } sink { Hdfs { path = "hdfs://namenode:8020/data/orders_agg" file_format = "parquet" } }4. 生产环境调优指南
4.1 性能关键参数
DolphinScheduler工作节点配置建议:
worker: resources: limits: cpu: "2" memory: "4Gi" requests: cpu: "1" memory: "2Gi" env: - name: TASK_EXECUTE_THREADS value: "10" # 根据CPU核数调整4.2 高可用保障措施
- 为关键组件配置Pod反亲和性:
affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app.kubernetes.io/component operator: In values: ["master-server"] topologyKey: "kubernetes.io/hostname"- 配置合理的健康检查:
livenessProbe: httpGet: path: /actuator/health port: 12345 initialDelaySeconds: 30 periodSeconds: 105. 典型问题排查手册
5.1 镜像拉取失败
现象:Pod状态为ImagePullBackOff 解决方案:
- 确认harbor证书已添加到各个节点
mkdir -p /etc/docker/certs.d/harbor.internal cp harbor-ca.crt /etc/docker/certs.d/harbor.internal/ca.crt - 检查secret配置是否正确
kubectl create secret docker-registry harbor-secret \ --docker-server=harbor.internal \ --docker-username=admin \ --docker-password=Harbor12345 \ -n ds
5.2 权限相关问题
现象:SeaTunnel任务报Permission denied 处理方法:
- 为Spark Driver配置合适的安全上下文
securityContext: runAsUser: 1000 fsGroup: 1000 - 在HDFS端配置ACL:
hdfs dfs -setfacl -R -m user:spark:rwx /data
6. 监控与运维建议
6.1 指标采集方案
推荐使用Prometheus Operator采集指标:
- DolphinScheduler暴露的指标端点:
metrics: enabled: true port: 12345 - 对应的ServiceMonitor配置:
apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: labels: release: prometheus name: dolphinscheduler-monitor spec: endpoints: - port: metrics selector: matchLabels: app.kubernetes.io/instance: dolphinscheduler
6.2 日志收集策略
建议采用Filebeat + ELK方案:
filebeatConfig: filebeat.yml: | filebeat.inputs: - type: container paths: - /var/log/containers/*.log output.elasticsearch: hosts: ["elasticsearch.internal:9200"]