云原生可以理解为一种软件开发和部署的方法论,目的是提供高度可扩展、可伸缩、可观测、可维护、自动化、高稳定性的应用程序。
云原生应用
一种构建和部署在云环境中的应用程序,基于云环境的特性,实现高效的开发、部署和运维。特点包括:
- 扩缩容: 微服务架构可以使应用根据负载的变化自动扩展和收缩,以适应不同的工作负载需求。
- 发布自动化: 借助DevOps、持续集成等方式,实现应用配置、部署等自动化。提高了迭代速度和发布效率。
- 自愈能力: 借助声明式 API、不可变基础设施、Kubernetes 的自愈能力,云原生应用可以实现故障的快速隔离和修复,极大地提升了云原生应用的稳定性和容错能力。
- 可观测: 借助借助云原生中的可观测技术栈(Prometheus、Elastic等),监控云原生应用程序,及时感知和预知故障点,提升产品的稳定性和使用体验。
- 开放标准和互操作性: 没太理解
云原生核心技术栈
云原生核心技术栈,都是以 Kubernetes 为基石来构建的。
- 容器: 以 Kubernetes 作为资源编排调度引擎,提供容器化的计算资源。
- 微服务: 一种软件架构思想,用来构建功能独立且可独立开发、部署、维护的云原生应用。微服务框架:Spring Cloud、go-micro等。
- 服务网格: 在 kubernetes 之上,作为服务间通信的底座,提供服务治理能力。
- 声明式API: 一种编程模型,其中开发人员只需描述所需的结果,而不需要详细指定如何实现。
- 不可变基础设施: 一种新的软件部署模式,应用实例一旦被创建,便只能重建不能更新,是现代运维的基础。
- DevOps: 还没太理解这个的作用。
微服务
将一个大型应用程序按照功能模块拆分成多个独立自治、边界明确的微服务。这种松耦合的架构通过REST、RPC等形式的接口进行通信。
有3个主要特点:单一职责、独立自治、轻量的通信协议。
这种架构的优点在于,可以简化应用复杂度、简化部署,具备可扩展、高容错;技术异构性,也即对外接口不变的前提下,可以进行升级优化。但同时,复杂的依赖链路可能造成一些测试上的问题,以及服务雪崩效应。
容器
代表项目就是Docker。
容器编排(kubernetes)
业界有很多优秀的容器编排技术,如kubernetes、docker swarm等,但k8s成为容器编排的事实标准。简单概括一下k8s架构: static001.geekbang.org/resource/im…
master节点的组件:
- Kube API Server:资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制;
- Kube Scheduler:负责资源调度,按照既定策略将pod调度到相应节点;
- Controller Manager:负责维护集群状态;
woker节点的组件:
- Kubelet:负责维护容器的生命周期,同时也负责 volume(CVI)和网络(CNI)的管理;
- kube-proxy:网络代理,维护节点上的网络规则,它允许从集群的内部或外部网络与 Pod 进行网络通信,并负责为 Service 提供集群内部的服务发现和负载均衡。
- Container Runtime:负责镜像管理、Pod和容器的真正运行,默认为docker。
Serverless
一种软件系统的思想,即:用户无需关注底层资源,仅关注业务开发就可以了。核心特点:弹性计算能力、零运维、按量计费。
持续集成和持续交付(CI/CD)
通过自动化的手段,快速执行代码检查、测试、构建、部署等,确保应用可以快速迭代升级。
DevOPs
用于促进开发和QA之间的沟通、协作与整合。需要CI/CD自动化工具和流程的支持。
服务网格(Service Mesh)
问题背景:众多微服务需要之间以及与外部通信,如何管理这些连接关系,并保证通信安全可用?
服务网格作为基础设施,独立出一个网络层,提供服务发现、负载均衡、安全认证、流量控制和故障恢复等功能。使得微服务无需关注网络通信的细节。
优秀的开源项目:Istio、Linkerd
Istio
简介:通过注入的sidecar中转流量。通过sidecar实现认证、限流等功能,可通过控制面配置实现服务治理。sidecar通过Envoy Proxy实现
控制面核心组件:
- Pilot:主要负责管理sidecar实例,提供服务发现、流量管理以及弹性功能。
- Citadel:安全组件,负责服务的密钥和数字证书管理。
- Galley:配置中心。
不可变基础设施
思想:一个应用程序的实例,一旦被创建,就会进入只读的状态,后面如果想变更这个应用程序的实例,只能重新创建一个新的实例。
声明式API
一种编程模式,声明式API主要关注目的而非实现逻辑。系统会根据声明的描述,自动推导出实现的步骤和逻辑。例如在k8s中修改deployment的副本数。具体操作由k8s自己完成。
Note
持续集成:是频繁地将代码集成到共享的主分支中,并对每次集成进行自动化构建和测试。类似于aihc的代码开发方式。
CNCF全景图:landscape.cncf.io/