作者:Kentaro Wakayama翻译:Bach(才云)
校对:星空下的文仔(才云)、bot(才云)
在过去的十年中,云计算有了巨大的增长。根据 Gartner 预测,2020 年全球公共云服务市场将增长 17%,总额将达到 2664 亿美元,远高于 2019 年的 2278 亿美元。云计算使世界上一些大型公司重塑并主导其所在行业。这些公司的产品基于云服务,并利用云原生技术来比竞争对手做到更快,更具适应性。许多企业采用了云原生技术,并将概念引入其内部部署应用程序。
了解和选择正确的云原生技术对于提高开发速度、减少开发和维护工具及基础架构至关重要。这篇文章描述了值得了解的云原生技术,并推荐了可以使用的云原生工具。
K8sMeetup
什么是云原生?
云原生关于速度和敏捷性,这是关于云的优势,更快地解决业务挑战并降低 IT 成本。CNCF 提供了一个官方的定义:
云原生技术有利于各组织在公有云、私有云和混合云等新型动态环境中,构建和运行可弹性扩展的应用。云原生的代表技术包括容器、服务网格、微服务、不可变基础设施和声明式 API。这些技术能够构建容错性好、易于管理和便于观察的松耦合系统。结合可靠的自动化手段,云原生技术使工程师能够轻松地对系统作出频繁和可预测的重大变更。
简而言之,云原生的目标是按照业务需求,速度地向用户或客户交付软件产品。
云原生技术具有以下优点:
- 速度:快速开发并部署云原生应用程序,缩短产品上市时间。许多云使用云原生组件,以轻松托管应用程序。
- 可扩展性和可用性:处理 100 个客户的云原生应用程序可以无缝扩展到服务数百万个客户。资源可以做到始终适应需求,与传统的静态扩展资源相比,这样无疑节省了资金。此外,诸如自动故障转移和蓝绿部署的技术也已被植入云原生工具中。
- 质量:开发云原生应用程序时要牢记不可变性(immutability)和去耦性,这可以提高应用程序健壮性并易于维护,从而提升软件质量。由于云原生技术是开源的,并由 CNCF 支持,因此公司可以避免供应商锁定,并从社区的维护和开发工作中受益。
K8sMeetup
如何实现云原生
要迁移到云原生系统,我们需要一种类似以下的结构化方法:
- 纵向:选择一项不是关键的服务,然后将其启动,迁移到云原生技术上。
- 横向:专注于单个云原生功能,例如持续集成(CI)或持续交付(CD),并将其部署在所有现有服务中。
选择非关键任务系统可以降低风险,同时最大程度提高成功迁移的几率。
K8sMeetup
云原生工具
以下是云原生工具的列表,利用全套工具的公司通常拥有更快的速度、更少的阻力以及更低的开发和维护成本。
微服务(Microservice)
微服务将产品功能划分为可以单独部署的单元。例如,在传统的部署中,通常只有一个网站服务来管理 API 和客户交互。使用微服务,我们可以将该网站分解为多种服务,例如结帐服务和用户服务,然后分别开发、部署和扩展这些服务。
此外,微服务通常是无状态的,利用十二因素应用(twelve-factor application)可充分利用云原生工具提供的灵活性。
- 推荐技术:Node.js
- 替代技术:Kotlin,Golang
持续集成、持续部署(CI/CD)
CI/CD 是基础架构组件,它支持自动测试执行(以及可选的部署),以响应版本控制事件(例如拉取请求和合并)。CI/CD 使公司能够实施质量检验,例如单元测试、静态分析或安全性分析。CI/CD 是云原生生态系统中的基础工具,可以提高工程效率并减少错误。
- 推荐技术:Gitlab CI/CD
- 替代技术:Github Actions
容器
容器是云原生生态系统的核心,可通过简化开发人员操作来实现速度和质量的提升。通过将容器与诸如 Docker 之类的工具一起使用,团队可以指定其系统依赖性,同时提供统一且通用的执行层。该层使基础架构团队能够操作单个基础架构,例如容器编排工具(如 Kubernetes)。团队可以将容器镜像存储在容器注册表中,大多数情况下,该注册表还会提供漏洞分析和细粒度的访问控制。
- 推荐技术:Docker
- 替代技术:Podman、LXD
容器编排
容器编排工具用于启动和管理大量容器并消除特定语言或特定团队的部署策略。它们允许用户指定容器镜像、镜像组以及一些配置。编排人员采用这些规范并将其转换为正在运行的工作负载。容器编排工具使基础架构团队能够维护单个基础架构组件,该组件可以执行任何符合 OCI 规范的容器。
- 推荐技术:Kubernetes
- 替代技术:Google Cloud Run
基础架构即代码(Infrastructure as Code)
基础架构即代码是一种将云配置置于版本控制之下的策略。公司通常通过管理面板进行配置来手动管理云资源,但手动配置的跟踪更改非常困难。基础架构即代码通过将云资源定义为代码并将其置于版本控制之下来解决此问题。在代码中对基础架构配置进行更改,并通过公司的部署过程来进行更改,其中可以包括同行评审(peer review)、CI/CD。版本控制提供了一个审核日志,该日志显示谁更改了资源、更改了哪些资源以及何时进行了更改。
- 推荐技术:Terraform
- 替代技术:Pulumi
Secret
Secret 管理对于云原生解决方案至关重要,但规模较小时常常被忽略。Secret 可以是任何私密的东西,例如密码、私钥和 API 凭证。Secret 应该加密并存储在配置中。成熟的解决方案通过临时数据库凭证或轮换凭证的发布,从而使 Secret 管理更加安全。寻找合适的 Secret 管理解决方案对于云原生应用至关重要,因为容器化服务可以水平扩展,并在许多不同的机器上进行调度。忽略 Secret 管理的组织会提高凭证泄漏的风险。
- 推荐技术:Vault
- 替代技术:Sealed Secrets
证书
通过 TLS 进行安全通信是必不可少的最佳实践,这在基于容器的解决方案中尤其重要,因为许多不同的服务可能在同一台物理计算机上运行,如果不进行加密,攻击者可以获得主机网络的访问权限,读取服务之间的所有流量。另外,为云原生部署手动更新证书并不可行,这也是需要自动化解决方案的一个原因。
- 推荐技术:cert-manager
- 替代技术:Google 托管证书
API 网关
API 网关是反向代理,具有超越传统反向代理(例如 Apache 和 NGINX)的功能。API 网关支持:
- 诸如 gRPC、HTTP/2 和 Websockets 协议。
- 动态配置。
- 相互 TLS。
- 路由。
- 弹性原语(Resiliency primitive),例如速率限制和断路。
- 指标可见性。
- 推荐技术:Kong
- 替代技术:Ambassador
日志
日志是可观察性的基础。日志是团队非常熟悉并经常访问的地方,它是可观察性的关键。日志对于了解系统中正在发生的事情至关重要。云原生工具强调指标的时间序列,因为它们比存储日志更具成本效益。
- 推荐技术:EFK
- 替代技术:Loki
监控
监控系统会将重要事件按时间序列存储。监控数据是聚合的,这意味着它不会存储所有事件,这使得云原生系统需要考虑成本效益。另外,理解云原生系统的状态需要明白以下问题:
- 正在进行多少次操作?
- 操作的结果(成功、失败或状态代码)是什么?
- Operation 需要多长时间?
- 重要资源(例如队列深度或线程池)的计数是多少?
我们可以为监控指标分配不同的维度,以深入了解单个计算机、操作系统、版本等性能。
- 推荐技术:Prometheus、Grafana
- 替代技术:Datadog
告警
告警使日志和指标具有可操作性,可将系统问题通知给管理员,并能与时间序列指标进行配对。例如,当 HTTP 500 状态代码增加或请求持续时间增加时,告警功能可以通知团队。告警对于云原生系统至关重要,倘若没有告警,我们将不会收到有关事件的通知,那公司就无法知道出现了问题。
- 推荐技术:Prometheus Alertmanager
- 替代技术:Grafana Alerts
追踪
云原生技术减少了启动和扩展服务的开销,这样团队通常会发布比云前更多的服务。追踪使团队能够监控服务之间的通信,并能简单地可视化整个终端用户的通信以及通信的每个阶段。当出现性能问题时,团队可以查看发生了哪些服务错误以及事务的每个阶段花费了多长时间。跟踪是下一级的观察和调试工具,可通过允许团队更快地调试问题来显着减少停机时间。
- 推荐技术:Jaeger
- 替代技术:Zipkin
服务网格
服务网格像是云网络的管理利器,它们可以提供动态路由、负载均衡、服务发现、网络策略和弹性原语,例如断路器、重试和期限(deadline)。服务网格是云原生体系结构在负载均衡方面的拓展。
- 推荐技术:Istio
- 替代技术:Consul