作者:禅与计算机程序设计艺术
1.简介
云原生(Cloud Native)是一个开放且社区驱动的项目,它定义了一组架构原则、最佳实践和工具集,这些原则、实践和工具围绕业务需求和工程实践而设计,可用于开发人员在构建和运行分布式系统时更加顺畅地交付可靠的软件。云原生可以帮助组织提高效率、减少成本并实现创新。其核心理念是通过建立一套云原生应用开发模型来进行组织变革,从而促进敏捷的开发、测试和部署流程。
容器化(Containerization)是一种虚拟化技术,可以将应用程序及其依赖关系打包到一个独立的“容器”中,隔离互相影响,具有轻量级、灵活性、弹性和易于管理等特点。
Kubernetes(K8s)是一种开源的容器编排引擎,可以自动化部署、扩展和管理容器化的应用。K8s 提供了如自动伸缩、负载均衡、服务发现、配置和存储等集群级别功能,还可以支持众多先进的应用编程接口(API)。
微服务(Microservices)是一个轻量级的、松耦合的、面向服务的架构模式,由一组小型服务组成,每个服务都负责单独的业务功能,通讯采用轻量级的 API 网关。该架构模式能够有效地应对快速增长的业务需求,并通过自动化部署、弹性伸缩和其他工具来改善开发者和管理员的工作效率。
1.1 云原生
1.1.1 什么是云原生?
云原生(Cloud Native)是一个开放且社区驱动的项目,它定义了一组架构原则、最佳实践和工具集,这些原则、实践和工具围绕业务需求和工程实践而设计,可用于开发人员在构建和运行分布式系统时更加顺畅地交付可靠的软件。云原生可以帮助组织提高效率、减少成本并实现创新。其核心理念是通过建立一套云原生应用开发模型来进行组织变革,从而促进敏捷的开发、测试和部署流程。
云原生的主要目标包括以下几点:
- 可移植性:应用应该可以在任何地方运行,无论是在公共云、私有云、混合云或本地数据中心中。
- 可观察性:应用的行为、状态、事件应该可以被全面监控。
- 弹性伸缩:应用应该可以根据需求和预算进行弹性伸缩。
- 韧性:应用应该能够处理各种故障,不至于让整个系统瘫痪。
- 服务意识:应用应该通过精心设计和开发来充分利用云平台的能力。
1.1.2 为什么要关注云原生?
随着云计算的普及和发展,越来越多的公司开始转向云端,采用云原生的方法来构建和运维他们的应用,这是由于:
- 更高的弹性:基于云端架构,应用可以快速扩容或收缩,因此可以快速响应业务变化。
- 降低运营成本:使用云平台可以节省大量的人力和物力,降低运营成本。
- 技术创新:云原生方法能够带来前所未有的便利,比如零停机时间部署、按需伸缩以及无限水平扩展能力。
另外,由于云原生架构的设计思想和模式倡导者包括 Google、Facebook、微软、亚马逊等公司,因此越来越多的开发者和企业也加入到了这个行列中,并且云计算领域也越来越火热,有很多大咖云厂商站出来给大家带来云的最新最潮的信息。因此,了解一下云原生、云计算的基本知识总是很有必要的。
1.1.3 云原生的主要特征
云原生由多个开源的云原生相关项目组成,这些项目有:
- Kubernetes:用于自动化部署、扩展和管理容器化的应用,可以提供诸如自动伸缩、负载均衡、健康检查等集群级别功能。
- Prometheus:用于监测和报告集群中的指标。
- gRPC:用于构建微服务架构的通信框架。
- Helm:用于定义、安装和升级 Kubernetes 的应用。
- Operator Framework:用于扩展 Kubernetes 资源。
- OpenTracing:用于跟踪和追踪微服务调用。
- Linkerd:用于连接、保护、控制和监视服务之间的流量。
- Envoy:用于代理微服务间的网络请求。
- Fluentd:用于收集、解析和发送日志。
- NATS:用于轻量级消息传递。
为了满足云原生的需求,云原生相关的项目开发者们采用了一套技术栈,包括 Docker 和容器化应用的一些设计模式,如 sidecar 模式、ambassador 模式和 adapter 模式,这使得容器化应用可以很好地和云环境整合。除了上述项目外,还有一些第三方组件如 istio、linkerd、Consul、etcd、coredns、Jaeger、Fluentd 等也会成为云原生的重要组成部分。
1.2 容器化
1.2.1 什么是容器化?
容器化(Containerization)是一种虚拟化技术,可以将应用程序及其依赖关系打包到一个独立的“容器”中,隔离互相影响,具有轻量级、灵活性、弹性和易于管理等特点。容器可以在不同的硬件之间迁移,容器之间也可以进行通信和协作。容器化的一个主要优点就是隔离性。
1.2.2 为什么要使用容器化?
容器化技术有如下几个优点:
- 降低硬件成本:容器可以分散到异构环境下,利用成本较低的机器即可实现部署。
- 提高资源利用率:容器之间共享同样的基础设施资源,不会互相影响。
- 更快启动速度:容器启动速度比传统虚拟机更快,因为其内部已经包含了完整的运行环境。
- 标准化部署方式:容器具有统一的标准,可以用于任何云、On-Premises、私有集群或裸机服务器。
- 安全性:容器化的应用更容易受到攻击,但隔离性使得攻击者难以入侵。
- 方便移植性:容器可以跨平台移植,只需要重新编译镜像即可运行。
- 滚动发布、蓝绿发布等功能:容器化的应用可以实现滚动发布、蓝绿发布等特性。
- 更好的可观测性:容器化的应用可以提供更多的内置监控功能。
1.2.3 容器化架构
容器化架构(Container Architecture)是指基于 Docker 和容器技术的云原生应用架构,由 Docker 引擎或容器运行时 + 类 Kubernetes 的抽象层组成。主要分为三个层次:
- 操作系统层:宿主机上的操作系统内核,包括 Linux 内核、Windows Server 等。
- 虚拟化层:管理底层硬件资源,包括 CPU、内存、磁盘、网络等。
- 容器层:封装应用和服务,包括镜像、容器、仓库等。
其中,Docker 是目前最流行的容器运行时之一,通过它可以创建、运行、分享和使用容器,并管理它们的生命周期。而 Kubernetes 是容器编排引擎,通过它可以自动调配和管理容器化的应用。两者结合,可以组成一个完整的容器架构。
1.3 Kubernetes
1.3.1 什么是 Kubernetes?
Kubernetes(K8s)是一种开源的容器编排引擎,可以自动化部署、扩展和管理容器化的应用。K8s 提供了如自动伸缩、负载均衡、服务发现、配置和存储等集群级别功能,还可以支持众多先进的应用编程接口(API)。
1.3.2 为什么要使用 Kubernetes?
Kubernetes 有如下几个优点:
- 简单性:只需要关注应用本身,而不需要关注底层的复杂细节。
- 可靠性:自动化副本控制、滚动更新和回滚机制,确保应用始终处于可用状态。
- 扩展性:可以通过增加节点来横向扩展集群,无缝对接云服务商的弹性计算资源。
- 灵活性:支持多种调度策略、亲和性规则和自定义控制器,满足不同场景下的调度需求。
- 自动化:通过声明式 API 来描述集群的 desired state,由控制器自动完成集群当前 state 的维护。
1.3.3 Kubenetes 架构
Kubernetes 集群通常由 Master 和 Node 两个主体组成,Master 负责管理集群,Node 负责提供计算资源。
- Kubelet:集群中的每个节点上都会运行一个 kubelet 代理,它会监视 master node,获取 pod 的信息,并执行指令。
- kube-proxy:kube-proxy 是一个 network proxy,它运行在所有节点上,用来维护网络规则和访问控制列表(ACL),在 Service 对象中维护一份 services IP 与 Pod 映射表。
- etcd:用于保存所有集群数据的 key-value 数据库。
- kube-apiserver:kube-apiserver 是 Kubernetes 中枢器(control plane)的前端代理,它接收并验证各项 kube-apiserver 发出的请求,并做出决策指导kubelet 执行操作。
- Controller Manager:Controller manager 是 Kubernetes 中枢器的核心部件,它监控集群状态,根据实际情况调整期望状态,确保集群的稳定运行。
- Scheduler:Scheduler 是决定将 pod 调度到哪个 worker node 上去的组件,它依据调度策略和资源限制,决定把一个 pod 分配到某个 node 上。
- Control Plane Components:除了 apiserver 以外,其它组件是 Kubernetes 中枢器的组成部分,包括 controller manager、scheduler、etcd、cloud provider、DNS service、service proxy等。
1.4 微服务
1.4.1 什么是微服务?
微服务(Microservices)是一个轻量级的、松耦合的、面向服务的架构模式,由一组小型服务组成,每个服务都负责单独的业务功能,通讯采用轻量级的 API 网关。该架构模式能够有效地应对快速增长的业务需求,并通过自动化部署、弹性伸缩和其他工具来改善开发者和管理员的工作效率。文章来源:https://uudwc.com/A/oLROJ
1.4.2 为什么要使用微服务架构?
微服务架构有如下五个主要优点:文章来源地址https://uudwc.com/A/oLROJ
- 规模可扩展性:应用按照业务领域划分为多个服务,服务可以独立部署,可以按需增加,方便应对业务增长。
- 冗余考虑:服务之间采用异步通信,避免单个服务的失败导致整个系统不可用。
- 易于开发和维护:微服务化使得开发团队可以更专注于单一的服务上,每一个微服务的代码库和架构都是高度可复用的。
- 测试更容易:因为微服务都是相互独立的,所以单元测试和集成测试可以更准确地测试各个服务。
- 微服务的理念鼓励模块化开发:模块化开发可以提升研发效率、减少沟通成本,模块间通过异步通信可以避免过度耦合,容易理解。
1.4.3 微服务架构演进
微服务架构演进阶段:
- 单体应用阶段:单体应用即所有的功能都放在一个应用中,应用拆分困难,开发效率低,部署和运维难度大。
- 垂直拆分阶段:针对业务领域进行垂直拆分,例如支付系统、订单系统、用户系统。
- 水平拆分阶段:单个业务系统被拆分为多个子系统,系统之间采用异步通信,通过网关聚合调用。
- 微服务阶段:微服务架构模式是将单个业务系统拆分为多个服务,服务之间采用松耦合的通讯协议,每个服务可以独立部署。
- 前后端分离阶段:前后端分离意味着前端和后端服务分别部署,前后端独立开发和迭代。
- 服务治理阶段:服务治理层是云原生应用架构的一部分,包含注册中心、配置中心、服务网格、监控中心、限流熔断等。
2.核心概念
2.1 容器
2.1.1 什么是容器?
容器(Container)是一个轻量级的、可移植的、自包含的、可执行的软件打包格式。它是一个标准化单元,其中包括软件运行所需的所有文件,如代码、运行时、库、设置、环境变量等。一般来说,容器是基于操作系统虚拟化技术的,为应用程序提供了操作系统级别的虚拟化,运行在容器中的应用具有极高的隔离性与安全性。
2.1.2 容器和虚拟机的区别
容器和虚拟机最大的差别就在于,容器属于操作系统虚拟化范畴,而虚拟机是硬件虚拟化范畴。
容器
-
容器比虚拟机轻量:容器的大小只有镜像的几十兆,所以启动和停止速度非常快。同时,由于容器没有虚拟机那样占用物理资源,因此可以部署更多的容器。
-
容器没有性能损耗:由于容器直接运行于宿主机的内核,无需额外占用 CPU 和内存资源,所以容器可以承载密集型或者短事务的任务。
-
容器间的资源隔离:容器之间资源相互独立,因此可以使用更多的资源,因此可以在同一台主机上运行更多容器。
-
容器利用起来更灵活:容器的镜像与部署方式使得它可以实现应用程序的快速部署、弹性伸缩与迁移。
-
容器天然适合云计算:容器技术提供了轻量级、标准化、隔离的容器环境,这对于在公有云、私有云以及混合云中部署应用程序尤其有用。
虚拟机
-
虚拟机拥有自己的操作系统:虚拟机有自己的操作系统,不同虚拟机之间彼此独立,可以任意切换,因此隔离性很强。
-
虚拟机性能损失:虚拟机使用硬件资源,因此启动和关闭速度慢,而且占用内存资源也比较多。
-
虚拟机具有完整的操作系统:虚拟机有自己完整的操作系统,包括内核、库和各种应用。
-
虚拟机适合长期部署:在硬件资源有限的情况下,可以选择购买具有足够性能的服务器部署虚拟机。但是,在某些情况下,虚拟机资源占用过高,无法运行。
-
虚拟机更贵:每台服务器上部署虚拟机,硬件成本较高,而且每个虚拟机都需要额外的磁盘空间。
2.2 容器化
2.2.1 为什么要使用容器化?
容器化可以帮助解决以下几个问题:
- 降低硬件成本:容器可以分散到异构环境下,利用成本较低的机器即可实现部署。
- 提高资源利用率:容器之间共享同样的基础设施资源,不会互相影响。
- 更快启动速度:容器启动速度比传统虚拟机更快,因为其内部已经包含了完整的运行环境。
- 标准化部署方式:容器具有统一的标准,可以用于任何云、On-Premises、私有集群或裸机服务器。
- 安全性:容器化的应用更容易受到攻击,但隔离性使得攻击者难以入侵。
- 方便移植性:容器可以跨平台移植,只需要重新编译镜像即可运行。
- 滚动发布、蓝绿发布等功能:容器化的应用可以实现滚动发布、蓝绿发布等特性。
- 更好的可观测性:容器化的应用可以提供更多的内置监控功能。
2.2.2 容器化架构
容器化架构(Container Architecture)是指基于 Docker 和容器技术的云原生应用架构,由 Docker 引擎或容器运行时 + 类 Kubernetes 的抽象层组成。主要分为三个层次:
- 操作系统层:宿主机上的操作系统内核,包括 Linux 内核、Windows Server 等。
- 虚拟化层:管理底层硬件资源,包括 CPU、内存、磁盘、网络等。
- 容器层:封装应用和服务,包括镜像、容器、仓库等。
其中,Docker 是目前最流行的容器运行时之一,通过它可以创建、运行、分享和使用容器,并管理它们的生命周期。而 Kubernetes 是容器编排引擎,通过它可以自动调配和管理容器化的应用。两者结合,可以组成一个完整的容器架构。
2.3 Kubernetes
2.3.1 什么是 Kubernetes?
Kubernetes(K8s)是一种开源的容器编排引擎,可以自动化部署、扩展和管理容器化的应用。K8s 提供了如自动伸缩、负载均衡、服务发现、配置和存储等集群级别功能,还可以支持众多先进的应用编程接口(API)。
2.3.2 为什么要使用 Kubernetes?
Kubernetes 有如下几个优点:
- 简单性:只需要关注应用本身,而不需要关注底层的复杂细节。
- 可靠性:自动化副本控制、滚动更新和回滚机制,确保应用始终处于可用状态。
- 扩展性:可以通过增加节点来横向扩展集群,无缝对接云服务商的弹性计算资源。
- 灵活性:支持多种调度策略、亲和性规则和自定义控制器,满足不同场景下的调度需求。
- 自动化:通过声明式 API 来描述集群的 desired state,由控制器自动完成集群当前 state 的维护。
2.3.3 Kubenetes 架构
Kubernetes 集群通常由 Master 和 Node 两个主体组成,Master 负责管理集群,Node 负责提供计算资源。
- Kubelet:集群中的每个节点上都会运行一个 kubelet 代理,它会监视 master node,获取 pod 的信息,并执行指令。
- kube-proxy:kube-proxy 是一个 network proxy,它运行在所有节点上,用来维护网络规则和访问控制列表(ACL),在 Service 对象中维护一份 services IP 与 Pod 映射表。
- etcd:用于保存所有集群数据的 key-value 数据库。
- kube-apiserver:kube-apiserver 是 Kubernetes 中枢器(control plane)的前端代理,它接收并验证各项 kube-apiserver 发出的请求,并做出决策指导kubelet 执行操作。
- Controller Manager:Controller manager 是 Kubernetes 中枢器的核心部件,它监控集群状态,根据实际情况调整期望状态,确保集群的稳定运行。
- Scheduler:Scheduler 是决定将 pod 调度到哪个 worker node 上去的组件,它依据调度策略和资源限制,决定把一个 pod 分配到某个 node 上。
- Control Plane Components:除了 apiserver 以外,其它组件是 Kubernetes 中枢器的组成部分,包括 controller manager、scheduler、etcd、cloud provider、DNS service、service proxy等。
2.4 微服务
2.4.1 什么是微服务?
微服务(Microservices)是一个轻量级的、松耦合的、面向服务的架构模式,由一组小型服务组成,每个服务都负责单独的业务功能,通讯采用轻量级的 API 网关。该架构模式能够有效地应对快速增长的业务需求,并通过自动化部署、弹性伸缩和其他工具来改善开发者和管理员的工作效率。
2.4.2 为什么要使用微服务架构?
微服务架构有如下五个主要优点:
- 规模可扩展性:应用按照业务领域划分为多个服务,服务可以独立部署,可以按需增加,方便应对业务增长。
- 冗余考虑:服务之间采用异步通信,避免单个服务的失败导致整个系统不可用。
- 易于开发和维护:微服务化使得开发团队可以更专注于单一的服务上,每一个微服务的代码库和架构都是高度可复用的。
- 测试更容易:因为微服务都是相互独立的,所以单元测试和集成测试可以更准确地测试各个服务。
- 微服务的理念鼓励模块化开发:模块化开发可以提升研发效率、减少沟通成本,模块间通过异步通信可以避免过度耦合,容易理解。