虚拟化与云
虚拟化的必要条件:
- 安全:虚拟机程序可以完全掌控虚拟资源
 - 保真:虚拟机里的程序行为要跟在裸机上执行相同
 - 高效:虚拟机的代码不受虚拟机程序干涉
 
为了保证宿主机的安全性,虚拟机程序采用解释执行虚拟机发起的命令
另一方面,对于某些指令,则需要CPU的支持,才能支持虚拟化,如Intel的VT(虚拟化技术)

两者的区别在于第二类虚拟机程序运行在锁住操作系统之上
第一类的代表有ESX Server 第二类的代表则有 VMware
服务器虚拟化技术:
- Hypervisor也叫VMM(virtual machine monitor)
- 在虚拟程序上运行操作系统
 
 - Containers容器化技术
- 虚拟程序上直接运行程序,无操作系统
 
 
高效虚拟化技术

目前已有一些研究提出通过定义一个统一的虚拟化调用接口,然后操作系统直接使用这些虚拟化接口来进行半虚拟化或者全虚拟化,而虚拟化调用接口则和真正的硬件或者虚拟机程序打交道

在不支持虚拟化的平台上实现虚拟化
客户及的敏感指令调用会被模拟会对虚拟机程序的指令调用,硬件不会真正执行这些指令

虚拟化的开销
VT硬件虚拟化会产生大量陷入,而陷入会对缓存、TLB等造成不利影响
软件形式的虚拟化在诸如页表管理上则需要不小的开销
VMware 原理
- 虚拟化x86架构:通过决策算法模拟CPU指令或者直接执行
 - 客户操作系统为中心:针对特定操作系统做虚拟化支持
 - 虚拟硬件平台:通过将模拟前端硬件与后端实现硬件分离,进行硬件无关封装以物理硬件的虚拟化
 - 宿主操作系统作为驱动程序的寄生者,进行VMX与VMM的中间通信器
 

通过系统切换,将整个地址空间在宿主操作系统及VMM之间切换,这样VMM才能有对资源的完全掌控权限
虚拟化容器
chroot、namespaces、cgroups -> LXC -> Docker -> K8S
三方面的兼容性:
- ISA兼容:目标机器指令集兼容性
 - ABI兼容:目标系统或者依赖库的二进制兼容性
 - 环境兼容:配置文件 环境变量等
 
几种虚拟化技术:
- 指令集虚拟化:通过软件来模拟不同ISA架构的处理器工作过程,将虚拟机发出的指令转换为符合本机ISA的指令
 - 硬件抽象层虚拟化:使用软件来模拟硬件,或者直接将硬件直通到虚拟机使用
 - 操作系统层虚拟化:采用隔离手段,使得不同进程拥有独立的系统资源和资源配额 也就是容器化
 - 运行库虚拟化:使用软件翻译的方法来模拟系统,它以一个独立进程来代替操作系统内核来提供目标软件运行所需的全部能力 如WINE
 - 语言层虚拟化:由虚拟机将高级语言生成的中间代码转换为目标机器可以直接执行的指令
 
容器隔离
- 隔离文件:chroot
- 当某个进程经过chroot操作之后,它的根目录就会被锁定在命令参数所指定的位置,以后它或者它的子进程将不能再访问和操作该目录之外的其他文件
 
 - 隔离访问:namespaces
- 由内核直接提供的全局资源封装如文件 进程 用户 网络等信息,是内核针对进程设计的访问隔离机制
 
 - 隔离资源:cgroups
- 控制进程对资源的使用
 
 
容器封装
- 封装系统:LinuxX Containers
 - 封装应用:Docker
 - 封装集群:Kubernetes
 
基于容器构建系统
- 隔离:名称空间
 - 协作:基于同一个pod
 
这里在K8S中 相互协作的容器运行在同一个pod中 这个pod就是被调度的基本单位
K8S的协作 如果运行单个pod 那么系统是十分脆弱的 使用ReplicaSet等手段来保持住系统的状态
这种组件被称为控制回路:

