不可否认,在近十年间,云计算的相关应用得到了蓬勃的发展。根据Gartner的统计和预测,全球公共云服务市场在2019年已经达到了2278亿美元,而今年它将持续增长17%,并达到2664亿美元(请参见--https://www.gartner.com/en/newsroom/press-releases/2019-11-13-gartner-forecasts-worldwide-public-cloud-revenue-to-grow-17-percent-in-2020#:~:text=The%20worldwide%20public%20cloud%20services,research%20vice%20president%20at%20Gartner.)。像Airbnb、Netflix和Uber之类,以云服务为基础的明星企业,利用云原生(Cloud Native)技术,在竞争对手之前更快地抢占了市场,甚至重塑了所在的行业。可见,理解并选择正确的云原生技术,将有助于提高应用与服务的开发速度,减少维护工具的复杂性,并能提高有限基础设施的利用率。本文将向您介绍13种云原生工具,以方便您打造本企业的云原生属性。
什么是原生云?
云原生计算基金会(Cloud Native Computing Foundation,CNCF)提供的官方定义为:云原生技术是在公共云、私有云、以及混合云的动态环境中,让组织能够构建和运行具有可扩展性的应用程序。这些应用包括:容器、服务网格、微服务、恒定架构(immutable infrastructure)、以及声明性API等。这些技术使得松耦合的系统具有一定云端弹性、可管理性和可观察性。凭借着其自动化的技术特点,开发人员可以在不增加工作量的情况下,频繁地、可预见性地进行各种变更与迭代。简而言之,云原生的目标就是根据业务所需,快速、敏捷地向用户交付软件产品,并降低IT的整体成本。
云原生的价值
云原生技术具有以下三方面的优势:
- 速度:云原生应用程序可以快速地被开发和部署,从而加快了产品面市的时间。许多云服务提供商都带有云原生组件,这让托管此类应用变得非常简单。此外,由于云计算原生工具严重依赖抽象,这使得抽象更加通用,开发团队不再需要依附整个公司的共享运行时,来运行自己的服务。因此,组织需要处理的开销也就更少。
- 可扩展性和可用性:原先仅能够处理上百个客户的云原生应用,可以被无缝地扩展到服务数百万个客户,以满足实时的资源需求。这比传统的静态调整资源要更加节省成本。此外,自动化故障转移和蓝绿部署等技术,也融入到了云原生工具中。
- 质量:云原生应用程序的开发往往是基于恒定性和解耦性的。这使得应用程序不但健壮、易于维护,而且具有较高的软件质量。由于时下流行的云原生技术是开源的,而且得到了CNCF的支持,因此软件开发公司可以避免被某个云供应商所锁定,并能够在开发工作中持续得到社区的维护和支持。
基于上述优势,许多像Microsoft、Google和Amazon之类的大型组织,都在最小化运营成本的同时,享受到了云计算的巨大红利。
如何实现云原生
为了将应用迁移到云原生系统中,您往往需要用到如下结构化方法中的一种:
- 垂直:选择一个非关键性任务的服务,然后对其启用云原生技术,并实施迁移。
- 水平:专注于某个单独的云原生功能,如持续集成(CI)或持续交付(CD),将其部署到所有现有的服务中。
注意:选择某个非关键性的任务系统,对于降低风险、以及最大限度地提高迁移成功率来说,都是至关重要的。
云原生工具
以下便是业界常用的云原生工具列表。各大公司通过使用它们,实现了更快的产品交付,更少的摩擦,以及更低的开发与维护成本。
1.微服务
微服务能够将产品的功能划分为多个可以被单独部署的单元。例如,在传统的非云原生(pre-cloud-native)部署中,通常只有一个网站服务来管理各种API和客户间的交互。但是通过使用微服务,您可以将该网站分解成为包括账号服务和用户服务在内的多个服务。据此,您可以单独地对这些服务进行开发、部署和扩展。
同时,微服务通常是无状态的,它给开发团队利用云原生工具提供了各种灵活性。
推荐技术: Node.js(https://nodejs.org/)
替代技术: Kotlin(https://kotlinlang.org/),Golang(https://golang.org/)
持续集成/持续部署(CI/CD)是一种基础架构组件,它支持自动化的测试执行(和可选的部署),拉取式请求合并,以及版本控制事件。CI/CD使得公司能够实现诸如:单元测试、静态分析、以及安全分析等质量门。而且,作为云原生生态系统中的基础工具,CI/CD也可以提高工程效率,并减少错误的数量。
推荐技术: Gitlab CI/CD(https://docs.gitlab.com/ee/ci/)
替代技术: Github Actions(https://github.com/features/actions)
3.容器
容器是云原生生态系统的核心。它通过简化开发人员的操作,来提高交付速度和产品质量。通过使用带有Docker工具的容器,开发团队可以指定目标系统的依赖性,同时提供统一且通用的执行层面。而通过该层面,团队只需着眼于Kubernetes之类容器编排等单个基础设施。
同时,工程团队可以将容器的镜像存储在容器的注册表中,以提供漏洞分析和细粒度的访问控制。该领域的热门服务包括:Docker Hub(https://hub.docker.com/)、Google Container Registry(https://cloud.google.com/container-registry)、Quay(https://quay.io/)。
推荐技术: Docker(https://www.docker.com/)
替代技术: Podman(https://podman.io/),LXD(https://linuxcontainers.org/lxd/introduction/)
4.容器编排(Container Orchestration)
上面提到的容器编排是一种用于启动和管理大量容器的工具。它并不需要特定于语言或团队的部署策略,而是允许用户指定某个或某组容器镜像进行配置。编排的最后是将这些规范转换为运行的工作流。因此,开发团队可以只维护一个用于执行任何一种OCI规范(https://github.com/opencontainers/runtime-spec/blob/master/spec.md)的容器。
推荐技术: Kubernetes(https://kubernetes.io/)
替代技术: Google Cloud Run(https://cloud.google.com/run)
5.基础设施即代码
基础设施即代码是一种在版本控制的基础上实施云端配置的策略。过去,公司通常需要通过管理面板,来手动配置和管理云端资源。不过,这样会导致团队很难跟踪各种手动更改。而基础设施即代码则是通过将云端资源定义为代码,并将其纳入版本控制之中,来解决该问题。也就是说,我们可以在代码中对基础设施的配置进行更改,并通过公司的部署过程进行升级,其中可以包括同行评审(peer reviews)、CI和CD等。而版本控制则会提供一套审核日志,来显示谁、何时更改了哪些资源。
推荐技术: Terraform(https://www.terraform.io/)
替代技术: Pulumi(https://www.pulumi.com/)
6.密码管理
像密码、私钥和API凭据等密码管理,对于云原生解决方案来说是必不可少的。它们需要被加密后,存储到相应的配置中。成熟的解决方案往往是通过颁发临时的数据库凭据或循环凭据,来保障密码管理的安全性。由于容器化服务可以实现水平方向扩展,并且可以被安排在许多不同的机器上,因此我们需要为云原生应用程序配置一套合适的密码管理方案,以免增加密码泄漏的风险暴露面。
推荐技术: Vault(https://www.vaultproject.io/)
替代技术: Sealed Secrets(https://github.com/bitnami-labs/sealed-secrets)
7.证书
对于基于容器的解决方案来说,许多不同的服务可能会在同一台物理机器上运行。如果数据没有被加密,那些已经获得了主机网络访问权限的攻击者,就能够轻松地读取到各个服务之间的所有通信。通过TLS进行安全通信不仅是一种最佳实践,而且是必不可少的。当然,自动化更新云原生证书的解决方案,会比手动部署要可靠得多。
推荐技术: cert-manager(https://github.com/jetstack/cert-manager)
替代技术: Google managed certificates(https://cloud.google.com/kubernetes-engine/docs/how-to/managed-certs)
8 .API网关
API网关在实际应用中往往被作为反向代理,提供了类似于Apache(https://httpd.apache.org/)和NGINX(https://www.nginx.com/)之类传统反向代理产品的功能。此外,API网关还支持:
- gRPC、HTTP/2和Websockets等协议
- 动态配置
- 双向TLS
- 路由
- 提供诸如速率限制和电路中断等云服务弹性功能
- 提供各类监控指标的可见化
推荐技术: Ambassador(https://github.com/datawire/ambassador)
替代技术: Kong(https://konghq.com/)
9.日志
作为可观察性(https://www.oreilly.com/library/view/distributed-systems-observability/9781492033431/ch04.html)的基础,日志记录对于开发团队来说是再熟悉不过了。云原生工具在日志方面强调的是受监控指标的时序性,旨在以成本效益的方式,获悉事件发生的原委。同时,日志对于云端应用的开发调试与观察,也是必不可少的“刚需”。
推荐技术: EFK(https://www.cncf.io/blog/2020/07/27/logging-in-kubernetes-efk-vs-plg-stack/)
替代技术: Loki(https://github.com/grafana/loki)
10.监控
上面提到的时序日志往往来自于监控系统。该系统通过聚合监控数据,以避免存储所有的事件。也就是说,云原生系统需要通过成本效益的方式,来了解系统在如下方面的状态:
- 进行了多少次操作?
- 操作的结果是成功还是失败?其状态代码是什么?
- 操作耗时多久?
- 重要资源(如:队列深度或线程池)的数值是多少?
您可以为受监控的指标分配不同的维度,以深入了解单个主机、操作系统、以及版本等方面的性能。
推荐技术: Prometheus(https://prometheus.io/)/Grafana(https://prometheus.io/docs/visualization/grafana/)
替代技术: Datadog(https://www.datadoghq.com/)
11.警报
警报是日志监控的结果,它会将系统出现的问题、以及对应的时序指标,通知到操作人员。例如,当系统的HTTP 500系列状态代码增加、或请求等待时间延长时,此类警报会及时发送到运营团队处。对于云原生系统而言,出现问题并不可怕,可怕的是大家不知道问题出在哪里。因此,警报的作用是不言而喻的。
推荐技术: Prometheus Alertmanager(https://prometheus.io/docs/alerting/latest/alertmanager/)
替代技术: Grafana Alerts(https://grafana.com/docs/grafana/latest/alerting/)
12.追踪
为了减少在启动和扩展服务上的开销,开发团队往往会在服务发布之前,分配给云服务更多的资源。支持团队可以通过监控和跟踪各个服务之间的通信,来了解用户的最终状态,以及用户在使用过程中,每个阶段的耗时和资源使用率。据此,当出现性能问题时,团队可以及时捕获到错误信息。因此,作为观察和调试工具的深化,云原生技术的跟踪功能,可以让团队更快地诊断问题,进而显著地减少宕机时间。
推荐技术: Jaeger(https://www.jaegertracing.io/)
替代技术: Zipkin(https://zipkin.io/)
13.服务网格
作为上述功能的综合,云服务网格可以提供动态路由、负载平衡、服务发现、网络策略,以及包括断路器(https://docs.microsoft.com/en-us/azure/architecture/patterns/circuit-breaker)和重试机制(https://docs.microsoft.com/en-us/azure/architecture/patterns/retry)在内的云服务弹性功能。我们可以将服务网格视为云计算原生架构在负载平衡方面的一种进化。
推荐技术: Istio(https://istio.io/)
替代技术: Consul(https://www.consul.io/)
小结
通过灵活地选用上述云原生工具,我们可以适当地提高云服务产品的交付速度,增加服务的可用性与性能,以及保持企业的竞争优势。您不必一蹴而就,完全可以从某个单一技术入手,以充分利用它给云端业务带来的显著好处与提升。
原文标题:How to Become a Cloud-Native Company and 13 Tools to Get You There, Kentaro Wakayama