什么是云原生?
云原生是一种构建和运行应用程序的方法,它利用云计算的优势,使应用程序能够更好地适应云环境的动态性、弹性和分布式特性。云原生技术体系包含容器、容器编排、微服务、服务网格、不可变基础设施等一系列技术和理念。
- 弹性伸缩:能够根据业务负载的变化自动调整资源,实现快速的扩缩容,以确保应用程序始终能够以最佳性能运行
- 高可用性:通过多副本、故障转移等机制,保证应用程序在部分组件出现故障时仍能正常运行,提供持续的服务
- 敏捷开发与部署:支持快速迭代和频繁部署,开发团队可以更高效地进行应用程序的开发、测试和上线
- 资源高效利用:容器化技术使得多个应用程序可以共享底层基础设施资源,提高资源的利用率,降低成本
云原生代表技术
容器
一般我们说的“容器”(LinuxContainer,LXC),都是 “Linux容器” 。开源解决方案供应商红帽官网给出的容器定义:Linux® 容器是与系统其他部分隔离开的一系列进程。运行这些进程所需的所有文件都由另一个镜像提供,这意味着从开发到测试再到生产的整个过程中,Linux 容器都具有可移植性和一致性。因而,相对于依赖重复传统测试环境的开发渠道,容器的运行速度要快得多。
容器提供进程级的隔离,可以将操作系统管理的资源划分到相互隔离的组中,在相互隔离的组之间解决资源使用存在冲突的问题。比如 APP1 只能在 centOS 上运行,APP2 只能在 Ubuntu 上运行,而同一个操作系统同时运行 APP1 和 APP2 就产生冲突,容器技术则恰恰可以解决这类问题。
Docker
Docker 项目通过容器镜像,直接将一个应用运行所需的完整环境,即:整个操作系统的文件系统也打包了进去。Docker 项目大大降低了容器技术的使用门槛,轻量级,可移植,虚拟化,语言无关,写了程序扔上去做成镜像可以随处部署和运行,开发、测试和生产环境彻底统一了,还能进行资源管控和虚拟化。
典型的 Docker 平台包括 Kubernetes、Openshift V3 等。一句话解释 Docker?
没有集装箱就没有全球化,Docker 就是 IT 世界里的集装箱。
Kubernetes
有了容器,就需要编排管理容器的生命周期,K8s 就是一个通用容器编排调度器,用于编排管理容器的生命周期。
一个 K8s 集群,主要包括两个部分:一个 Master 节点和一群 Node 节点。
- Master(主节点):控制 K8s 节点的机器,也是创建作业任务的地方
- Node(节点):这些机器在 K8s 主节点的控制下执行被分配的任务,一个 Node 可能会运行多个 Pod,Pod 中的容器共同协作来提供某种服务
- Pod:K8s 中最小的可部署和可管理的计算单元,由一个或多个容器构成的集合,作为一个整体被部署到一个单一节点。同一个 Pod 中的容器共享 IP 地址、进程间通讯(IPC)、主机名以及其它资源。Pod 将底层容器的网络和存储抽象出来,使得集群内的容器迁移更为便捷
- Replicationcontroller:控制一个 Pod 在集群上运行的实例数量,用于确保 Pod 的副本数量始终保持在指定的数量
- Service:用来暴露 Pod 的一种抽象机制,可以把它想象成一个 “网关” 或者 “地址簿”。因为 Pod 可能会在不同的 Node 上被创建、销毁或者重新调度,它们的 IP 地址是动态变化的。而 Service 为 Pod 提供了一个固定的 IP 地址和 DNS 名称,其他应用程序可以通过这个固定的地址来访问 Pod 提供的服务,而不需要关心 Pod 具体在哪个节点上以及其 IP 地址的变化
- Kubelet:这个守护进程运行在各个工作节点上,负责获取容器列表,保证被声明的容器已经启动并且正常运行
K8s 的出现与其说是从最初的容器编排解决方案开始,倒不如说是为了解决应用上云(即云原生应用)这个难题。
微服务
微服务的核心是将传统的大单体应用拆为更小的组件或模块,组件或模块就叫微服务。这个拆分是一个纵向的拆分,需要做到从底层的基础设施 → 数据库 → 应用中间件 → 软件应用部署包都能做到完全独立的一套,尽量实现彻底的 松耦合。同时,各个微服务之间又能通过轻量的 http rest 接口进行交互和协同。核心就两点:大的单体要拆分,晓得微服务接口要通过轻量的 http rest 接口协同
IaaS、PaaS 和 SaaS
IaaS(Infrastructure-as-a-Service,基础设施即服务)
提供给消费者的服务是对所有设施的利用,包括处理、存储、网络和其它基本的计算资源,用户能够部署和运行任意软件,包括操作系统和应用程序。主要功能就是将底层的硬件资源以服务的方式对外暴露,为上层提供服务。
IaaS 模式下,只提供云计算服务的基础设施,用户可以根据自己的需求在云端租用服务器、存储空间、网络带宽等基础设施,就像在本地拥有自己的机房一样,但无需实际购买和维护硬件设备。
适用于对基础设施有高度控制权和定制化需求的用户,如大型企业的自有数据中心迁移到云端、需要自行安装和配置操作系统及软件的开发团队等。
PaaS(Platform-as-a-Service,平台即服务)
在 IaaS 的基础上,提供一个完整的开发和运行平台,包括操作系统、数据库、中间件、开发工具等。用户可以在这个平台上快速开发、测试和部署应用程序,无需关注底层基础设施的管理和维护。
PaaS 平台为开发者提供了一系列的开发工具和框架,比如常见的编程语言运行环境(像 Java、Python 等)、数据库管理系统(如 MySQL、Oracle),还有各种中间件等。开发者不需要自己在本地电脑或服务器上安装和配置这些软件,直接在 PaaS 平台上就可以开始编写代码开发应用程序。
当开发者把应用程序开发好后,可以很方便地将其部署到 PaaS 平台上。平台会自动处理应用程序运行所需的各种资源配置,比如服务器的分配、网络设置等,开发者不用像以前那样手动去配置这些复杂的环境,只需要简单操作几步就能让应用程序上线运行。
PaaS 平台还承担了应用程序的运维工作。它会自动监控应用的运行状态,比如查看服务器的性能指标、应用的响应时间等。如果发现问题,平台能自动进行一些处理,像自动扩展服务器资源来应对访问量的突然增加,或者在出现故障时自动进行恢复。开发者不用专门去关注服务器是不是出故障了、软件是不是需要更新等问题,平台都能帮着处理好。
SaaS(Software-as-a-Service,软件即服务)
直接提供软件应用程序服务,用户通过互联网访问和使用软件,无需在本地安装和维护软件。软件供应商负责软件的部署、升级和维护等工作,用户只需按照使用量或订阅模式支付费用。