.. _zdata_ceph_rbd_libvirt: ================================== 私有云基于 ZData Ceph 运行虚拟机 ================================== 在我的 :ref:`priv_cloud_infra` ,是一个基于KVM虚拟化的模拟大规模集群,所以,在 :ref:`zdata_ceph` 部署作为整个虚拟化底层Ceph存储,用于第一层KVM虚拟机的镜像存储。完成存储部署之后,现在到了如何把 ``zcloud`` 上运行的KVM虚拟机存储结合到Ceph分布式存储的阶段。 为了方便虚拟化部署,我们通常会采用 :ref:`libvirt` 来管理VM以及相关的存储和网络,对于 :ref:`ceph` 也不例外。通过 :ref:`ceph_rbd_libvirt` ,可以让QEMU通过 ``librbd`` 来访问Ceph OSD提供的块存储。 部署方案 ========== - :ref:`ceph_rbd_libvirt` 提供KVM虚拟机管理 :ref:`zdata_ceph` - 基于 :ref:`ceph_rbd` 存储部署 :ref:`ubuntu_linux` - :ref:`clone_vm_rbd` 复制出满足部署 :ref:`kubernetes` 和 :ref:`openstack` 集群的第一层虚拟机 - 采用 :ref:`kvm_libguestfs` 对clone后的VM镜像进行定制,正确配置主机名、IP以及必要配置 既然我已经完成了 :ref:`zdata_ceph` ,现在就来配置 ``libvirt`` 运行基于Ceph的虚拟机: 配置Ceph ========== - 创建存储池:: sudo ceph osd pool create libvirt-pool 创建成功则提示:: pool 'libvirt-pool' created - 检查这个创建资源池的pg数量:: sudo ceph osd pool get libvirt-pool pg_num 显示:: pg_num: 81 上述 ``osd pool`` 是管理Ceph资源的逻辑概念,将对应于 ``libvirt`` 的存储池 - 使用 ``rbd`` 工具初始化资源池用于RBD:: sudo rbd pool init libvirt-pool - 创建一个Ceph用户:: sudo ceph auth get-or-create client.libvirt mon 'profile rbd' osd 'profile rbd pool=libvirt-pool' 客户端(使用Ceph) =================== - 在运行 :ref:`kvm` 和 :ref:`libvirt` 的虚拟化服务器上,需要安装 ``ceph-common`` 软件包:: sudo apt install ceph-common 配置libvirt RBD存储池 ------------------------ - ``libvirt`` 需要定义RBD存储池,需要首先配置访问Ceph存储的secret:: SECRET_UUID=$(uuidgen) cat >secret.xml <<__XML__ $SECRET_UUID client.libvirt secret __XML__ virsh secret-define --file secret.xml virsh secret-set-value --secret "$SECRET_UUID" --base64 "$(sudo ceph auth get-key client.libvirt)" - 设置 ``libvirt-pool`` 存储池:: cat >pool.xml <<__XML__ images_rbd libvirt-pool # ceph monitor 1 # ceph monitor 2 # ceph monitor 3 __XML__ virsh pool-define pool.xml virsh pool-start images_rbd virsh pool-autostart images_rbd - 然后验证检查:: virsh vol-list images_rbd 创建虚拟机 --------------- .. note:: 目前我的实践发现,之前在 :ref:`libvirt_lvm_pool` 构建的VM,虽然能够通过 ``qemu-img`` 转换到到RBD中镜像文件,但是手工配置的VM的XML配置,在 :ref:`clone_vm_rbd` 尝试clone虚拟机无法启动。所以,最后我还是采用全新基于Ceph存储的VM操作系统安装,才完成clone。 - 创建RBD磁盘:: virsh vol-create-as --pool images_rbd --name z-ubuntu20-rbd --capacity 7GB --allocation 7GB --format raw - 安装虚拟机:: virt-install \ --network bridge:br0 \ --name z-ubuntu20-rbd \ --ram=2048 \ --vcpus=1 \ --os-type=Linux --os-variant=ubuntu20.04 \ --boot uefi --cpu host-passthrough \ --disk vol=images_rbd/z-ubuntu20-rbd,sparse=false,format=raw,bus=virtio,cache=none,io=native \ --graphics none \ --location=http://mirrors.163.com/ubuntu/dists/focal/main/installer-amd64/ \ --extra-args="console=tty0 console=ttyS0,115200" 安装完成后按照 :ref:`priv_kvm` 中订正虚拟机配置(登陆到虚拟机内部执行): - 修订NTP:: echo "NTP=192.168.6.200" >> /etc/systemd/timesyncd.conf - 修订控制台输出 默认安装 ``/etc/default/grub`` 内容:: GRUB_TERMINAL=serial GRUB_SERIAL_COMMAND="serial --unit=0 --speed=115200 --stop=1" 修改成:: GRUB_CMDLINE_LINUX="console=ttyS0,115200" GRUB_TERMINAL="serial console" GRUB_SERIAL_COMMAND="serial --speed=115200" 然后执行:: sudo update-grub - 修订虚拟机 ``/etc/sudoers`` 并添加主机登陆ssh key clone虚拟机 ---------------- 在完成了第一个虚拟机 ``z-ubuntu20-rbd`` 创建之后,后续的虚拟机都采用这个模版进行clone。我在实践中发现,类似之前 :ref:`libvirt_lvm_pool` 直接采用 ``virt-clone`` 命令会遇到无法管理 RBD 存储池的问题。所以采用 :ref:`clone_vm_rbd` 中探索的变通方法: - 将模版虚拟机 ``XML`` 配置中有关 Ceph RBD 磁盘部分摘除,然后剩余部分作为模版 - 使用 ``rbd cp libvirt-pool/z-ubuntu20 libvirt-pool/${VM}`` 来独立clone出RBD磁盘文件 - 摘除的Ceph RBD磁盘配置XML单独保存成独立文件,等VM clone完成后再attach 为了方便处理,编写一个简单的脚本 ``change_vm.sh`` 完成这个操作步骤: .. literalinclude:: ../../ceph/rbd/clone_vm_rbd/clone_vm.sh :language: bash :linenos: :caption: clone虚拟机的简单脚本 - 脚本中结合了 :ref:`kvm_libguestfs` 工具来定制clone出来的虚拟机配置,所以可以直接完成虚拟机clone和启动,无需手工登陆虚拟机内部修改配置。 执行clone命令( 举例 ``z-k8s-m-3`` ):: ./clone_vm.sh z-k8s-m-3 通过上述方法按照 :ref:`priv_cloud_infra` 规划的虚拟机列表,完成虚拟机创建。