当前位置: 代码迷 >> 综合 >> Go 开源说第十一期:KubeSphere-面向云原生应用的容器混合云
  详细解决方案

Go 开源说第十一期:KubeSphere-面向云原生应用的容器混合云

热度:81   发布时间:2023-12-06 01:16:00.0

点击蓝字

关注我们

本文由“GO开源说”第十一期 《KubeSphere—面向云原生应用的容器混合云》直播内容修改整理而成,视频内容较长,本文内容有所删减和重构。

KubeSphere 是在 Kubernetes 之上构建的面向云原生应用的容器混合云管理系统。支持多云与多集群管理,提供全栈的自动化运维能力,帮助企业用户简化 DevOps 工作流,提供了运维友好的向导式操作界面,帮助企业快速构建一个强大和功能丰富的容器云平台。

KubeSphere 为用户提供构建企业级 Kubernetes 环境所需的多项功能,例如多云与多集群管理、Kubernetes 资源管理、DevOps、应用生命周期管理、微服务治理(服务网格)、日志查询与收集、服务与网络、多租户管理、监控告警、事件与审计查询、存储管理、访问权限控制、GPU 支持、网络策略、镜像仓库管理以及安全管理等。

KubeSphere 对不同云生态系统的支持非常友好,因为它对原生 Kubernetes 本身没有任何的侵入。换句话说,KubeSphere 可以部署并运行在任何基础架构以及所有版本兼容的 Kubernetes 集群之上,包括虚拟机、物理机、数据中心、公有云和混合云等。

丰富的生态工具

KubeSphere 围绕 K8s 生态发展,旨在降低K8s 和云原生生态工具的学习成本和复杂性,解决 Kubernetes 易用性的痛点。

img

产品矩阵

伴随着 KubeSphere 的发展,为满足不同用户的使用需求,衍生出了一系列的优秀的开源工具

img

KubeKey

KubeKey 是由 KubeSphere 衍生的 K8s 集群安装工具。它提供了一个即插即用的架构,可以无缝集成第三方组件。KubeKey 旨在将群集安装为一个对象,即 CaaO (Cluster as an Object)。

相较于传统的集群安装工具 KubeKey 有以下的优点:

  1. 基于 Ansible 的安装程序具有大量软件依赖性,例如Python。KubeKey 使用Go语言开发,可以消除在各种环境中的依赖问题,从而提高安装成功率。

  2. KubeKey 使用 Kubeadm 在节点上尽可能多地并行安装K8s集群,以降低安装复杂性并提高效率。与较旧的安装程序相比,它将大大节省安装时间。

  3. KubeKey 支持各种类型的集群安装与拓展:allinone、多节点、高可用集群。

KubeKey 的核心功能:

  1. 支持多版本 K8s 集群部署

  2. 支持在 ARM 架构的 K8s 集群部署

  3. 支持多种容器运行时: Docker、Containerd、iSula、CRI-O

  4. 支持多种网络插件: Calico、Flannel、Kube-OVN、Cilium

  5. 集群证书检查和更新

  6. ETCD 数据备份

KubeEye

KubeEye 是一个 K8s 集群巡检工具,可以帮助你快速定位 K8s 集群中出现的异常。

KubeEye 的核心功能:

  1. 检测 K8s 控制平面的异常

  2. 帮助您检测各种节点问题,包括内存、CPU、磁盘压力,意外的内核错误日志等

  3. 根据行业最佳实践验证集群中资源的YAML规范

PorterLB

PorterLB 是一个裸金属环境负载均衡器实现。

PorterLB 的核心功能:

  1. 基于 BGP 路由动态配置

  2. 基于路由器 ECMP 的负载均衡

  3. VIP 管理

KubeSphere 的核心功能及架构

img

KubeSphere 的核心架构如图所示

核心组件主要有三个:

  1. ks-console 独立的前端服务

  2. ks-apiserver 负责认证鉴权,基本的逻辑处理和请求转发

  3. ks-controller-manager 负责核心资源的状态维护

KubeSphere 的设计中沿用了 K8s 声明式 API 的风格,所有可操作的资源都尽可能的抽象成为 CustomResource。与命令式 API 相比,声明性API的使用更加简洁,并且提供了更好的抽象性, 告诉程序最终的期望状态(做什么),而不关心怎么做。

