公众号关注 「奇妙的 Linux 世界」
设为「星标」,每天带你玩转 Linux !
Horizon 网易云音乐开源的一个云原生应用程序持续交付 (CD) 平台,平台团队可以让开发人员将他们的代码和中间件以最佳实践方式轻松、高效地部署到云和 Kubernetes。
Horizon 的灵感来自 ArgoCD 和 AWS Proton,全面践行 GitOps,通过 Horizon GitOps 机制,确保任意变更(代码、配置、环境)持久化、可回滚、可审计。现在 Horizon 已被大规模应用到了网易云音乐和网易传媒的实际生产环境中。
GitOps
在 Horizon 中,Git 被用作唯一的"The Source Of Truth"
,Horizon 将模板和所有的值存储在 Git 仓库中。每一个变化都是持久的、可逆的和可审计的,包括代码、环境变量、资源规格等。
模板
Horizon 模板是基于 Helm 和 jsonschema 的。平台团队可以在默认情况下进行基本的实践(包括安全、亲和性、优先级、资源等),并为用户提供一个简单而统一的界面,这个界面是由 jsonschema 文件定义的。jsonschema 用于在 Horizon 上提供一个用户友好的 HTML 表单,基于 react-jsonschema-form
。它具有高度的可扩展性和灵活性,可以在简单的模板系统的基础上做出你自己的最佳实践。
RBAC 和成员系统
Horizon 提供一个 RBAC 和成员系统,就像 Gitlab 一样。你可以轻松地定义你自己的平台成员和角色(就像 Kubernetes 角色和角色绑定)。在我们的实践中,我们提供了 PE、Owner、Maintainer、Guest 等角色。Owner 具有读取(列出 pod、读取所有属性等)/写入(部署、构建部署、重启、发布、删除等)的权限,Guest 只具有读取权限。
集成的便利性
Horizon 提供 OpenAPI、AccessToken、Oauth2.0、IDP Connector、Webhooks,它使整合内部系统变得容易。
易用性
我们还提供产品功能,如模板管理、Kubernetes 管理、监控管理、环境管理。平台团队可以通过网页界面轻松地进行设置。
Horizon-Core
Horizon Core Server 是一个 Rest Server,它暴露 Web UI、CLI 和其他系统使用的 OpenAPI。此外它还提供以下功能:
_ Kubernetes 和环境管理
_ 模板管理
_ PrivateToken、AccessToken 管理
_ 组、应用、集群管理
_ CI、CD 流水线管理
_ WekHook 管理
_ 用户和成员管理
_ IDP 管理
Gitlab 和 ArgoCD
Gitlab:Gitlab 存储应用程序的所有配置,应用程序的“唯一来源”。
ArgoCD:ArgoCD 是我们默认的 GitOps 引擎,可将应用程序工作负载从 git 仓库同步到 Kubernetes。
Tekton 和 S3
Tekton:用于我们默认 ci 引擎的云原生流水线,用于从源代码自动构建镜像。
S3:已完成的流水线会被存储到 S3,你可以使用任何 S3 兼容服务,如 Mino 或 Aws S3 服务等。
Grafana 和 Prometheus
为了方便,我们默认将监控功能集成到 Horizon 中,只要你配置好 Prometheus,Horizon 就会自动检索指标,在 Horizon-Web 上显示指标仪表面板。
MySQL 和 Redis
用于存储和缓存基本元信息,例如成员、用户、Token、webhook、IDP 等数据。
Argo CD 对于 Kubernetes 运维团队和熟悉 Kubernetes 的用户来说是一个很好的工具,实际上,Horizon 使用 Argo CD 作为默认的 GitOps 引擎。但是我们认为 Argo CD 对于广大的业务研发的全流程支撑并不是很友好。基于 Group、Member、RBAC 和 Template 等核心特性,Horizon 对于业务开发者更加友好。
产品功能 | Horizon | Argo CD |
---|---|---|
CI | 支持(待完善) | 不支持 |
CD | 支持 | 支持 |
GitOps | 支持 | 支持 |
Group | 支持 | 不支持 |
RBAC 与 Member | 支持 | 支持 |
Template | 支持 | 不支持 |
应用 | 支持自定义 | 支持自定义 |
Horizon 和 Openshift 都想要解决同一个问题,两者都给予了用户在 Kubernetes 上构建、部署和运行应用的能力。但是 Horizon 与 Openshift 存在根本性的差异,Openshift 更像是 Kubernetes 的发行版,但是 Horizon 的目标是成为基于 Kubernetes 的持续交付平台。
产品功能 | Horizon | OpenShift |
---|---|---|
CI | 支持(待完善) | 支持 |
CD | 支持 | 支持 |
GitOps | 支持 | 支持 |
Group | 支持 | 支持 |
RBAC 与 Member | 支持 | 支持 |
Template | 支持 | 不支持 |
应用 | 支持自定义 | 丰富,支持各种预置中间件 |
和 Horizon 一样,KubeVela 通过 OAM 掩盖了 Kubernetes 的复杂性。但是 Horizon 和 KubeVela 的定位不同,KubeVela 是一个部署工具,而 Horizon 则是一个功能完善的平台,支持登录、RBAC、Group 管理等功能。对于企业来说,这些功能都是不可或缺的。
产品功能 | Horizon | KubeVela |
---|---|---|
CI | 支持(待完善) | 不支持 |
CD | 支持 | 支持 |
GitOps | 支持 | 不支持 |
Group | 支持 | 支持 |
RBAC 与 Member | 支持 | 支持 |
Template | 支持 | 支持 |
应用 | 支持自定义 | 支持自定义 |
目前 Horizon 在 Kubernetes V1.19.3 版本上进行了全面测试,大于该版本的集群不保证能正常使用。下表列出了用于部署 Horizon 的最低和推荐硬件配置。
资源 | 最小 | 推荐 |
---|---|---|
CPU | 4 CPU | 8 CPU |
Mem | 12 GB | 16 GB |
Disk | 40 GB | 80 GB |
整体看来 Horizon 还是比较耗资源的。
要安装 Horizon 可以使用 Helm Chart 进行一键安装:
$ helm repo add horizon https://horizoncd.github.io/helm-charts
$ helm install horizon horizon/horizon -n horizoncd --version 2.0.3 --create-namespace
不过需要注意的是该 charts 模板中的 Ingress 对象还是使用的 extensions/v1beta1
版本,所以如果你使用的是 networking.k8s.io/v1
版本则需要手动去修改下模板。而且默认情况下会安装很多组件,包括:gitlab、tektoncd、harbor、argo cd、grafana、chartmuseum、mysql、minio 等,所以如果你集群中已经有相关组件,则需要去定制 values 文件了,所以建议用 Kind 创建一个全新的集群进行测试更好,各组件对应的版本如下所示:
组件 | 版本 |
---|---|
Gitlab | 13.11.7-ce.0 |
Argo-cd | v2.4.11 |
Tekton | dashboard: v0.11.1 pipeline: v0.18.1 triggers: v0.11.2 |
Chartmuseum | v0.15.0 |
Grafana | 8.4.6 |
Minio | 2022.10.29-debian-11-r0 |
Redis | 6.0.7-alpine |
Mysql | 8.0.31-debian-11-r0 |
使用默认 values 安装后,会包含很多 pod,如上所示:
$ kubectl get pod -n horizoncd
NAME READY STATUS RESTARTS AGE
el-horizon-listener-f5dcd8958-tx675 1/1 Running 0 26m
horizon-argocd-application-controller-0 1/1 Running 0 39m
horizon-argocd-repo-server-5c89969bbb-l8hcr 1/1 Running 0 40m
horizon-argocd-server-579fdbf68c-9p8wr 1/1 Running 0 40m
horizon-chartmuseum-5db87d9dc8-8j6b9 1/1 Running 4 40m
horizon-core-64df467d7-jtdl6 1/1 Running 0 24m
horizon-gitlab-75d5c47c96-zzjpl 1/1 Running 0 17h
horizon-grafana-78c956d9b6-6th7p 3/3 Running 0 17h
horizon-harbor-core-86944d7f76-q2lcb 1/1 Running 2 26m
horizon-harbor-database-0 1/1 Running 0 39m
horizon-harbor-jobservice-569559cfd8-c2plt 1/1 Running 2 26m
horizon-harbor-nginx-7f7cc9b669-64nxz 1/1 Running 0 26m
horizon-harbor-portal-555876fd5-q9mc5 1/1 Running 0 40m
horizon-harbor-registry-77977b5d58-64m6l 2/2 Running 0 26m
horizon-job-bfbc7cb4d-td64p 1/1 Running 0 37m
horizon-minio-74c84b8c4f-qsdj2 1/1 Running 0 39m
horizon-minio-provisioning-9tgz8 0/1 Completed 0 26m
horizon-mysql-0 1/1 Running 0 39m
horizon-redis-ha-server-0 2/2 Running 0 25m
horizon-swagger-676fbc8ff9-w8tq7 1/1 Running 0 40m
horizon-web-5784d89d46-g7bx7 1/1 Running 0 40m
tekton-dashboard-598fb5b5b7-xmfsz 1/1 Running 0 40m
tekton-pipelines-controller-688d99f585-kvb58 1/1 Running 0 40m
tekton-pipelines-webhook-86bd954957-6n7m2 1/1 Running 1 40m
tekton-triggers-controller-f45c96768-pg8sv 1/1 Running 0 40m
tekton-triggers-core-interceptors-857dcb75b6-lbprb 1/1 Running 0 40m
tekton-triggers-webhook-559b5b98cc-c7tmj 1/1 Running 0 40m
当所有 Pod 都正常后我们可以通过 ingress 去访问 horizon 的 web 服务:
然后就可以使用邮箱和密码进行登录了。
当第一次使用的时候需要先配置一些资源。比如先添加一个 Docker Registry 镜像仓库,默认安装了 Harbor,所以这里配置 Harbor 的相关信息即可。
然后要添加一个 Kubernetes 集群,如果你想在本地 K8s 上部署工作负载,Domain
字段的值配置成 https://kubernetes.default.svc
即可,然后将你的 kubeconfig 文件内容填入保存即可。
接下来还需要创建一个环境。
创建完成后进入你的环境页面,点击 Link kubernetes
链接你刚刚添加的 Kubernetes 集群。
接下来还需要一个模板来保存你应用程序的构建和部署配置,这里我们创建一个公共模板。
然后输入模板相关信息,请注意,Git repo 是模板的克隆链接,Horizon 通过它拉取它。我们可以使用示例应用 https://github.com/horizoncd/deployment.git
来部署第一个工作负载。
接下来需要创建并管理一个新的组,Group 需要绑定 Kubernetes,这是用标签来部署你的应用程序,所以需要将 Kubernetes 资源链接到你的新组。
然后在 Group 页面,点击 New application
按钮,开始创建一个新的应用程序。这里使用 git 仓库的样本 https://github.com/horizoncd/springboot-source-demo.git
,可以按照下面的方式使用它。
然后填写 Dockerfile 路径。
选择模板并填写部署配置信息。
应用创建完成后,在应用程序页面中,单击 New cluster
按钮开始创建新集群,选择要部署集群的环境和地域。
接下来就是部署我们的第一个工作负载的最后一步了,在集群页面,点击构建和部署按钮,选择你的 git reference,并检查与上次修订的差异,点击提交按钮,确认构建和部署。
检查流水线的日志和集群状态。
当集群状态处于 healthy
时,你部署的第一个工作负载就成功地部署在 Kubernetes 上了。
Github 仓库:https://github.com/horizoncd/horizon
本文转载自:「Github爱好者」,原文:https://tinyurl.com/2p8pvrj6,版权归原作者所有。欢迎投稿,投稿邮箱: [email protected]。
最近,我们建立了一个技术交流微信群。目前群里已加入了不少行业内的大神,有兴趣的同学可以加入和我们一起交流技术,在 「奇妙的 Linux 世界」 公众号直接回复 「加群」 邀请你入群。
你可能还喜欢
点击下方图片即可阅读
如何在 Kubernetes 部署 HBase 数据库
点击上方图片,『美团|饿了么』外卖红包天天免费领
更多有趣的互联网新鲜事,关注「奇妙的互联网」视频号全了解!