云计算介绍

  • 现代社会生产生活都需要资源
    • 比如说工业社会的水电资源
  • 资源的获取方式
    • 靠天吃饭
    • 靠人集中、分散的生产资源
    • 自己发电、自己筑坝
  • 信息时代计算资源是最主要的生产力

    • 主机时代、网络时代
    • 互联网企业的业务系统不断膨胀,由于单台服务器运算能力比较有限,无法承担公司的业务。这时候就将多个单台服务器资源整合到一起,通过云计算的技术将多台计算机的计算资源整合在一起,成为一个大的资源池。
    • 这么大量的资源,我不是时时刻刻都需要使用这么大的计算资源,从而就造成了很长时间内这么大的计算资源都浪费了。
    • 集中和分散。计算机刚出现的时候主机时代,计算资源是集中化的;后来每个人都有着自己的计算设备,可以用自己的电脑处理业务,这时候的计算资源是分散的;随着业务的发展,单台计算机和几台计算机都不足以支撑业务的时候,资源就再次被集中起来。到底是集中还是分散,并没有说哪个更好,只是按照时代、市场和业务发展的需要对计算资源使用方式的需求,决定了技术发展的走向。

    • 量子计算可能颠覆一切。一台量子计算机的计算能力非常强,每个人都有量子计算机,这时候可能又回归到了资源分散部署的时代。

亚马逊的云服务

虚拟化介绍

在很多的大企业里面,我们花了大价钱购买了服务器,配置了很好的硬件设备,上线去部署我们的业务。但是有些公司的业务有时会有波峰波谷,在业务高峰期对计算资源的要求就很高,在业务低谷期,处理器的运算量可能就没有这么大,这就造成了计算资源的浪费。另外由于我们在部署应用的时候,从系统的架构、应用的稳定性等多面考虑,我们一般建议不要把多个应用部署在同一台服务器上。这样可能就更加加剧了计算资源的浪费。

比如说,你花了一笔钱购买了一台服务器,在上面部署了公司的应用服务。平时业务可能并不繁忙,但是为了保证它的可靠性,不与公司其他应用产生冲突。那你就必须让这台服务器长期处于一个空闲的状态。它的业务量没这么大,但这个应用的意义和价值对公司很重要。为了并没有很大业务量的应用购买一台很好的服务器,让它的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
2
3
4
5
6
sudo apt install cpu-checker    # 安装cpu-checker软件包
kvm-ok

# 输出结果:
INFO: /dev/kvm exists
KVM acceleration can be used

第三种方式:

1
2
3
lscpu    # 系统命令

# 返回的结果中有virtualization:VT-x 就表示支持虚拟化

第四种方式

1
2
3
4
5
sudo apt install libvirt-clients

virt-host-validate

# Checking for hardware virtualization: PASS

安装KVM

1
2
3
4
5
sudo apt install bridge-utils libvirt-bin qemu-kvm qemu-system
# 安装依赖

# 当期用户被加入到libvirt组
# 需要重启使得权限生效

映像文件目录

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sudo vi /etc/netplan/*.yaml
# 配置

ethernets:
ens33:
dhcp4: no
dhcp6: no
bridges: # 创建网桥
bro:
interfaces: [ens33] # 将物理网卡加入到网桥
dhcp4: no
addresses: [192.168.1.2/24]
gateway4: 192.168.1.1
nameservers:
addresses: [8.8.8.8, 8.8.4.4]

重启网络生效:

1
sudo netplan apply

创建虚拟机

  • 建立连接
    • virt-manager 本机
    • virt-manager 基本使用
  • 克隆创建虚拟机
    • KVM不支持模板功能,但可以将VM关机作为模板使用
  • 快照
  • 迁移

虚拟机设置

命令行创建虚拟机

1
2
3
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

# -n参数指定名称,-r指定内存大小,--disk path=/var/指定虚拟机硬盘文件存在的目录,bus=virtio网络的总线类型默认是virtio,size是硬盘文件大小, -c参数指定镜像文件,--network接口模式,--graphics 指定VNC控制接口, --noautoconsole 不自动连接虚拟机控制台

复制虚拟机

1
2
sudo virt-clone -o web -n db -f /var/lib/libvirt/images/db.img
# 以web虚拟机的模板复制,-n 名字,-f 虚拟机文件路径

virtsh命令行工具

virtsh是一个独立的对KVM管理的命令行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 建立连接
virsh connect qemu:///172.16.247.128

# 查看所有的虚拟机
virsh list --all

# 管理虚拟机
virsh console vm01

# 关闭console ctrl+]

# 正常关机
virsh shutdown vm01

# 强制关机
virsh destory vm01

# 删除虚拟机
virsh undefine vm01

# 挂起虚拟机
virsh suspend vm01

# 恢复使用VM
virsh resume vm01

使用云镜像

官方发布的虚拟机

  • 为方便和适应云平台的部署,ubuntu官方提供各种云镜像文件
1
2
wget http://cloud-images.ubuntu.com/releases/bionic/release/ubuntu-18.04-
server-cloudimg-amd64.img -O u18.img.dist

解压缩镜像文件

1
qemu-img convert -O qcow2 u18.dist u18.img

创建用户数据文件

1
2
3
4
5
6
7
vi cloud-config
# 输入配置

#cloud-config
password: password
chpasswd: { expire: False }
ssh_pwauth: True

官方生成用户数据盘

1
cloud-locals user-data.img cloud-config  # 使用cloud-config 配置文件去创建一个新的数据盘

启动虚拟机

1
2
3
4
kvm -m 2048 -smp 2 -hda u18.img -hdb user-data.img -net nic -net user,hostfwd=tcp::1810-:22 -nographic

# 账号:ubuntu, 密码为password(自己设置的)
sudo passwd ubuntu # 修改密码

删除云镜像初始化脚本

1
sudo apt remove cloud-init

使用云镜像创建VM