应用为中心的封装
- Kustomize:使用一个配置文件描述配置文件
 - Helm与Chart:模仿Linux包管理器的思路去管理Kubernetes应用
 - Operator与CRD:把应用封装为另一种更高层次的资源,再把Kubernetes的控制器模式从面向于内置资源,扩展到了面向所有自定义资源
 - 开放应用模型
 
内存虚拟化
虚拟机作为一个中间层,需要维护客户操作系统与真实硬件内存页表的映射
- 嵌套页表的硬件扩展:由原来的虚拟页表-物理页表变成客户机虚拟页表-客户机物理页表-宿主机物理页表
 - 回收内存:这就需要虚拟机自己作为中间层,来管理内存
 
IO虚拟化
- IO MMU:现代硬件具备 IO MMU, 可以实现设备穿透(直接从物理硬件映射到虚拟机),也可以保证设备隔离
 - 设备域:用专门的一台虚拟机管理硬件,其他虚拟机通过这台虚拟机来使用硬件(半虚拟化)
 - 单根IO虚拟化:由IO设备本身提供虚拟化支持,通过提供VF(虚拟化函数)给虚拟机使用
 
虚拟装置
- 封装虚拟机,交付运行,跟现阶段的容器很像
 
多核CPU上的虚拟机
通过复用相同的内存,使用去重技术避免重复保存相同的数据,大体就是通过先判断内存块的散列值,然后再比对具体内容来判断是否能复用,当内存块被修改时,采取写时复制技术,复制出新的内存块给虚拟机使用
云
特征:
- 按需自助服务
 - 普适的网络访问
 - 资源池
 - 快速可伸缩
 - 服务可计量
 
云环境分类
- 混合云
 - 私有云
 - 公有云
 
上云好处
- 敏捷交付
 - 统一运维
 - 云安全
 - 弹性、按量付费
 - 稳定性
 - 全球性
 - 释放运维压力
 
云即服务
Iaas
- 虚拟化
 - 负载均衡
 - 自动扩展
 
通过声明式编程 从而能自动化基础架构
网络互通:
云存储:
从上往下封装程度越高
- 块设备
 - 文件系统
 - 对象存储
 
Paas
认证
- RAM 动态权限管理
 - SAML 2.0 身份联合登录
 - OAuth 2.0
 
云数据库
- 传统关系型
 - NoSQL
- DynamoDB
 - BigQuery
 - OceanBase
 
 
中间件
容器云
- docker
 - runc
 - k8s
 - mesos marathon
 - docekr swarm
 - cloud foundary
 
Saas
混合云
优势
- 可控 & 开箱即用
 - 周期性应用/试点应用
 - 业务高峰分流
 - 成本控制
 - 平滑转型
 
连接
入口分流
- CDN
 - SLB软件负载均衡器
 
安全
DDoS -> WAF -> SLB -> 系统安全
容灾多活
- 数据同步
 
技术难点
安全
- 跨数据中心的账号管理
 - 符合法律法规
 - 网络隔离
 
运维
- 统一发布
 - 统一监控
 - 资源调配
 
虚拟机迁移
停机并迁移数据很简单
另外一种方式是热迁移,也就是在虚拟机运行时,直接复制内存,当内存发生变更,将变更的内存再复制,直至双边一致,这跟数据库数据双写迁移原理是一样的
检查点
也就是虚拟机快照,快照就是复制内存、CPU状态等,但对于网络通信这种,则无法解决
云原生
虚拟化 -> 标准化 -> 自动化 -> 云计算 -> 云原生
云原生应用
原则
CICD
- 一个应用一份代码多次发布
 - 代码不可变 使用配置驱动应用
 - 开发、测试环境一致性
 
弹性
- 无状态进程
 - 同步并发
 - 快速启动优雅关闭
 
解耦
- 依赖明示
 - 配置和密码分离
 - 使用外部服务
 - 动态端口绑定
 
中台
- 日志流
- 直接到输出流 使用日志平台
 
 - 作业管理
- 分布式任务调度
 - 暴露接口 给外部触发
 
 - 监控遥测
 - API经济
- 每个系统都要有对外提供API的能力