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