借助 kube-apiserver、etcd 进行数据同步和数据持久化,通过 ks-controller-manager 维护这些资源的状态,以达到最终状态的一致性。

例如 KubeSphere 中的流水线、用户凭证、用户实体、告警通知的配置,都可以通过 CRD 进行定义,借助 K8s 成熟的架构与工具链,可以方便的与 K8s 进行结合,降低各组件之间的耦合,降低系统的复杂度。

ks-apiserver 的核心架构

ks-apiserver 是 KubeSphere 核心的后端组件,负责前后端数据的交互、请求的代理分发、认证与鉴权。下图是 ks-apiserver 的核心架构:

img

与 K8s 相同 ks-apiserver 使用了 go-restful 框架提供 WebService,请求链路中增加多个 Filter 用于动态的拦截请求和响应,实现认证、鉴权、审计逻辑转发和反向代理功能,KubeSphere 的 API 风格也尽可能的跟随 K8s 的模式,方便与 RBAC 的集成。

另外一个比较重要的部分就是插件化的架构,借助 CRD + controller 进行解耦,可以极大的简化与第三方工具、软件的集成方式。

K8s 社区也为我们提供了丰富的工具链,借助 controller-runtime 和 kubebuiler 可以很方便的开发自己的 controller。

多集群核心架构

如今,各种组织跨不同的云厂商或者在不同的基础设施上运行和管理多个 Kubernetes 集群的做法非常普遍。由于每个 Kubernetes 集群都是一个相对独立的单元,上游社区正在艰难地研究和开发多集群管理解决方案。即便如此,Kubernetes 集群联邦(Kubernetes Cluster Federation,简称 KubeFed)可能是其中一种可行的方法。

多集群管理最常见的使用场景包括服务流量负载均衡、隔离开发和生产环境、解耦数据处理和数据存储、跨云备份和灾难恢复、灵活分配计算资源、跨区域服务的低延迟访问以及避免厂商锁定等。

img

KubeSphere 多集群的整体架构图如图所示,多集群控制平面所在的集群称之为 Host 集群,其管理的集群称为 Member 集群,本质上是一个安装了 KubeSphere 的 Kubernetes 集群,Host 集群需要能够访问 Member 集群的 kube-apiserver,Member 集群之间的网络连通性没有要求。管理集群 Host Cluster 独立于其所管理的成员集群,Member Cluster 并不知道 Host Cluster 存在,这样做的好处是当控制平面发生故障时不会影响到成员集群,已经部署的负载仍然可以正常运行,不会受到影响。

Host 集群同时承担着 API 入口的作用,由 Host Cluster 将对 Member 集群的资源请求转发到 Member 集群,这样做的目的是方便聚合,而且也利于做统一的权限认证。

KubeSphere 多集群中只要求 Host 集群能够访问 Member 集群的 Kubernetes APIServer,对于集群层面的网络连通性没有要求。KubeSphere中对于 Host 和 Member 集群的连接提供了两种方式:

img

直接连接:如果 Member 集群的 kube-apiserver 地址可以在 Host 集群上的任一节点都能连通,那么即可以使用这种直接连接的方式,Member 集群只需提供集群的 kubeconfig 即可。这种方式适用于大多数的公有云 Kubernetes 服务,或者 Host 集群和 Member 集群在同一网络的情形。

img

代理连接:如果 Member 集群在私有网络中,无法暴露 kube-apiserver 地址, KubeSphere 提供了一种代理的方式,即 Tower。具体来说 Host 集群上会运行一个代理服务,当有新集群需要加入时,Host 集群会生成加入所有的凭证信息,Member 集群上运行 Agent 会去连接 Host 集群的代理服务,连接成功后建立一个反向代理隧道。由于 Member 集群的 kube-apiserver 地址在代理连接下会发生变化,需要 Host 集群为 Member 集群生成一个新的 Kubeconfig 。这样的好处是可以屏蔽底层细节,对于控制平面来说无论是直接连接还是代理方式连接,呈现给控制平面的都是一个可以直接使用的 Kubeconfig。

DevOps

img

KubeSphere 提供了基于 Jenkins 的可视化 CI/CD 流水线编辑,无需对 Jenkins 进行配置,同时内置丰富的 CI/CD 流水线插件,包括Binary-to-Image (B2I) 和Source-to-Image (S2I),用于将源代码或二进制文件打包到准备运行的容器映像中。

