在这篇文章中,我们将讨论以下话题:

  • 为什么 Google 和 Meta 将十亿行代码放在一个仓库
  • CI/CD 管道简单解释
  • API 网关做什么
  • Docker vs. Kubernetes
  • 云原生反模式

CI/CD 管道简单解释

第 1 节 - 带 CI/CD 的 SDLC

软件开发生命周期(SDLC)由几个关键阶段组成:开发、测试、部署和维护。CI/CD 自动化和集成这些阶段以实现更快、更可靠的发布。

当代码推送到 git 仓库时,它触发自动构建和测试过程。运行端到端(e2e)测试用例来验证代码。如果测试通过,代码可以自动部署到暂存/生产。如果发现问题,代码将发送回开发进行 bug 修复。这种自动化为开发人员提供快速反馈,并减少生产中的 bug 风险。

第 2 节 - CI 和 CD 的区别

持续集成(CI)自动化构建、测试和合并过程。它在代码提交时运行测试以尽早检测集成问题。这鼓励频繁的代码提交和快速反馈。

持续交付(CD)自动化发布过程,如基础设施变更和部署。它确保软件可以通过自动化工作流程随时可靠发布。CD 还可以自动化生产部署前所需的手动测试和审批步骤。

第 3 节 - CI/CD 管道

典型的 CI/CD 管道有几个连接阶段:

  • 开发人员将代码变更提交到源代码控制
  • CI 服务器检测变更并触发构建
  • 代码编译、测试(单元、集成测试)
  • 测试结果报告给开发人员
  • 成功后,工件部署到暂存环境
  • 发布前可能在暂存上进行进一步测试
  • CD 系统将批准的变更部署到生产

API 网关职责

下图显示了详细信息。

  • 步骤 1:客户端向 API 网关发送 HTTP 请求
  • 步骤 2:API 网关解析和验证 HTTP 请求中的属性
  • 步骤 3:API 网关执行允许列表/拒绝列表检查
  • 步骤 4:API 网关与身份提供商对话进行身份验证和授权
  • 步骤 5:对请求应用速率限制规则。如果超过限制,请求被拒绝
  • 步骤 6 和 7:现在请求已通过基本检查,API 网关通过路径匹配找到相关服务进行路由
  • 步骤 8:API 网关将请求转换为适当的协议并发送到后端微服务
  • 步骤 9-12:API 网关可以正确处理错误,并在错误需要更长时间恢复时处理故障(断路器)。它还可以利用 ELK(Elastic-Logstash-Kibana)栈进行日志记录和监控。我们有时在 API 网关中缓存数据

问题

  • 负载均衡器和 API 网关有什么区别?
  • 我们需要为 PC、移动和浏览器分别使用不同的 API 网关吗?

Docker vs. Kubernetes

什么是 Docker?

Docker 是一个开源平台,允许你在隔离的容器中打包、分发和运行应用程序。它专注于容器化,提供封装应用程序及其依赖项的轻量级环境。

什么是 Kubernetes?

Kubernetes(通常称为 K8s)是一个开源容器编排平台。它提供了一个框架,用于在节点集群上自动化部署、扩展和管理容器化应用程序。

两者有何不同?

Docker:Docker 在单个操作系统主机上的单个容器级别操作。你必须手动管理每个主机,为多个相关容器设置网络、安全策略和存储可能很复杂。

Kubernetes:Kubernetes 在集群级别操作。它管理多个主机上的多个容器化应用程序,为负载平衡、扩展和确保应用程序期望状态等任务提供自动化。

简而言之,Docker 专注于容器化并在单个主机上运行容器,而 Kubernetes 专门在主机集群上大规模管理和编排容器。

问题:什么挑战促使你从 Docker 切换到 Kubernetes 来管理容器化应用程序?

云原生反模式

通过了解这些反模式并遵循云原生最佳实践,你可以设计、构建和运营更健壮、可扩展和具有成本效益的云原生应用程序。

  • 单体架构:一个大型、紧密耦合的应用程序在云上运行,阻碍可扩展性和敏捷性
  • 忽略成本优化:云服务可能很昂贵,不优化成本可能导致预算超支
  • 可变基础设施:基础设施组件应视为可处置的,从不在原地修改。未能采用这种方法可能导致配置漂移、维护增加和可靠性降低
  • 低效的数据库访问模式:使用过于复杂的查询或缺乏数据库索引,可能导致性能下降和数据库瓶颈
  • 大容器或臃肿镜像:创建大容器或使用臃肿镜像可能增加部署时间、消耗更多资源并减慢应用程序扩展
  • 忽略 CI/CD 管道:部署变得手动且容易出错,阻碍软件发布的速度和频率
  • 共享资源依赖:依赖共享资源(如数据库)的应用程序可能产生争用和瓶颈,影响整体性能
  • 使用太多云服务而没有策略:虽然云提供商提供大量服务,但没有明确策略使用太多服务可能产生复杂性,使管理应用程序更困难
  • 有状态组件:在应用程序中依赖持久状态可能引入复杂性、阻碍可扩展性并限制容错

问题:你在云原生旅程中面临什么反模式?你如何克服它们?

本文为学习目的的个人翻译,译文仅供参考。

原文链接:EP71: CI/CD Pipeline Explained in Simple Terms

版权归原作者或原刊登方所有。本文为非官方译本;如有不妥,请联系删除。