作者:William 孟祥龙,腾讯 CDG 系统架构师,从事云原生技术赋能金融科技。
本文是一篇云原生的关键知识科普,希望给大家提供一扇云原生的“窗户”,传达三个目标:1、透过窗户看到一棵大树代表:云原生的蓝图全貌;2、树上会有很多核心树干代表:云原生的关键技术;3、希望树干上能摘到果实代表:云原生对我的启发。
开始阅读文章前,请角色切换:设想你作为一位中小型 IT 公司 CTO,面对云原生技术决策,你需要回答两个问题:
1、为什么需要上云?
2、上云有何弊端?
作为一家公司的技术决策者,必须理解上云的利与弊,并结合公司各阶段发展目标给出最适合的技术方案。
1 云原生-概述
1.1 云原生-定义
云原生的定义,业界也是“百家争鸣”各持观点,从技术视角理解云原生会相对清晰。云原生的关键技术包括:
• 微服务架构:服务与服务之间通过高内聚低耦合的方式交互;
• 容器:作为微服务的最佳载体,提供了一个自包含的打包方式;
• 容器编排:解决了微服务在生产环境的部署问题;
• 服务网络:作为基础设施,解决了服务之间的通信;
• 不可变基础:设施提升发布效率,方便快速扩展;
• 声明式 API:让系统更加健壮;
命令式 API:可以直接发出让服务器执行的命令,例如:“运行容器”、”停止容器”等;
声明式 API:可以声明期望的状态,系统将不断地调整实际状态,直到与期望状态保持一致。
• DevOps:缩短研发周期,增加部署频率,更安全地方便:
Culture :达成共识
Automation:基础设施自动化
Measurement:可度量
Sharing:你中有我,我中有你
【私人观点】
云原生的定义:应用因云而生,即云原生。
应用原生被设计为在云上以最佳方式运行,充分发挥云的优势,是上云的最短路径。
1.2 云原生-技术生态
1.3 云原生-关键技术
云原生关键技术包括:微服务,容器,容器编排,服务网络,不可变基础,声明式 API。
1.3.1 微服务
微服务是一种用于构建应用的架构方案。
将一个复杂的应用拆分成多个独立自治的服务,服务与服务间通过“高内聚低耦合”的形式交互。
微服务典型架构包括:
服务重构:单体改造成符合业务的微服务架构;
服务注册与发现:微服务模块间的服务生命周期管理;
服务网关:身份认证、路由服务、限流防刷、日志统计;
服务通信:通信技术方案如,RPC vs REST vs 异步消息;
可靠性:服务优雅降级,容灾,熔断,多副本。
1.3.2 容器
容器是一种打包应用的方式,可以打包应用中的所有软件和软件所依赖的环境,并可实现跨平台部署。
容器关键技术:namespac 视图隔离,cgroups 资源隔离 ,Union File System 联合文件系统。
容器优势:
更高效的利用资源;
更快速的启动时间;
一致性的运行环境。
1.3.3 容器编排
容器编排包括:自动化管理和协调容器的系统,专注于容器的生命周期管理和调度。
核心功能:
容器调度:依据策略完成容器与母机绑定;
资源管理:CPU、MEM、GPU、Ports、Device;
服务管理:负载均衡、健康检查。
1.3.4 服务网格
服务网格(Service Mesh)是致力于解决服务间通讯的基础设施层。
Service Mesh 应对云原生应用的复杂服务拓扑,提供可靠的通信传递;
通过一组轻量级网络代理(Sidecar proxy),与应用程序代码部署在一起来实现,且对应用程序透明。
Service Mesh 特点:
应用程序间通讯的中间层;
轻量级网络代理,应用程序无感知;
解耦应用的重试、监控、追踪、服务发现。
Service Mesh 主流组件:Istio、MOSN(Modular Open Smart Network)Linkerd。
1.3.5 不可变基础设施
不可变基础设施(Immutable Infrastructure)(宠物 VS 牲畜)
任何基础设施实例(服务器、容器等各种软硬件)一旦创建之后便成为一种只读状态,不可对其进行任何更改;
如果需要修改或升级实例,唯一方式是创建一批新实例以替换。
不可变基础设施的优势
提升发布应用效率;
没有雪花服务器;
快速水平扩展。
1.3.6 声明式 API
命令式 API:可直接发出让服务器执行的命令,例如:“运行容器”、“停止容器”等;
声明式 API:可声明期望的状态,系统将不断地调整实际状态,直到与期望状态保持一致。
为什么声明式使系统更加健壮?
可以类比理解成自动化工程学的闭环自适应模型。
1.3.7 DevOps
DevOps 目标 :缩短开发周期,增加部署频率,更可靠地发布。
从历史上开发和运维相对孤立到开发和运维之间建立合作,可以增加信任,更快速地发布新版本。
DevOps 是一组过程,方法和系统的统称包括:
Culture:
文化是 DevOps 中的第一成功要素。
由于目标不同,开发和运维形成一堵墙,DevOps 通过建立开发和运维之间合作和沟通的文化来消除墙。
Automation:
自动化软件的开发和交付,通常包含持续集成,持续交付和持续部署,云原生时代还包括基础架构的自动化,即 IaC(Infrastructureas code)。
Measurement:
度量尤其重要,通过客观的测量来确定正在发生的事情的真实性,验证是否按预期进行改变。并为不同职能部门达成一致建立客观基础。
Sharing:
开发和运维团队之间长期存在摩擦的主要原因是缺乏共同的基础。
开发参与运维值班,参与软件的部署和发布,运维参与架构设计。
2 容器-Docker
2.1 Docker 概述
为什么学习容器技术?
云时代从业者:Docke