CI/CD 流水线

img
  • 自动化:CI/CD 流水线和构建策略均基于 Jenkins,可简化和自动化开发、测试和生产过程。缓存依赖项用于加速构建和部署。

  • 开箱即用:用户可以基于他们的 Jenkins 构建策略和客户端插件来创建基于 Git repository/SVN 的 Jenkins 流水线。在内置的 Jenkinsfile 中定义任何步骤和阶段。支持常见的代理类型,例如 Maven,Node.js 和 Go。用户也可以自定义代理类型。

  • 可视化:用户可以轻松地与可视化控制面板进行交互,编辑、管理 CI/CD 流水线。

  • 质量管理:支持通过静态代码分析扫描来检测DevOps 工程中的 bug、代码错误和安全漏洞。

  • 日志:日志完整记录 CI/CD 流水线运行全过程。

基于 Istio 的服务网络

KubeSphere 服务网络由一组生态系统项目组成,例如 Istio,Envoy 和 Jaeger。我们设计了一个统一的用户界面来使用和管理这些工具。大多数功能都是现成的,并且是从开发人员的角度进行设计的,这意味着 KubeSphere 可以帮助用户减少学习难度,因为不需要单独深入研究这些工具。

KubeSphere 服务网络为分布式应用程序提供细粒度的流量管理、可观测性、服务跟踪以及服务身份和安全性管理。因此,开发人员只需要专注于核心业务。通过 KubeSphere 的服务网络管理,用户可以更好地跟踪、查看路由和优化 Kubernetes 中用于云原生应用程序的通信。

流量管理

img
  • 金丝雀发布:金丝雀发布是在现有生产系统旁边创建了一个全新的独立生产环境,通过使新版本只对少数终端用户可用,这样可降低向推出新代码和功能的风险。如果新版本一切顺利,用户可以更改百分比,并逐渐用新版本替换旧版本。

  • 蓝绿发布:允许用户同时运行一个应用程序的两个版本。蓝色代表当前应用程序版本,绿色代表经过功能和性能测试的新版本。一旦测试结果成功,就将应用程序流量从生产版本(蓝色)路由到新版本(绿色)。

  • 流量镜像:流量镜像也叫作影子流量,是指通过一定的配置将线上的真实流量复制一份到镜像服务中去,我们通过流量镜像转发以达到在不影响线上服务的情况下对流量或请求内容做具体分析的目的,它的设计思想是只做转发而不接收响应(fire and forget),使团队能够以最小的风险进行生产变更。

  • 断路器:允许用户设置服务内单个主机的呼叫限制,例如并发连接数或对该主机的呼叫失败次数。

应用程序管理和编排

img
  • 应用商店:KubeSphere 提供了一个基于开源 OpenPitrix 的应用商店,支持应用上传、应用审核、应用上架与分类、应用部署,为用户提供应用全生命周期管理功能。

  • 应用资料库:在 KubeSphere 中,用户可以创建一个托管在对象存储,例如 QingStor 、 AWS S3 中的应用存储库或 GitHub 中, 提交到应用程序存储库的应用程序包由应用程序的 Helm Chart 模板文件组成。

  • 应用程式范本:有了应用程序模板,KubeSphere 只需单击一下即可提供一种可视化的方法来部署应用程序。在内部,应用程序模板可以帮助企业中的不同团队共享中间件和业务系统。在外部,它们可以用作基于不同方案和需求的应用程序交付的行业标准。

多维度监控

