云原生
云原生(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 管理配置,避免将配置打包在镜像中。
日志标准输出:应用日志输出到标准输出和标准错误,便于容器运行时收集日志。
云原生是现代应用架构的方向,理解云原生的技术和理念,有助于构建可扩展、高可用的云原生应用。