你好,我是王炜。今天我们一起来看一看该从什么角度了解云原生领域。
说起云原生领域,我相信你首先想到的是大名鼎鼎的 Kubernetes(Kubernetes),Kubernetes 已经成为容器调度的事实标准了。那你有没有想过,除了 Kubernetes 代表的容器调度方向以外,还有哪些值得我们关注的方向呢?
在上一节课,我为你详细介绍了 CNCF 云原生基金会。CNCF 作为云原生开源项目托管和运营基金会,是我们了解云原生发展的最佳对象。这节课,我们还是立足 CNCF,深入云原生领域多元化的方向及数量众多的核心产品。我会结合自己对这些产品的实践和总结,帮助你全面了解云原生,让你未来能够更好地进行技术选型。
接下来,我将重点介绍云原生全景图:CNCF Landscape。
毫不夸张地说,了解了 CNCF Landscape,就算是对云原生领域有了一个全局的认识。
稍微了解云原生领域的同学可能会知道,云原生相关的产品数量是非常庞大的。为了能够更好地收集、分类并展示它们,为云原生行业的从业者和研究者提供便利,CNCF Landscape 孕育而生。
CNCF Landscape 中文名叫做云原生全景图。顾名思义,它为我们提供了云原生领域的全局视角,你可以理解为,它为数量庞大的云原生产品做了更加细致的垂直分类。同时,全球任何开发者都可以通过协作的方式,将符合云原生标准的项目提交到云原生全景图中。
如下图所示,这只是云原生全景图的一部分。
当你第一次打开云原生全景图时,我相信你会被这些庞大数量的云原生项目所震撼。
为了更好地读懂全景图,首先我们需要对它进行简单的分类。
大体上看,我们可以将全景图分为两大部分:
垂直方向和产品指的是云原生细分的方向以及这些方向所包含的产品。而平台和服务商指的是与 CNCF 合作的一些云厂商,典型的有 AWS、腾讯云或者阿里云等等。
接下来,我们重点介绍垂直方向和产品这部分。
你可以对照着全景图,结合我下面给出的分类,按照从上到下,从左到右的顺序来解读:
为了能让你有的放矢,我把重点方向做了加粗。也就是说,在日常工作中,我们大概率会接触并使用到的产品都在上面这 12 个垂直方向中。接下来,我就结合实际产品,对这 12 个垂直方向做一下详细的介绍。
这个方向聚焦在定义云原生应用以及构建容器镜像上,例如应用编写、打包、测试、安装和升级。主要的产品有下面几类。
在项目实践上,应用定义环节最开始可能会使用 Kubernetes 原生的 Manifest 来部署应用,随着项目的发展,例如我们需要关注不同环境、多服务镜像版本、环境配置差异的时候,可以进一步将 Manifest 迁移到 Kustomize 或者 Helm 上,为 Kubernetes 应用安装包提供更大的灵活性。
在镜像构建环节,Dockerfile 的构建方式仍然是主流的选择。
可以说,构建镜像是开发者在开发阶段等待时间最长的环节。要想在不必重新构建镜像的情况下就能查看编码效果,你还可以尝试使用 Nocalhost 或 Telepresence。
这个方向聚焦在 Kubernetes 应用的构建和部署上,也就是我们常说的 CI/CD。主要的产品有ArgoCD、FluxCD、Tekton 和 Spinnaker。
云原生的出现改变了 CI/CD 系统的格局,尤其是持续交付方向,ArgoCD 和 FluxCD 开创了以 GitOps 为基础的全新交付方式。对于大部分 Kubernetes 业务应用来说,持续集成主要的功能是自动化测试和构建镜像,持续部署主要的功能是将应用部署到 Kubernetes。这样的话, Tekton(CI) + ArgoCD(GitOps) 的搭配就是一个不错的选择。
当部署环境涉及多云以及混合的运行环境时,例如, Kubernetes 应用和 VM 应用共存时,可以考虑使用 Spinnaker。
这个方向聚焦在容器调度和基础设施的编排上,例如跨集群调度和管理容器。主要的产品包括 Kubernetes 和 Crossplane。
除了 Kubernetes 以外,容器调度方向其实还有非常多的项目,例如 Docker Swarm、Mesos 等,由于 Kubernetes 已经成为了生产级容器调度的事实标准,所以社区认为没有必要再维护它们了。
在基础设施编排方向上,Terraform 是一个非常不错的选择。当然,基于相同理念的 Crossplane 是后起之秀,它可以通过声明 CRD 的方式来管理基础设施,目前在社区也比较活跃。
这个方向聚焦在基于 Kubernetes 的 API 网关上,主要的产品有下面几类。
提到网关,我们最熟悉的莫过于 Nginx 项目,它在 Kubernetes 平台也有相应的实现,也是最常见的 Ingress-nginx 项目。
Kubernetes 通过 Ingress 来统一管理外部服务访问的 API 对象。Ingress 可以是多种实现方式,例如 Ingress-nginx、Emissary-ingress、Traefik-ingress 等,其中,Ingress-nginx 和 Traefik-ingress 是项目中比较常用的 API 网关。
服务网格是一个比较新的方向,主要用于大规模微服务架构下的流量管理,尤其是东西流量管理(也就是微服务和微服务之间的流量管理)。主要产品包括 Istio 和 Linkerd2。
服务网格能够以无侵入的方式为服务调用提供可观察性、流量管理和安全性等方面的支持。在我们最关注的流量管理方面,服务网格可以无侵入实现服务熔断和降级、金丝雀和灰度发布、访问速率控制、加密以及端到端的身份验证。
比较这两个项目,Istio 目前比较流行,但是数据面采用的是 Envoy 代理,在大规模场景下可能会有性能问题。Linkerd2 也有较好的发展趋势,数据面采用由 Rust 开发的轻量级 Linkerd2-proxy,在大规模场景以及性能方面比较有优势。在使用门槛和复杂性上,Linkerd2 相对简单,更有优势。
这一方向聚焦在 Kubernetes 的存储解决方案,也就是提供持久卷的存储能力上。主要的产品有 Rook、 Longhorn 和 Velero。
云原生存储是通过容器存储接口(CSI)来实现的。它提供了一个标准 API,不同的项目只要实现这些 API 就可以为 Kubernetes 提供持久卷能力支持。
云原生存储方向项目如 Rook、Longhorn 等多用在私有化场景中,对于一些私有化的 Kubernetes,往往需要自建存储服务,以便在 Kubernetes 集群内使用 StorageClass、PV 和 PVC。
而对于使用云厂商托管 Kubernetes 集群的情况,集群的持久化存储基本上会实现由自家云提供的云存储服务,我们只需要直接使用它们即可。
对于集群备份、迁移以及持久卷的备份和恢复场景,我们可以选择 Velero 项目。因为它支持使用 Minio 作为备份存储服务,极大简化了 Kubernetes 的备份和恢复过程。
容器运行时是 Kubernetes 执行容器化动作的软件,主要的产品有下面四个。
对于终端用户来说,我们在大部分场景下无需关注容器运行时,因为它们在上层提供的能力基本上是一致的。例如, Containerd 是目前比较常用的容器运行时,也是许多云厂商默认的运行时。在 Kubernetes 1.20 版本过后,社区已经不再推荐使用 Docker 作为运行时了。
不过,如果我们对容器运行时有特殊要求。例如,强调容器之间的隔离性和安全性,特别是对一些希望像用 VM 那样使用 Pod 的团队而言,Kata-Container 或 gVisor 是一个不错的选择。
这个方向聚焦在为镜像提供推送、存储和下载功能。主要的产品有 Harbor 和 Dragonfly2。
容器仓库本质上是一组 Web API 接口,它允许容器运行时推送、查找和下载容器镜像。
当然,除了选择开源项目以外,各大云厂商往往也会有自己商业化的容器仓库产品。例如 GitHub Package、Google Container Registry、AWS ECR 等。这些商业化的产品往往还能够提供例如 CDN 分发和加速、安全等企业级功能。
对于用量不大的团队而言,商业化产品不需要付出维护成本,只需要为存储和流量付费即可,性价比较高。当然,在用量比较大的业务场景下,自建镜像仓库成本确实更低。
该方向聚焦在为 Kubernetes 提供监控指标采集、查询和可视化服务上,主要的产品有 Prometheus、 Thanos 和 Grafana。
在云原生监控方向,Prometheus + Grafana 已经成为非常流行的开源技术选型方案。要快速搭建它们相对容易,但要长期使用的话,这个方案对运维要求还是比较高的,尤其是要面对 Prometheus 的大规模集群和持久化的后端存储方面的挑战。
例如,在大规模的持久化方面,我们经常会把它们和时序数据库 InfluxDB 一起使用,这就会产生额外的运维工作。另外在大规模的监控场景下, Prometheus 也非常容易产生性能瓶颈,这就对 Prometheus 的高可用提出了更大的挑战。
安装 Prometheus 后,它会自动抓取 Kubernetes 和 Pod 在系统级的指标数据。如果你希望采集业务指标,就需要在业务代码中集成相应的 SDK,并且输出符合 Metric 规范的指标数据,提供给 Prometheus 来抓取指标。
当然,如果你不想自己维护开源技术栈,也可以选择其他的商业化产品,例如著名的 Datadog。
日志方向主要聚焦在为 Kubernetes 应用提供日志采集、存储和分析功能,主要产品有 Fluentd 和 Loki。
总的来说,日志方向有不少开源的技术选型,例如我们常见的 EFK 技术栈。EFK 由 Elasticsearch、Fluentd 和 Kibana 组成,其中,Elasticsearch 主要负责存储日志和查询分析,Fluentd 作为 Agent 负责采集日志信息并将日志发送到 Elasticsearch 中存储,Kibana 则作为展示查询结果的 UI 界面。
在一些中小型的应用场景中,Loki 是一个更流行的选择。特别是对于已经采用 Prometheus 作为监控的团队来说,Prometheus + Loki + Grafana 可以一次性解决监控和日志问题。
该方向致力于为 Kubernetes 应用提供分布式调用链追踪能力。主要产品有 Jaeger、 Skywalking 和 Grafana Tempo。
分布式追踪方向有很多优秀的开源产品,如果想要实现多语言和端到端的分布式追踪,Jaeger 是一个非常不错的选择,但它的代价是需要集成相对应的 SDK,对业务有一定的侵入性。
如果后端语言比较单一,尤其是使用了 Java 技术栈,推荐使用 Skywalking 作为 APM 和分布式追踪工具,它对业务基本上没有侵入性。
该方向聚焦在为 Kubernetes 应用提供混沌工程实验平台,主要的产品为 Chaos-Mesh 和 Chaosblade。
混沌工程最早由 Netflix 提出,经过多年的发展,已经成为很多大型分布式应用检验稳定性的实验工具。它能够向系统中随机注入一些常见的故障,例如 CPU 和内存压力测试、IO 故障、网络延迟等,目的是以主动的方式找到微服务系统中较为薄弱的地方,进行定向优化。
在上面列出的这两个项目中,Chaos-Mesh 为我们提供了 UI 操作界面,对于刚接触混沌工程的同学来说是上手混沌工程不错的选择。
前面提到,CNCF Landscape 支持以协作的方式将自己的项目提交到全景图中。具体的协作是通过GitHub 仓库来进行的。你可以向这个仓库提交 Pull Request ,把你的项目信息合并到全景图中,特别要注意在提交时选择一个适合的分类。
当提交被 CNCF Review 并合并后,你就可以在 Landscape 网站看到自己的项目了。
在今天的分享中,我给你提供了一个了解云原生领域的角度:CNCF Landscape。云原生领域的垂直方向非常多,在刚开始学习的时候,往往很难抓住重点方向。
正因为如此,我特意把你大概率会在工作中接触到的方向做了标注,你可以先专注在这 12 个方向上,有针对性地学习。在未来的工作中,当你需要在某个云原生方向搭建开源技术栈时,希望这篇文章能够帮到你。
最后,还有一点要再强调一下。在做技术选型决策的时候,请务必从团队需要什么、未来的可维护性以及业务扩展性三个维度来综合评估,有时候并不存在最好的技术选型,你更需要关注的是,哪些技术会更适合你们团队的现状和未来。
文章来源:极客时间《云原生架构与 GitOps 实战》