Skip to content

云原生

云原生(Cloud Native)是一种构建和运行大型 Web 后台应用的现代技术,充分利用了云计算的优势。云原生应用从设计之初就考虑在云环境运行,强调使用容器、服务网格、声明式 API、不可变基础设施等技术和理念。

云原生的核心要素

  • 微服务:将单体应用拆分为多个独立开发、部署、扩展的小型服务,提高了灵活性和可扩展性,但也增加了系统复杂性。
  • 容器化:将应用和依赖打包为轻量级虚拟化单元,相比虚拟机启动更快、资源占用更少、部署更灵活,代表技术有 Docker 和 Kubernetes。
  • 声明式 API:描述期望状态而非执行过程,系统自动将当前状态调整为期望状态,典型代表是 Kubernetes 的 Deployment、Service、ConfigMap。
  • 不可变基础设施:资源创建后不再修改,变更时创建新资源替换旧资源,避免了配置漂移和配置错误,容器镜像是其典型代表。
  • 服务网格:将服务治理逻辑从代码剥离到基础设施层,提供服务发现、负载均衡、熔断降级、限流、链路追踪等功能,主流实现有 Istio 和 Linkerd。

云原生的优势

  • 弹性伸缩:根据负载自动扩缩容,提高资源利用率。
  • 高可用性:应用多副本部署,故障时自动重启或迁移。
  • 快速迭代:持续集成、持续交付,快速发布新功能。
  • 资源效率:容器共享操作系统内核,资源占用少,提高服务器利用率。
  • 可移植性:应用打包在容器中,可以在任何支持容器的环境中运行。

CNCF 云原生全景图

  • CNCF(Cloud Native Computing Foundation,云原生计算基金会)维护云原生全景图,涵盖云原生的各个领域。
  • 运行时:容器运行时(containerd、CRI-O)、容器网络(CNI)、容器存储(CSI)。
  • 编排和管理:Kubernetes、Helm、Operator。
  • 应用定义和开发:Prometheus、Envoy、CoreDNS、containerd。
  • 可观测性和分析:Prometheus、Grafana、Jaeger、Fluentd。
  • 服务网格:Istio、Linkerd、Consul。

云原生的核心理念

12-Factor App 是 Heroku 提出的云原生应用设计原则,指导开发者构建可移植、可扩展的云原生应用。

  • 基准代码:一份基准代码,多次部署。
  • 依赖:显式声明和隔离依赖。
  • 配置:环境变量存储配置。
  • 后端服务:后端服务视为附加资源。
  • 构建、发布、运行:严格分离构建和运行。
  • 进程:无状态进程。
  • 端口绑定:通过端口绑定提供服务。
  • 并发:通过进程模型扩展。
  • 易处理:快速启动和优雅关闭。
  • 开发环境与线上环境等价:保持开发、测试、生产环境一致。
  • 日志:日志作为事件流。
  • 管理员进程:一次性管理员进程。

云原生的技术栈

容器运行时:containerd、CRI-O、gVisor(安全容器)、Kata Containers(安全容器)。

容器编排:Kubernetes、Nomad、Docker Swarm。

容器网络:CNI(Calico、Flannel、Weave、Cilium)。

容器存储:CSI(Ceph、GlusterFS、NFS、Local PV)。

容器镜像:Docker Hub、Harbor、Quay、阿里云容器镜像服务。

服务网格:Istio、Linkerd、Consul Connect。

监控告警:Prometheus、Grafana、Alertmanager。

日志收集:Fluentd、Fluent Bit、Loki。

链路追踪:Jaeger、Zipkin、SkyWalking。

云原生的最佳实践

无状态设计:应用应该无状态,状态存储在外部(数据库、对象存储)。无状态应用可以随意扩展和迁移。

健康检查:应用提供健康检查接口,容器运行时通过健康检查判断应用是否健康。

优雅关闭:应用监听 SIGTERM 信号,优雅关闭连接,处理完当前请求后再退出。

资源限制:为容器设置资源限制(CPU、内存),避免资源争抢。

小镜像:使用多阶段构建、精简基础镜像,减少镜像大小。

安全扫描:定期扫描镜像漏洞,及时修复。

配置管理:使用 ConfigMap、Secret 管理配置,避免将配置打包在镜像中。

日志标准输出:应用日志输出到标准输出和标准错误,便于容器运行时收集日志。

云原生是现代应用架构的方向,理解云原生的技术和理念,有助于构建可扩展、高可用的云原生应用。