zoukankan      html  css  js  c++  java
  • 服务器虚拟化

    个人笔记,不保证正确。

    服务器虚拟化 - Hypervisor

    服务器虚拟化软件,也叫 Hypervisor——虚拟机管理程序,有时也称做 Virtual Machine Monitor(VMM),它可以在宿主机上创建并管理多个虚拟机。
    目前比较流行的 Hypervisor 有:

    1. vShpere Hypervisor: 也就是 ESXi,这是一个闭源收费的服务器虚拟化系统。基于 Linux,可直接安装在物理机上。

      1. 优点是简单方便,但是收费。适合中小企业,或者个人搭着玩。
      2. 成熟稳定,用户众多。但是各大云服务提供商全都用 KVM 做了自己的虚拟化平台,因为免费且自主可控。
      3. ESXi 搭配 vCenter 可以中心化地管理 ESXi 集群,搭配 terraform/python sdk 可以实现虚拟机的自动化创建等功能。
    2. ProxmoxVE: 一个开源免费的服务器虚拟化系统,基于 Debian + QEMU/KVM + LXC.

      1. PVE 开源免费,而 VMware 的全套技术都是闭源收费的
      2. PVE 底层是 QEMU/KVM,存储方案也是 Ceph/iSCSI/NFS/LVM 这些都是使用很广泛的开源技术,学会了还可以应用在别的地方。
      3. 提供一套方便的 CLI 工具,以及 RESTful API。不论是 CLI、HTTP API 还是 Python SDK,又或者 terraform 支持,PVE 都比 ESXi 要好用很多!
      4. 文档齐全,而且很接地气,还包含许多 QEMU/KVM/CEPH 等开源技术的内容。 反观 VMware 的文档,真的是写得烂得一批。
      5. 缺点在于,PVE 的 WebUI 功能不全,有些功能必须通过命令行才能实现。(这和路由器类似,高级功能只有 CLI 支持)
    3. 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 版本的系统镜像:

    1. CentOS Cloud 版本: 提供 qcow2 格式的镜像
    2. Debian Cloud Images: 也提供 qcow2 格式的镜像
    3. 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/img 镜像导入 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
    

    后续配置:

    1. 手动设置 cloud-init 配置,启动虚拟机。
    2. 进入虚拟机后,安装所需的基础环境,如 docker/docker-compose/vim/git/python3
    3. 关闭虚拟机,然后将虚拟机设为模板(只读)。
    4. 接下来就可以从这个模板虚拟机,克隆各类新虚拟机了~

    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 有如下问题:

    1. 它硬编码了 manage_etc_hosts: true,这导致我手动在 /etc/cloud/cloud.cfg 里设定的 manage_etc_hosts: false 被覆盖。
    2. 它设置了 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: False.

    perl 和 python 一样,程序启动后代码就加载到内存中了,因此对上述文件的修改需要重启 PVE 后,才能生效。

    解决 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 了,物理机这样做分区的都少了,比如我个人电脑,就是一个 / 分区打天下。。。

    自动化工具

    监控告警

    常见问题

    1. 导入已有的 qcow2 镜像

    必须要命令行操作

    先通过 scp 将 qcow2 传输到 PVE 上,然后命令行使用如下命令导入镜像:

    # 命令格式
    qm importdisk <vmid> <source> <storage>
    # 示例
    qm importdisk 201 vm-201-disk-1.qcow2 local-lvm
    

    导入完成后,在 WebUI 界面的左侧会看到多了一个「未使用的磁盘 0」,
    现在新建一台新虚拟机,然后删除掉默认的磁盘(分离+删除,要两步),然后挂载这个「未使用的磁盘 0」就大功告成了。

    相关文档

  • 相关阅读:
    [MacOS]Sublime text3 安装(一)
    [RHEL8]开启BBR
    PAT Advanced 1136 A Delayed Palindrome (20分)
    PAT Advanced 1144 The Missing Number (20分)
    PAT Advanced 1041 Be Unique (20分)
    PAT Advanced 1025 PAT Ranking (25分)
    PAT Advanced 1022 Digital Library (30分)
    PAT Advanced 1019 General Palindromic Number (20分)
    PAT Advanced 1011 World Cup Betting (20分)
    PAT Advanced 1102 Invert a Binary Tree (25分)
  • 原文地址:https://www.cnblogs.com/kirito-c/p/14006533.html
Copyright © 2011-2022 走看看