Skip to content

云原生

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

云原生的核心要素

容器化

容器是一种轻量级的虚拟化技术,将应用和依赖打包在一起,保证应用在任何环境中一致运行。容器相比虚拟机启动快、资源占用少、部署灵活。

Docker 是最流行的容器运行时,Kubernetes 是最流行的容器编排平台。

服务网格

Service Mesh 将服务治理逻辑从服务代码中剥离,下沉到基础设施层。Service Mesh 处理服务间通信,提供服务发现、负载均衡、熔断降级、限流、链路追踪等功能。

Istio、Linkerd 是主流的 Service Mesh 实现。

声明式 API

声明式 API 描述期望状态,而不是如何达到期望状态。声明式 API 简化了应用管理,系统会自动将当前状态调整为期望状态。

Kubernetes 的 Deployment、Service、ConfigMap 都是声明式 API。

不可变基础设施

不可变基础设施是指基础设施创建后不再修改,需要变更时创建新资源替换旧资源。不可变基础设施避免了配置漂移,减少了配置错误。

容器的镜像就是不可变基础设施的代表,镜像创建后不再修改,需要变更时构建新镜像。

微服务

微服务架构将单体应用拆分为多个小型服务,每个服务独立开发、部署、扩展。微服务架构提高了系统的灵活性和可扩展性,但也增加了系统的复杂性。

云原生的优势

弹性伸缩:根据负载自动扩缩容,提高资源利用率。

高可用性:应用多副本部署,故障时自动重启或迁移。

快速迭代:持续集成、持续交付,快速发布新功能。

资源效率:容器共享操作系统内核,资源占用少,提高服务器利用率。

可移植性:应用打包在容器中,可以在任何支持容器的环境中运行。

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

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

基准代码:一份基准代码,多次部署。

依赖:显式声明和隔离依赖。

配置:环境变量存储配置。

后端服务:后端服务视为附加资源。

构建、发布、运行:严格分离构建和运行。

进程:无状态进程。

端口绑定:通过端口绑定提供服务。

并发:通过进程模型扩展。

易处理:快速启动和优雅关闭。

开发环境与线上环境等价:保持开发、测试、生产环境一致。

日志:日志作为事件流。

管理员进程:一次性管理员进程。

###pets vs Cattle

Pets(宠物):传统服务器,精心呵护、有名字、需要手动管理。

Cattle(牲口):云原生服务器,批量管理、无名字、自动替换。

云原生应用应该是 Cattle,而不是 Pets。

云原生的技术栈

容器运行时: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 管理配置,避免将配置打包在镜像中。

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

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