KubeSphere 通过可视化界面操作监控、运维功能,可简化操作和维护的整个过程。它提供了对各种资源的自定义监控,并可以立即将发生的问题发送给用户。

  • 可定制的监控仪表板:用户可以准确决定需要以哪种形式监控哪些工具。KubeSphere 中提供了不同的模板供用户选择,例如 Elasticsearch,MySQL 和 Redis。或者,他们也可以创建自己的监视模板,包括图表,颜色,间隔和单位。

  • 运维友好:开放标准接口,易于对接企业运维系统,以统一运维入口实现集中化运维。

  • 第三方兼容性:KubeSphere 与 Prometheus 兼容,后者是用于在 Kubernetes 环境中进行监视的事实指标收集平台。监视数据可以在 KubeSphere 的 Web 控制台中无缝显示。

  • 二级精度的多维度监控

    • 在集群资源维度,系统提供了全面的指标,例如 CPU 利用率、内存利用率、CPU 平均负载、磁盘使用量、inode 使用率、磁盘吞吐量、IOPS、网卡速率、容器组运行状态、ETCD 监控、API Server 监控等多项指标。

    • 在应用资源维度,提供针对应用的 CPU 用量、内存用量、容器组数量、网络流出速率、网络流入速率等五项监控指标。并支持按用量排序和自定义时间范围查询,快速定位异常提供按节点、企业空间、项目等资源用量排行。

  • 排序:用户可以按节点,工作空间和项目对数据进行排序,从而以直观的方式为他们的资源运行提供图形化视图。

  • 组件监控:它允许用户快速定位任何组件故障,以避免不必要的业务停机。

自研多租户告警系统

  • 自定义告警策略和规则:支持基于多租户、多维度的监控指标告警。该系统将发送与各种资源,如节点、网络和工作负载相关的告警。可自定义包含多个告警规则的告警策略,如重复间隔和时间,来定制自己的告警策略、阈值和告警级别。

  • 准确的事件跟踪:用户可以及时了解集群内部发生的情况,例如容器运行状态(成功或失败),节点调度和镜像拉取结果。它们将被准确记录,并在 Web 控制台中显示结果,状态和消息。在生产环境中,这将帮助用户及时响应任何问题。

  • 增强审计安全性:由于 KubeSphere 具有对用户授权的细粒度管理,因此可以将资源和网络完全隔离以确保数据安全。全面的审核功能使用户可以搜索与任何操作或告警相关的活动。

  • 多种通知方式:电子邮件是用户接收想要了解的相关活动的通知的一种关键方法。可以根据用户自己设置的规则发送邮件,用户可以自定义发件人电子邮件地址及其收件人列表。此外,还支持其他渠道,例如 Slack 和 WeChat。因此,无论用户选择哪种渠道,KubeSphere都会为用户提供更多的通知首选项,因为他们会根据KubeSphere的最新开发进行更新。

日志查询与收集

  • 多租户日志管理.:提供多租户日志管理,在 KubeSphere 的日志查询系统中,不同的租户只能看到属于自己的日志信息,支持中文日志检索,支持日志导出。

  • 多级日志查询:多级别的日志查询(项目/工作负载/容器组/容器以及关键字)、灵活方便的日志收集配置选项等。

  • 多种日志收集平台:用户可以选择多种日志收集平台,例如 Elasticsearch,Kafka 和 Fluentd。

  • 落盘日志收集功能:对于将日志以文件形式保存在 Pod 挂盘上的应用,支持开启落盘日志收集功能。

还有很多优秀的功能无法一一列举,可以移步官方网站查看详情。

KubeSphere 社区

社区驱动着 KubeSphere 的发展,你可以在 GitHub 上找到所有源代码、文档和相关讨论。如果你对 KubeSphere 感兴趣,我们欢迎你参与到社区开放的兴趣小组,不定期的社区会议一定有你感兴趣的内容,欢迎你来提出不一样的见解!

4 月 29 日 KubeSphere 3.1 版本 GA,得益于诸多开发者的贡献,感谢你们的付出,也欢迎更多志同道合的小伙伴们加入!

img

以下是 KubeSphere 主要的开源项目,欢迎大家以各种不同方式参与贡献,可以是文档文案的翻译、也可以是吐槽 bug 的 issue,更加欢迎各位大牛的 PR!

项目 描述
KubeKey K8s 集群安装工具
KubeEye K8s 集群巡检工具
ks-console KubeSphere 前端项目
ks-apiserver KubeSphere 后端项目
KubeSphere Website KubeSphere官网、文档
PorterLB 一个裸金属环境负载均衡器实现
Fluent Bit Operator Fluent Bit Operator
Notification Manager 独立的通知模块
OpenFunction 云原生FaaS平台
OpenPitrix 全生命周期云原生应用管理

往期回顾

Go 开源说第七期:Harbor助你玩转云原生

Go 开源说第五期:MOSN Go语言网络代理软件

Go 开源说第四期(下):go-zero缓存管理最佳实践