服务器虚拟化 - PVE
服务器虚拟化 - Hypervisor
服务器虚拟化软件,也叫 Hypervisor——虚拟机管理程序,有时也称做 Virtual Machine Monitor(VMM),它可以在宿主机上创建并管理多个虚拟机。
目前比较流行的 Hypervisor 有:
vShpere Hypervisor: 也就是 ESXi,这是一个闭源收费的服务器虚拟化系统。基于 Linux,可直接安装在物理机上。
- 优点是简单方便,但是收费。适合中小企业,或者个人搭着玩。
- 成熟稳定,用户众多。但是各大云服务提供商全都用 KVM 做了自己的虚拟化平台,因为免费且自主可控。
- ESXi 搭配 vCenter 可以中心化地管理 ESXi 集群,搭配 terraform/python sdk 可以实现虚拟机的自动化创建等功能。
ProxmoxVE: 一个开源免费的服务器虚拟化系统,基于 Debian + QEMU/KVM + LXC.
- PVE 开源免费,而 VMware 的全套技术都是闭源收费的
- PVE 底层是 QEMU/KVM,存储方案也是 Ceph/iSCSI/NFS/LVM 这些都是使用很广泛的开源技术,学会了还可以应用在别的地方。
- 提供一套方便的 CLI 工具,以及 RESTful API。不论是 CLI、HTTP API 还是 Python SDK,又或者 terraform 支持,PVE 都比 ESXi 要好用很多!
- 文档齐全,而且很接地气,还包含许多 QEMU/KVM/CEPH 等开源技术的内容。 反观 VMware 的文档,真的是写得烂得一批。
- 缺点在于,PVE 的 WebUI 功能不全,有些功能必须通过命令行才能实现。(这和路由器类似,高级功能只有 CLI 支持)
KVM: 直接搞 KVM,有一定难度。适合进阶用户,或者大厂自己 DIY。
这里主要介绍 PVE 的安装与使用。
安装 PVE
安装过程没啥好说的,安装好后,需要按下面这篇文章配置国内镜像源,启用 root 账户 ssh 登录:
# 设置 debian 的阿里镜像源
cp /etc/apt/sources.list /etc/apt/sources.list.bak
sed -i "s@\(deb\|security\).debian.org@mirrors.aliyun.com@g" /etc/apt/sources.list
# 去除烦人的订阅提示
sed -i "s/data.status !== 'Active'/false/g" /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js
# 设置 pve 国内镜像源
# https://mirrors.bfsu.edu.cn/help/proxmox/
echo 'deb https://mirrors.bfsu.edu.cn/proxmox/debian buster pve-no-subscription' > /etc/apt/sources.list.d/pve-no-subscription.list
使用 Cloud-Init 自动配置网卡、SSH密钥、存储大小配置
完全参照官方文档 Cloud-Init_Support - PVE Docs
首先下载 Cloud 版本的系统镜像:
- CentOS Cloud 版本: 提供 qcow2 格式的镜像
- Debian Cloud Images: 也提供 qcow2 格式的镜像
- Ubuntu Cloud Images (RELEASED): 提供 img 格式的裸镜像(PVE 也支持此格式)
上述镜像和我们普通虚拟机使用的 ISO 镜像的区别,一是镜像格式不同,二是都自带了 cloud-init/qemu-guest-agent/cloud-utils-growpart 等 cloud 相关软件。
上述三个 cloud 镜像的默认名称和系统名称完全一致,分别为 centos/debian/ubuntu,
均没有默认密码,并且禁用了 SSH 密码登录,必须通过 cloud-init 设置私钥方式进行远程登录。
建议在 cloud-init 配置中自行设置账号与私钥,不要使用默认的账号名。
比如测试环境,可以直接设置账号为 root,并设置相应的私钥。
接下来我们需要将得到的 qcow2 镜像导入 PVE,并用它创建一个虚拟机模板。
首先创建虚拟机,并以导入的磁盘为该虚拟机的硬盘
# 创建新虚拟机
qm create 9000 --memory 2048 --net0 virtio,bridge=vmbr0
# 将下载好的 img/qcow2 镜像导入为新虚拟机的硬盘
qm importdisk 9000 bionic-server-cloudimg-amd64.img local-lvm
# 通过 scsi 方式,将导入的硬盘挂载到虚拟机上
qm set 9000 --scsihw virtio-scsi-pci --scsi0 local-lvm:vm-9000-disk-1
# 创建一个 cloud-init 需要使用的 CDROM 盘(sr0)
qm set 9000 --ide2 local-lvm:cloudinit
# 设置系统引导盘
qm set 9000 --boot c --bootdisk scsi0
# 设置 serial0 为显示终端,很多云镜像都需要这个。(?感觉我不需要?)
qm set 9000 --serial0 socket --vga serial0
后续配置:
- 手动设置 cloud-init 配置,启动虚拟机。
- 进入虚拟机后,安装所需的基础环境,如 docker/docker-compose/vim/git/python3
- 关闭虚拟机,然后将虚拟机设为模板(只读)。
- 接下来就可以从这个模板虚拟机,克隆各类新虚拟机了~
cloud-init 高级配置
PVE 使用 CDROM 只读盘(/dev/sr0)来进行 cloud-init 的配置。
在虚拟机启动后,/dev/sr0 将被卸载。
可挂载上该只读盘,查看其中的初始化配置内容:
$ mkdir cloud-config
$ mount /dev/sr0 cloud-config
mount: /dev/sr0 is write-protected, mounting read-only
$ ls cloud-config
meta-data network-config user-data
查看上述文件发现 user-data 有如下问题:
- 它硬编码了
manage_etc_hosts: true,这导致我手动在/etc/cloud/cloud.cfg里设定的manage_etc_hosts: false被覆盖。 - 它设置了
hostname,但是测试发现 centos7 的 hostname 仍然是localhost,没有被修改,原因未知。
修改 cloud-init 相关的硬编码参数
通过前面的排查,我们发现 proxmox 有很多参数都硬编码了,没有通过配置暴露出来,导致我们无法修改。
为了解决这个问题,我们完全可以修改掉 PVE 代码里的硬编码参数。
首先通过全文搜索,找到硬编码参数的位置:
# 在 /usr/share 中全文搜索 manage_etc_hosts 这个关键字
grep -r manage_etc_hosts /usr/share
直接就搜索到了硬编码位置是 /usr/share/perl5/PVE/QemuServer/Cloudinit.pm
手动将配置修改为 manage_etc_hosts: localhost,就能让 cloud-init 只更新 localhost 相关的 hosts 内容。
如果希望 cloud-init 能自动设置 hostname,还可以添加参数 preserve_hostname: true.
解决 SSH 登录速度慢的问题
貌似所有的 cloud-init 的虚拟机,SSH 都存在速度慢的问题。
关闭掉 ssh server 的反向 DNS 解析,可以解决这个问题:
echo "UseDNS no" >> /etc/ssh/sshd_config
虚拟机硬盘扩容
CentOS/Ubuntu/Debian 提供的 Cloud 镜像,都自带了 cloud-utils-growpart 这个组件,可以实现在扩容物理硬盘时,自动调整 Linux 的分区大小。
因此需要扩容虚拟机时,直接通过 UI 面板/命令行扩容虚拟机的硬盘即可, Linux 的分区会被 cloud-utils-growpart 自动扩容。
因为这个方便的特性,也为了减少虚拟化的开销,Cloud 镜像默认是不使用 LVM 逻辑分区的。
LVM 逻辑分区虽然方便,但是它对物理机的作用更大些。虚拟机因为本身就能动态扩容“物理硬盘”的大小,基本不用不到 LVM。
还有一点,就是虚拟机通常只需要一个根分区就行,尤其是归 openstack/kubernetes 管的虚拟机。
只有在使用分布式存储之类的场景下,数据需要独立存储,才需要用到额外的分区(/data 之类的)。
一般只有物理机,才需要像网上很多文章提的那样,为 /boot / /home 去单独分区。
而且现在大家都用 SSD 了,物理机这样做分区的都少了,比如我个人电脑,就是一个 / 分区打天下。。。
自动化工具
监控告警
- prometheus pve expoter: 通过 prometheus+grafana 监控 PVE 集群
常见问题
1. 导入已有的 qcow2 镜像
必须要命令行操作
先通过 scp 将 qcow2 传输到 PVE 上,然后命令行使用如下命令导入镜像:
# 命令格式
qm importdisk <vmid> <source> <storage>
# 示例
qm importdisk 201 vm-201-disk-1.qcow2 local-lvm
导入完成后,在 WebUI 界面的左侧会看到多了一个「未使用的磁盘 0」,
现在新建一台新虚拟机,然后删除掉默认的磁盘(分离+删除,要两步),然后挂载这个「未使用的磁盘 0」就大功告成了。
相关文档
服务器虚拟化 - PVE的更多相关文章
- 【WMware】关于VMware服务器虚拟化管理之服务器容量扩充
将服务器物理资源抽象成逻辑资源,让一台服务器变成几台甚至上百台相互隔离的虚拟服务器,我们不再受限于物理上的界限,而是让CPU.内存.磁盘.I/O等硬件变成可以动态管理的“资源池”,从而提高资源的利用率 ...
- Citrix 服务器虚拟化之二十一 桌面虚拟化之部署Provisioning Services
Citrix 服务器虚拟化之二十一 桌面虚拟化之部署Provisioning Services Provisioning Services 是Citrix 出品的一系列虚拟化产品中最核心的一个组件, ...
- Citrix 服务器虚拟化之八 Xenserver虚拟机模版
Citrix 服务器虚拟化之八 Xenserver虚拟机模版 XenServer与VMware不同,Vmware只能将现有的VM转换成模版,而XenServer具有两种方法:一种是将现有 VM 转换为 ...
- Citrix 服务器虚拟化之五 Xenserver配置存储
Citrix 服务器虚拟化之五 Xenserver配置存储 XenServer中定义了一个容器称为存储库(SR)来描述一个特定的存储目标存储虚拟磁盘映像(VDI). VDI是一个的磁盘抽象,包含一个 ...
- Citrix 服务器虚拟化之二十八 XenApp6.5发布文档内容
Citrix 服务器虚拟化之二十八 XenApp 6.5发布文档内容 XenApp可发布以下类型的资源向用户提供信息访问,这些资源可在服务器或桌面上虚拟化: 1) 服务器桌面:发布场中服务器的整个 ...
- Citrix 服务器虚拟化之二十七 XenApp6.5发布服务器桌面
Citrix 服务器虚拟化之二十七 XenApp6.5发布服务器桌面 XenApp可发布以下类型的资源向用户提供信息访问,这些资源可在服务器或桌面上虚拟化: 1) 服务器桌面:发布场中服务器的整个 ...
- Citrix服务器虚拟化之三十 XenApp 6.5发布流式应用程序
Citrix服务器虚拟化之三十 XenApp 6.5发布流式应用程序 XenApp可发布以下类型的资源向用户提供信息访问,这 ...
- VMware vSphere 服务器虚拟化之二十五 桌面虚拟化之终端服务池
VMware vSphere 服务器虚拟化之二十五 桌面虚拟化之终端服务池 终端服务池是指由一台或多台微软终端服务器提供服务的桌面源组成的池.终端服务器桌面源可交付多个桌面.它具有以下特征: 1.终端 ...
- Citrix 服务器虚拟化之十八 桌面虚拟化之部署MCS随机桌面池
Citrix 服务器虚拟化之十八 桌面虚拟化之部署MCS随机桌面池 完成桌面模版的制作后,可以开始虚拟桌面池的发布 说明: 环境基于实验十七 1.登录DC服务器创建一个组织单位名为Citrix,然后 ...
随机推荐
- python 不可变类型
不可变类型有:字符串,元祖,数字 可变类型:列表,字典 字典中,可变类型不能为key值 #在函数中 可变类型,为全局变量时,会变化 不可变类型,为全局变量时,不会变化
- 第四章 Bash Shell 的简单应用
一.Bash Shell 的简单介绍 1.什么是bash shell? 是一个命令解释器 它在操作系统的最外面 负责用户与内核进行交互的一种接口 将用户输入的命令翻译给操作系统,并将处理后的结果输出到 ...
- 懒人福音——GitHub 热点速览 Vol.42
作者:HelloGitHub-小鱼干 懒人福音是什么?就是省时省事,正如 Waypoint 一样,你不需要在多个平台构建代码即可部署发布应用,它允许你将应用程序构建.部署和发布生命周期定义为代码.Bi ...
- Nacos配置中心使用
在系统开发过程中,开发者通常会将一些需要变更的参数.变量等从代码中分离出来独立管理,以独立的配置文件的形式存在.目的是让静态的系统工件或者交付物(如 WAR,JAR 包等)更好地和实际的物理运行环境进 ...
- 作用域 - Js深入理解笔记
执行期上下文 当函数执行时,会创建一个称为执行上下文的内部对象 一个执行期上下文定义了一个函数所执行时的环境,函数每次执行时对应的执行上下文都是独一无二的,多次调用一个函数会导致创建多个执行上下文,当 ...
- Google面试题(选自公众号)
date: 2018-12-14 13:34:56 updated: 2018-12-14 13:34:56 Google面试题(选自公众号) 问题 把你的手机拨号页想象成一个棋盘.棋子走只能走&qu ...
- 关于linux epoll的了解
使用select/poll模型假设一台服务器需要支持100w的并发连接,在_FD_SETSIZE为1024时,则至少需要1k个进程 除了进程间的上下文切换的时间消耗外,从内核/用户空间,大量的无脑内存 ...
- 编写优美代码的七条规范(Python版)
编程是一种与计算机系统通信的语言.交流就是与某人分享思想.二进制语言是计算机的最核心的语言.但是在前端,我们有很多种语言.这些语言使用解释器将前端代码转换为二进制代码.基本上,系统对一行代码执行大量内 ...
- Charles使用part1——基本功能介绍
一. 安装与破解: 官网地址:https://www.charlesproxy.com/download/ 破解自行解决. 二. 启动与配置: 启动 Charles 后,第一次 Charles 会请求 ...
- 求0到n之间素数个数的序列
要求: (1) 找出0-1000之间素数(2) 设f(n)表示0-n之间的素数个数,计算出当n=0,1,2,3,.....,997时f(n)的值,并写入文件 分析: 首先找素数使用一个效率较高的方法- ...