ARTICLE DETAIL

资讯详情

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

OpenHarness:统一编排软件交付流水线的CDaaS平台实践

OpenHarness:统一编排软件交付流水线的CDaaS平台实践 1. 项目概述与核心价值最近在跟几个做DevOps平台和自动化测试的朋友聊天大家普遍都在头疼一个问题随着微服务架构和云原生技术的普及团队内部的工具链越来越长从代码提交、构建、部署到测试、监控每个环节可能都有一套独立的系统。这些系统之间数据不通、流程割裂导致效率低下出了问题排查起来像在玩“猜谜游戏”。我们需要的不是一个功能更强的单一工具而是一个能把这些工具“串”起来让数据和流程自动流转的“连接器”或“编排层”。这让我想起了之前深度研究并实践过的OpenHarness。简单来说OpenHarness 不是一个你要替换掉 Jenkins 或 GitLab CI 的又一个 CI/CD 工具。它的定位更高一层是一个持续交付即服务CDaaS平台或者说是一个智能化的软件交付编排引擎。它的核心价值在于为你提供了一个统一的控制平面让你能够以声明式的方式定义、编排、执行和观测从代码到生产的整个软件交付流水线无论你底层用的是 Jenkins、Tekton、GitLab Runner 还是自研的脚本。想象一下你不再需要为每个项目手动配置 Jenkins Job、维护复杂的 Jenkinsfile或者在不同的 Git 仓库间复制粘贴类似的.gitlab-ci.yml。在 OpenHarness 的世界里你通过一个统一的 UI 或 YAML 文件定义好“构建什么”、“如何测试”、“部署到哪里”以及“满足什么条件才能推进到下一阶段”。OpenHarness 会帮你调度底层的执行器它称之为“Delegate”去完成具体工作并集中收集所有环节的日志、指标和状态给你一个端到端的、可视化的交付全景图。这对于追求研发效能、希望实现标准化和可观测性交付流程的中大型团队或平台工程团队来说具有极强的吸引力。2. OpenHarness 核心架构深度解析要理解 OpenHarness 如何工作必须深入其架构。它的设计非常清晰采用了控制平面与数据平面分离的云原生架构模式这使得它天生具备弹性、可扩展和高可用性。2.1 整体架构分层与组件OpenHarness 的架构可以划分为三个主要层次管理层Manager、执行层Delegate和连接层Connectors。管理层是大脑是核心控制平面。它通常以一组微服务的形式部署在 Kubernetes 集群中主要包含以下关键服务Harness Manager: 提供主要的 Web UI 和 API 网关是用户交互的入口。Pipeline Service: 流水线服务的核心负责解析流水线 YAML、管理执行状态和编排步骤。CI Manager: 专用于持续集成CI阶段的管理处理代码拉取、构建、测试等任务。CD Manager: 专用于持续部署CD阶段的管理处理基础设施配置、制品部署、验证等。Git Sync Service: 负责与 Git 仓库同步支持“GitOps”模式将流水线、连接器等配置也作为代码管理。Database: 使用 MongoDB 或 PostgreSQL 存储元数据、流水线配置、执行历史等。执行层是手脚是数据平面。它的核心是Harness Delegate。Delegate 是一个轻量级的代理程序你需要将它安装在你需要执行任务的环境中比如你的 Kubernetes 集群、你的构建服务器甚至某个公有云 VPC 内。它的职责是接收来自管理层的任务指令在本地环境中执行这些指令如运行一个 Docker 构建、执行一个 kubectl 命令并将执行结果和日志实时回传给管理层。Delegate 是无状态的可以水平扩展这是实现高并发和隔离性的关键。连接层是神经是Connectors。Connector 不是一个独立的服务而是一种配置实体用于定义 OpenHarness 如何与外部系统安全地连接和认证。例如你需要创建一个 Git Connector 来连接你的 GitHub 仓库一个 Docker Registry Connector 来连接你的镜像仓库一个 Kubernetes Cluster Connector 来连接你的目标 K8s 集群。Connector 中存储了连接所需的凭证如 Token、SSH KeyDelegate 在执行任务时会使用这些凭证来访问对应系统。注意Delegate 的部署位置至关重要。为了获得最佳性能和安全性通常建议将 Delegate 部署在离你的目标执行环境最近的地方。例如如果要部署到某个 K8s 集群 A就把 Delegate 装在集群 A 内部如果要构建的代码在某个私有 Git 仓库最好在有网络权限访问该仓库的机器上安装 Delegate。2.2 核心概念与抽象模型OpenHarness 通过一系列精心设计的概念抽象将复杂的软件交付过程模块化、标准化。项目Project这是资源隔离和权限控制的基本单元。一个项目通常对应一个业务线或一个大型产品里面包含该产品所需的所有流水线、服务、环境、连接器等。服务Service代表一个可部署的软件单元比如一个微服务。在 Service 定义中你会关联这个服务的源代码仓库Git Connector、构建它的方式如 Dockerfile 路径、以及它的部署配置清单如 K8s Manifests, Helm Chart。OpenHarness 支持多种部署类型包括 K8s、Helm、Serverless 等。环境Environment代表服务部署的目标位置如“开发”、“测试”、“预发”、“生产”。在环境中你需要定义基础设施定义Infrastructure Definition比如具体是哪个 K8s 集群、哪个命名空间或者哪个 AWS ECS 服务。流水线Pipeline这是编排的核心。一个 Pipeline 由多个阶段Stage组成每个 Stage 又由多个步骤Step组成。步骤是原子操作如“构建制品”、“运行 API 测试”、“部署到 K8s”、“人工审批”。OpenHarness 提供了丰富的内置步骤库也支持自定义 Shell 脚本步骤。触发器Trigger用于自动启动流水线。可以基于 Git 事件如 Push to main、Webhook、定时任务或上游流水线的完成来触发。机密Secret用于安全地存储和管理敏感信息如密码、API 密钥、证书。OpenHarness 支持本地加密、集成 HashiCorp Vault、AWS Secrets Manager 等。这套抽象模型的美妙之处在于它强制你以结构化的方式思考交付流程。一旦定义好 Service 和 Environment构建部署流水线就变成了在 Pipeline 画布上“搭积木”清晰且可复用。2.3 一次流水线执行的完整流程让我们跟踪一次代码提交触发的完整 CI/CD 流水线看看各组件如何协同工作触发开发者推送代码到 Git 仓库的特定分支如 main。事件捕获配置在该仓库上的 Git Webhook 将 push 事件发送给 OpenHarness 管理层的 Webhook 服务。流水线解析Pipeline Service 接收到触发请求根据触发器配置找到对应的流水线并开始解析流水线 YAML 定义。任务调度管理层分析流水线第一个阶段假设是 CI 阶段所需的步骤如“克隆代码”、“运行单元测试”、“构建 Docker 镜像”。它会根据这些步骤所需的 Connector 类型如 Git Connector, Docker Connector和标签选择一个拥有相应能力且空闲的 Delegate。任务执行被选中的 Delegate 从管理层领取任务。它使用 Git Connector 中的凭证克隆代码在本地或它所在的 Pod 中启动一个临时的“构建容器”来运行测试和构建命令最后使用 Docker Connector 的凭证将构建好的镜像推送到镜像仓库。整个过程中的日志被实时流式传输回管理层。状态推进与编排CI 阶段成功后Pipeline Service 更新流水线状态并推进到下一个 CD 阶段如“部署到测试环境”。同样它会选择一个能访问目标 K8s 集群的 Delegate。部署执行该 Delegate 使用 K8s Connector 的凭证执行部署动作如kubectl apply或helm upgrade。OpenHarness 的 CD 模块还提供了高级部署策略如蓝绿、金丝雀、滚动更新和验证步骤如集成测试、性能测试。观测与反馈所有步骤的日志、执行时间、产出物信息都被集中存储在管理层并通过统一的 UI 展示。你可以清晰地看到这次交付是否成功在哪一步失败以及相关的日志详情。这个流程体现了 OpenHarness 的核心管理层负责“指挥”Delegate 负责“干活”Connector 负责“通行证”三者各司其职通过清晰的接口解耦。3. 关键特性与竞争优势剖析OpenHarness 能在众多 CI/CD 工具中脱颖而出靠的不是简单的功能堆砌而是几个深入设计的关键特性。3.1 内置的持续验证与可靠性保障这是 OpenHarness 区别于传统工具的最大亮点之一。传统的部署“成功”往往只意味着kubectl apply命令没有报错。但 Pod 启动后是否健康接口响应是否正常性能有没有下降OpenHarness 将部署后验证Post-Deployment Verification作为一等公民支持。你可以在部署步骤后直接添加验证步骤它允许你配置健康度检查通过 K8s 的 Readiness Probe 或自定义命令。持续验证在部署后的一段时间内如24小时持续从 APM如 New Relic, Datadog、日志如 Elasticsearch和监控如 Prometheus工具中获取指标与部署前的基线进行对比自动判断新版本是否引入了回归。自动化回滚一旦验证失败可以自动或手动触发回滚流程将服务回退到上一个稳定版本。这个特性将部署从一种“ hopeful ”操作变成了一个“闭环验证”的过程极大地提升了线上部署的可靠性。3.2 智能特性基于机器学习的优化OpenHarness 融入了不少“智能”特性来提升体验智能日志分析当构建或部署失败时它能自动分析日志高亮显示可能的错误原因和行数甚至给出修复建议节省了开发者大海捞针看日志的时间。测试智能在 CI 阶段它可以分析代码变更和历史的测试结果智能地选择最可能受影响的测试用例来运行而不是全量运行从而大幅缩短 CI 反馈时间。部署风险预测基于历史的部署成功率和验证指标为即将进行的部署提供一个风险评分帮助决策者判断是否应该推进。3.3 开发者体验与 GitOps 原生支持Pipeline as Code虽然提供了强大的可视化编辑器但底层完全支持 YAML 定义。所有流水线、服务、环境的配置都可以用 YAML 描述并存储在你的 Git 仓库中。通过 Git Sync 功能管理层会自动同步 Git 中的配置变更实现了真正的 GitOps。丰富的集成生态官方提供了与上百种云服务、开发工具、监控系统的开箱即用连接器从 Jira、ServiceNow 到 PagerDuty、Slack几乎覆盖了研发生态链的所有环节。开发者自助服务平台团队可以预先定义好标准的“服务模板”和“环境模板”开发者只需要填写少数几个参数如服务名、Git仓库地址就能一键生成符合规范的 CI/CD 流水线降低了使用门槛和平台团队的维护负担。4. 实战部署与核心配置指南理解了架构我们来谈谈怎么把它用起来。部署 OpenHarness 有两种主要方式SaaS 版和自托管版On-Prem。对于大多数想要快速上手的团队我强烈建议从 SaaS 版开始。这里我们重点讨论更可控的自托管部署。4.1 自托管部署方案选型与准备OpenHarness 官方推荐使用 Kubernetes 来部署其管理层。你需要准备一个满足以下条件的 K8s 集群可以是 Minikube、Kind 用于测试生产环境建议用托管的 K8s 服务如 EKS、GKE、AKS版本Kubernetes 1.19 及以上。资源至少 4核 CPU8GB 内存50GB 存储。生产环境需要根据用户量和流水线并发度大幅增加。存储类需要配置一个默认的 StorageClass支持动态卷供应如 AWS EBS, Azure Disk。负载均衡器需要为 Harness Manager 服务提供一个外部可访问的 LoadBalancer云厂商提供或通过 Ingress Controller 暴露。数据库需要准备外部的 MongoDB4.4或 PostgreSQL12实例。生产环境绝对不要使用其内置的嵌入式 MongoDB。部署的核心是使用 Helm Chart。首先添加 Harness 的 Helm 仓库并更新helm repo add harness https://helm.harness.io helm repo update然后你需要下载values.yaml并进行关键配置helm show values harness/harness harness-values.yaml编辑harness-values.yaml以下配置项必须修改global: database: mongo: # 关闭内置Mongo使用外部实例 installEnabled: false # 你的外部MongoDB连接字符串 extraArgs: mongodb://username:passwordyour-mongo-host:27017/harness?authSourceadmin # 如果使用PostgreSQL作为主要存储推荐用于生产 postgres: installEnabled: false host: your-postgres-host port: 5432 user: harness password: your-strong-password databaseName: harness loadBalancer: # 你的负载均衡器IP或主机名用于Delegate与管理层通信 host: your-harness-manager.example.com # 配置Harness Manager的副本数和资源 harness-manager: replicaCount: 2 resources: requests: memory: 2Gi cpu: 1000m配置完成后使用 Helm 进行安装helm install harness harness/harness -f harness-values.yaml -n harness --create-namespace这个过程会部署几十个 Pod请耐心等待所有 Pod 进入Running状态。4.2 Delegate 安装与集群连接实操管理层启动后第一件事就是安装 Delegate。这是连接你的基础设施的关键。登录与创建代理通过 LoadBalancer 的 IP 或域名访问 OpenHarness UI完成初始账户设置。进入项目后在“项目设置” - “Delegate”页面点击“安装 Delegate”。选择安装方式推荐使用“Kubernetes YAML”方式。OpenHarness 会生成一个包含 Token 和 Manager URL 的定制化 YAML 文件。应用 YAML将生成的 YAML 文件保存为harness-delegate.yaml在你目标执行环境的 Kubernetes 集群中执行kubectl apply -f harness-delegate.yaml -n harness-delegate验证稍等片刻在 OpenHarness UI 的 Delegate 列表页面应该能看到一个新的 Delegate状态为“已连接”且为“已启用”。你可以为这个 Delegate 打上标签例如k8s-prod以便在流水线中通过标签选择它。实操心得Delegate 默认的资源请求可能偏小。如果流水线任务复杂如需要编译大型项目建议修改生成的 YAML 文件增加resources.requests和limits避免因资源不足导致任务失败。同时考虑为不同的环境开发、测试、生产安装独立的 Delegate并打上不同的标签实现环境隔离。4.3 核心 Connector 配置详解Connector 是安全桥梁配置时需格外小心。1. Git Connector (以 GitHub 为例):认证方式生产环境推荐使用Personal Access Token (经典)或GitHub App。SSH Key 方式也可以但管理相对麻烦。权限Token 需要至少repo访问私有仓库和admin:repo_hook设置 Webhook权限。配置步骤在 Connector 创建页面选择 Git填入 GitHub 账户的 Token。测试连接成功后这个 Connector 就可以被用于任何需要拉取该 GitHub 账户下代码的步骤。2. Docker Registry Connector (以 Docker Hub 为例):认证方式选择“用户名/密码”。细节在“Docker Registry URL”中填写https://index.docker.io/v1/对于 Docker Hub。如果你使用的是私有仓库如 Harbor, ECR填写对应的仓库地址。用途构建步骤需要它来拉取基础镜像推送步骤需要它来上传构建好的镜像。3. Kubernetes Cluster Connector:认证方式最常用且安全的是继承已部署 Delegate 的权限。这意味着你安装 Delegate 时所用的 ServiceAccount 需要拥有目标命名空间的操作权限。这种方式无需在 Connector 中存储任何 Kubeconfig 或证书。替代方式也可以使用“主 Kubeconfig 文件”将你的~/.kube/config内容粘贴进去。但这种方式将密钥存储在 OpenHarness 数据库安全性稍低。关键点确保 Delegate 所在的命名空间如harness-delegate的 ServiceAccount通过 Role 和 RoleBinding 获得了目标部署命名空间如default,production的足够权限如admin或edit角色。5. 构建第一条端到端流水线从代码到部署理论说再多不如动手做一遍。我们来创建一条最简单的流水线当 main 分支有代码推送时自动构建一个 Docker 镜像并部署到 Kubernetes 测试环境。5.1 创建服务与定义制品首先在 OpenHarness 中创建一个“服务”。服务名称my-sample-app。部署类型选择“Kubernetes”。服务定义在“服务配置”中选择“从 Git 仓库引用”。这里需要你提前准备好 Kubernetes 的部署清单文件如deployment.yaml,service.yaml并放在一个 Git 仓库里。在配置中你需要指定 Git Connector、仓库地址、分支以及清单文件所在的路径如/k8s/。制品源在“制品”部分添加一个“Docker 镜像”制品源。给它起个名字比如docker-image。这里只需要定义类型具体的镜像标签如myapp:1.0.0会在流水线运行时由前面的 CI 构建步骤动态传入。这个配置的含义是这个服务使用 Kubernetes 方式部署其部署清单来自 Git 仓库 A而部署所用的容器镜像则由流水线构建产生。5.2 配置目标环境与基础设施接下来创建一个“环境”比如叫dev。环境类型选择“生产前”Pre-Production。基础设施定义在环境中创建一个“Kubernetes 直接使用”类型的基础设施。连接器选择你之前创建的、能访问目标测试集群的 Kubernetes Cluster Connector。命名空间填写目标集群中的命名空间例如dev。释放名称填写一个 Helm 风格的发布名称如my-sample-app。这将成为 K8s 中所有相关资源的前缀标签。5.3 编排 CI/CD 流水线现在进入重头戏创建流水线。添加 CI 阶段创建一个新阶段类型选择“构建”。克隆代码步骤添加一个“克隆代码”步骤选择你的 Git Connector 和代码仓库这里是存放应用源代码的仓库与存放 K8s 清单的仓库可以是同一个也可以是不同的。运行步骤添加一个“运行”步骤。这里我们使用一个简单的 Shell 脚本来模拟构建。在“命令”框中输入# 假设这是一个简单的Node.js应用 echo 开始构建... # 你可以在这里运行 npm install, npm test 等 # 构建Docker镜像 docker build -t ${DOCKER_REGISTRY}/myapp:${BUILD_NUMBER} . # 推送镜像 docker push ${DOCKER_REGISTRY}/myapp:${BUILD_NUMBER}推送镜像步骤实际上OpenHarness 提供了更优雅的“构建并推送 Docker 镜像”步骤。你可以直接使用这个步骤配置 Docker Connector、Dockerfile 路径和镜像标签如myapp:pipeline.sequenceId这是一个内置变量代表流水线执行序号。产出物在 CI 阶段的“产出物”部分添加一个 Docker 镜像产出物并关联到之前服务定义中的docker-image制品源。这样就把构建出来的镜像信息传递给了后续的 CD 阶段。添加 CD 阶段在流水线画布上连接 CI 阶段后添加一个新阶段类型选择“部署”。选择部署环境在阶段设置中选择之前创建的dev环境。执行部署OpenHarness 会自动为你生成一个“部署”步骤。因为我们在服务定义中已经关联了 K8s 清单的 Git 仓库所以这一步会自动从该仓库获取清单文件。关键配置在部署步骤的“制品”部分你需要将“主制品”指定为 CI 阶段产出的那个 Docker 镜像。OpenHarness 会智能地用这个动态的镜像标签如myapp:12替换掉你 K8s 部署清单中spec.template.spec.containers[0].image字段的占位符通常你在清单中会写myapp:artifact.image.tag。配置触发器在流水线设置中添加一个“Git 触发器”。选择你的 Git Connector 和仓库配置触发分支如main事件类型为“推送”。这样每次有代码推送到 main 分支这条流水线就会自动启动。保存并运行这条流水线。你会看到一个可视化的执行视图清晰地展示每个步骤的状态、日志和耗时。CD 阶段部署成功后你可以通过 OpenHarness 直接看到 K8s 中部署的资源状态。6. 高级特性应用与避坑指南掌握了基础可以探索一些高级特性来应对复杂场景。6.1 复杂部署策略金丝雀发布实战蓝绿部署和金丝雀发布是 OpenHarness 的强项。假设我们要为一个服务配置金丝雀发布在服务配置中启用编辑服务的“部署策略”从“基本”改为“金丝雀”。在流水线中配置在 CD 阶段的“执行”标签下你会看到部署步骤被替换为一系列子步骤“部署”、“验证”、“推广或回滚”。配置金丝雀步骤部署这里定义金丝雀的流量百分比和实例数量。例如你可以设置第一步先部署 10% 的实例并让这 10% 的实例接收 10% 的生产流量。验证这是金丝雀发布的核心。你可以添加一个“持续验证”步骤连接你的 APM如 New Relic监控金丝雀版本的错误率、延迟等关键指标并与基线版本对比设置一个失败阈值如错误率上升超过 1%。推广如果验证通过进入“推广”步骤将新版本逐步推广到 100% 的实例和流量。回滚如果验证失败可以手动或自动触发“回滚”步骤将流量切回旧版本。注意事项金丝雀发布严重依赖 metrics 的准确性和实时性。务必确保你的监控系统Prometheus, Datadog等与 OpenHarness 的 Connector 配置正确并且指标查询语句能准确反映服务的健康状态。在正式用于生产前必须在预发环境进行完整的演练。6.2 变量与表达式的灵活运用OpenHarness 的表达式引擎非常强大是实现动态流水线的关键。表达式用...包裹。运行时输入在流水线设置中定义“运行时输入”比如environment。在触发流水线时用户可以手动选择是部署到dev还是stage。在环境选择处就可以用input.environment来引用。引用之前步骤的输出CI 步骤构建了一个镜像它的完整标签可能是一个变量pipeline.stages.ci.spec.execution.steps.build.output.IMAGE你可以在 CD 阶段直接引用这个变量。内置变量pipeline.sequenceId执行ID、trigger.payload.repository.name触发事件的Git仓库名等都是常用的内置变量。灵活使用变量可以让同一条流水线模板适应不同的微服务或不同的环境。6.3 常见问题排查与调试技巧在实际使用中你肯定会遇到各种问题。以下是一些高频问题及排查思路问题现象可能原因排查步骤Delegate 显示“未连接”1. Delegate Pod 启动失败。2. 网络不通无法访问 Manager URL。3. Delegate Token 错误或已失效。1.kubectl get pods -n harness-delegate查看 Pod 状态和日志。2. 在 Delegate Pod 内执行curl -v MANAGER_URL/api/version测试网络连通性。3. 检查安装 YAML 中的accountId和delegateToken是否正确。流水线卡在“排队中”1. 没有可用的、具备所需标签的 Delegate。2. 所有匹配的 Delegate 都处于忙碌状态。1. 检查流水线步骤或 Connector 所需的“标签”是否与任何已启用的 Delegate 匹配。2. 在 Delegate 列表查看 Delegate 的“正在执行任务数”考虑增加 Delegate 副本数。Docker 构建步骤失败报认证错误1. Docker Registry Connector 配置错误。2. Delegate 所在环境没有 docker 守护进程或权限不足。1. 测试 Docker Connector 的连接性。2. 对于 K8s Delegate确保使用的是“DinD”Docker in Docker或“Kaniko”等无需宿主机 Docker 的构建方式。检查 Delegate 的 ServiceAccount 是否有拉取基础镜像的权限。K8s 部署步骤失败报“连接被拒绝”1. Kubernetes Cluster Connector 配置错误权限不足。2. 目标集群网络策略阻止了 Delegate 的访问。1. 测试 K8s Connector 的连接性。2. 检查 Delegate 的 ServiceAccount 是否在目标命名空间有足够的 RBAC 权限。可以手动在 Delegate Pod 里执行kubectl get pods测试。Git 触发器不生效1. Webhook 未成功创建或配置错误。2. Git 仓库的 Webhook 配置被防火墙拦截。1. 在 OpenHarness 触发器配置页面检查 Webhook URL 是否正确。2. 去 Git 仓库如 GitHub的 Webhook 设置页面查看最近的交付记录是否有错误信息。确保 OpenHarness Manager 的地址能从公网访问。调试黄金法则看日志OpenHarness 最大的优点就是日志集中。无论是管理层服务日志、Delegate 执行日志还是步骤控制台输出都集中在 UI 上。遇到问题第一步就是点开失败步骤的“控制台输出”从错误信息的最后几行往前看通常能快速定位问题根源。最后关于学习路径我的建议是先从 SaaS 版免费账户开始跟着官方教程走一遍核心流程建立直观感受。然后在测试环境尝试自托管部署从小型单服务流水线开始逐步引入变量、触发器、多环境等复杂概念。在将其推广到生产环境前务必做好性能测试、高可用规划和备份策略。OpenHarness 的架构决定了它能力强大但相应的理解和驾驭它也需要投入时间。一旦团队熟悉了它的工作模式它所带来的交付效率、标准化和可靠性的提升将是巨大的。
返回列表