云计算与虚拟化
云计算介绍
- 现代社会生产生活都需要资源
- 比如说工业社会的水电资源
- 资源的获取方式
- 靠天吃饭
- 靠人集中、分散的生产资源
- 自己发电、自己筑坝
信息时代计算资源是最主要的生产力
- 主机时代、网络时代
- 互联网企业的业务系统不断膨胀,由于单台服务器运算能力比较有限,无法承担公司的业务。这时候就将多个单台服务器资源整合到一起,通过云计算的技术将多台计算机的计算资源整合在一起,成为一个大的资源池。
- 这么大量的资源,我不是时时刻刻都需要使用这么大的计算资源,从而就造成了很长时间内这么大的计算资源都浪费了。
集中和分散。计算机刚出现的时候主机时代,计算资源是集中化的;后来每个人都有着自己的计算设备,可以用自己的电脑处理业务,这时候的计算资源是分散的;随着业务的发展,单台计算机和几台计算机都不足以支撑业务的时候,资源就再次被集中起来。到底是集中还是分散,并没有说哪个更好,只是按照时代、市场和业务发展的需要对计算资源使用方式的需求,决定了技术发展的走向。
量子计算可能颠覆一切。一台量子计算机的计算能力非常强,每个人都有量子计算机,这时候可能又回归到了资源分散部署的时代。
亚马逊的云服务
虚拟化介绍
在很多的大企业里面,我们花了大价钱购买了服务器,配置了很好的硬件设备,上线去部署我们的业务。但是有些公司的业务有时会有波峰波谷,在业务高峰期对计算资源的要求就很高,在业务低谷期,处理器的运算量可能就没有这么大,这就造成了计算资源的浪费。另外由于我们在部署应用的时候,从系统的架构、应用的稳定性等多面考虑,我们一般建议不要把多个应用部署在同一台服务器上。这样可能就更加加剧了计算资源的浪费。
比如说,你花了一笔钱购买了一台服务器,在上面部署了公司的应用服务。平时业务可能并不繁忙,但是为了保证它的可靠性,不与公司其他应用产生冲突。那你就必须让这台服务器长期处于一个空闲的状态。它的业务量没这么大,但这个应用的意义和价值对公司很重要。为了并没有很大业务量的应用购买一台很好的服务器,让它的CPU长时间的处于空闲状态,并没有得到有效的利用。这时候企业的运营成本是非常高的。
如果多个应用搭建在同一台服务器上,各个应用之间搭建在同一个服务器的同一个操作系统上,一个应用出问题了,可能会导致其他应用的问题。这不是一个好的方法。
有什么办法既能解决应用隔离的问题,又能减少企业对硬件投入的成本和维护的代价。业界有很多的方法,其中虚拟化就是其中的一个解决办法。我们可以把一台有着强劲CPU的物理服务器,在上面部署一个虚拟化的软件平台,利用这个平台在上面创建多个虚拟机,每个应用部署在虚拟机上,每个虚拟机都使用着物理服务器的硬件资源。我们可以按照多个应用对计算资源的需求量,然后把多个应用部署在虚拟机上。这样既解决了多个应用之间互相干扰,应用之间隔离的问题,避免它们相互干扰导致的稳定性差的问题,另外又可以得到物理服务器强劲的计算资源,很好的解决了企业对硬件投入和维护成本。
虚拟化是一个将计算资源打碎,重新分配、按需分配的很好的技术。而虚拟化的特点符合云计算对计算资源进行分配的需求。
所以虚拟化技术和云计算技术进行结合搭配来使用,通过虚拟化将计算资源进行分割,通过云平台将分割出来的、颗粒度更加细化的计算资源去交付给用户使用。用户可以需要多少,就去云平台上购买多少。这样就实现了计算资源的按需分配,把原来不可分割的物理资源打碎成很多颗粒度更加细化的、可分配的资源,给用户使用。
现阶段云计算都是以虚拟化为基础,来进行搭建的。
- 计算资源的云化
- 按需调度、按需索取
- 计算资源需要更大程度的颗粒度细化
- 虚拟化是计算资源细分的基础
- 处理器运算能力的大幅度提升
- 处理速度越来越快(摩尔定律)
- 多核处理器架构
- 大量计算资源限制浪费,企业整体运营成本高
- 多应用同机部署,应用隔离差,稳定性影响大
- 处理器支持虚拟化技术。
云计算技术
介绍
- SaaS:Software as a Service
- 软件即服务,服务以软件形式交付
- Gmail / 在线 office
- 无需本地安装部署
- PaaS:Platform as a Service
- 平台即服务
- 提供软件开发运行的基础平台
- 不需要开发平台,只需要给你提供API文档,按照规范开发就行了
- IaaS:Infrastructure as a Service
- 基础架构即服务
- 最底层的云计算,物理的计算、存储、网络资源访问
- AWS、Google Compute Engine、阿里云
虚拟化技术
云计算是将资源打碎、分配、发布、交付的一组工具的合集。
现在基本上主流CPU都支持Hypervisors 虚拟化这样的功能
- KVM、XEN、QEMU、VirtualBox、VMWare
比如说你在宿主机上安装了一个Linux系统,在Linux系统上又部署虚拟化的产品,利用这个虚拟化产品安装多个虚拟机,但只要你的硬件的CPU是支持hypervisor的,从硬件层面来看,对于硬件CPU你是宿主机的操作系统还是虚拟机的操作系统,在硬件CPU上看来,你们是同等的。也就是说,虽然虚拟机看起来还是工作在宿主机操作系统里面的一个软件,但从硬件层面上来讲,这些虚拟机都是可以访问CPU硬件资源的。所有从硬件资源的使用上,你虚拟机也是一台独立的计算机。因为有了hypervisor,它可以让虚拟机、宿主机以及虚拟机之间都可以平行的使用硬件资源,从而就使得虚拟机的性能得到显著的提升。
云计算平台:Openstack
服务编排工具:Juju
机器配置工具:MASS
特点:
- 降低成本、提高利用率、方便管理部署、快速恢复换源
- 普遍用于开发测试试验、生成环境部署都是可以的
- 需要硬件支持,在BIOS设置开启
KVM介绍
Kernel-based Virtual Machine
- 在ubuntu操作系统上内建的虚拟化技术就是KVM
- 基于内核的虚拟机(KVM)和快速仿真器(QEMU)组成的虚拟化套件(QEMUQ/KVM)
- QEMUQ/KVM 在没有硬件虚拟化支持下,虚拟机需要运行在QEMU模拟器上
- 在有硬件虚拟化支持下,接近硬件物理机速度运行
- 虚拟化扩展决定性能(virtualization extensions)
- 内建于Linux内核,Intel的kvm-intel.ko 或 AMD的 kvm-amd.ko
- libvirt库是Linux与虚拟机通信的统一接口
- 处理在主机和客户机之间分离任务所需要的低级指令
- 无法并行运行virtualbox和KVM虚拟机,它们会抢占CPU的虚拟化功能
验证硬件平台是否支持虚拟化扩展的几种办法
第一种方式:
1 | egrep -c '(vmx|svm)' /proc/cpuinfo # 结果不为0即为支持 |
第二种方式
1 | sudo apt install cpu-checker # 安装cpu-checker软件包 |
第三种方式:
1 | lscpu # 系统命令 |
第四种方式
1 | sudo apt install libvirt-clients |
安装KVM
1 | sudo apt install bridge-utils libvirt-bin qemu-kvm qemu-system |
映像文件目录
1 | sudo ls -dl /var/lib/libvirt/images |
配置文件
1 | sudo vi /etc/libvirt/libvirtd.conf |
安装客户端管理工具
1 | sudo apt install ssh-askpass virt-manager |
KVM日常管理
网卡桥接配置
默认虚拟机网络模式为NAT
- 可以访问外部网络,但外部计算机无法访问虚拟机
- 需要使用网桥实现虚拟机被外部网络访问
上图的方框表示一个宿主机host,与外界连接网络network,宿主机有自己的物理网卡eth0。如果虚拟机使用NAT网络,vm1和vm2这些虚拟机要和外界网络通信,都必须通过宿主机的物理网卡做NAT。也就是说虚拟机的流量都是在宿主机的物理网卡上做地址转换,内部比如说是10.0.0.1,经过转换就转换成外部网络的ip地址可以识别的地址,如192.168.32.101。如果外部网络想访问到内部的vm1、vm2,那就不可以了。将外部转换成内部地址,反向做端口映射,kvm虚拟机本身是不支持这样的功能的。
但是我们可以创建网桥br0,把物理网卡eth0加入到网桥里,把虚拟机的每一个网卡都加入到网桥里,通过网桥实现向外部网络进行通信。这样在外部网络看来,因为大家都是通过网桥连接到外部网络上去的,里面包含物理网卡和虚拟网卡。所以通过网桥,可以将外部的网络结构透传到内部的虚拟机上。比如说外部有DHCP服务器给外部网络分发IP地址,虚拟机通过网桥和外部网络相连接,外部网络DHCP分发ip地址的时候也可以给虚拟机分发一个外部的IP地址。这样的话,在外界网络看来,里面的虚拟机也是一个具有外部网络合法IP地址的独立计算机。所有外界可以通过网桥来访问虚拟机上的服务。
1 | sudo vi /etc/netplan/*.yaml |
重启网络生效:
1 | sudo netplan apply |
创建虚拟机
- 建立连接
- virt-manager 本机
- virt-manager 基本使用
- 克隆创建虚拟机
- KVM不支持模板功能,但可以将VM关机作为模板使用
- 快照
- 迁移
虚拟机设置
命令行创建虚拟机
1 | sudo virt-install -n web -r 2048 --disk path=/var/lib/libvirt/images/web.img,bus=virtio,size=10 -c ubuntu-18.04-live-server-amd64.iso --network network=default,model=virtio --graphics vnc,listen=0.0.0.0 --noautoconsole -v |
复制虚拟机
1 | sudo virt-clone -o web -n db -f /var/lib/libvirt/images/db.img |
virtsh命令行工具
virtsh是一个独立的对KVM管理的命令行
1 | # 建立连接 |
使用云镜像
官方发布的虚拟机
- 为方便和适应云平台的部署,ubuntu官方提供各种云镜像文件
1 | wget http://cloud-images.ubuntu.com/releases/bionic/release/ubuntu-18.04- |
解压缩镜像文件
1 | qemu-img convert -O qcow2 u18.dist u18.img |
创建用户数据文件
1 | vi cloud-config |
官方生成用户数据盘
1 | cloud-locals user-data.img cloud-config # 使用cloud-config 配置文件去创建一个新的数据盘 |
启动虚拟机
1 | kvm -m 2048 -smp 2 -hda u18.img -hdb user-data.img -net nic -net user,hostfwd=tcp::1810-:22 -nographic |
删除云镜像初始化脚本
1 | sudo apt remove cloud-init |
使用云镜像创建VM