openstack nova_libvirt 部署

34 阅读5分钟

1. Host vs containerised libvirt

默认情况下,Kolla Ansible 将 libvirt 部署在 nova_libvirt 容器中。在某些情况下,最好在计算主机上将 libvirt 作为守护程序运行。

Kolla Ansible 目前不支持将 libvirt 部署和配置为主机守护程序。但是,自 Yoga 版本以来,如果已经设置了 libvirt 守护进程,则可以将 Kolla Ansible 配置为使用它。这可以通过将 enable_nova_libvirt_container 设置为 false 来实现。

当防火墙驱动程序设置为 openvswitch 时,libvirt 会将 VM 直接插入集成桥 br-int。为此,它使用 ovs-vsctl 实用程序。此二进制文件的搜索路径由 $PATH 环境变量(如 libvirt 进程所示)。有几个选项可以确保可以找到此二进制文件:

  • 设置为 openvswitch_ovs_vsctl_wrapper_enabled True。这将在路径 /usr/bin/ovs-vsctl 中安装一个包装脚本,该脚本将执行 ovs-vsctl 的 openvswitch_vswitchd 容器。如果主机上没有安装 openvswitch,则此选项非常有用。它还具有 ovs-vsctl 实用程序将与服务器版本匹配的优点。

  • 在 Hypervisor 上安装 openvswitch。Kolla 将 /run/openvswitch 从主机挂载到 openvswitch_vswitchd 容器中。这意味着 socket 位于 ovs-vsctl 使用其默认选项期望的位置。

1. nova-libvirt 容器启动


# ansible/roles/nova-cell/templates/nova-libvirt.json.j2

{
    "command": "/usr/sbin/libvirtd --listen",
    "config_files": [
        {
            "source": "{{ container_config_directory }}/libvirtd.conf",
            "dest": "/etc/libvirt/libvirtd.conf",
            "owner": "root",
            "perm": "0600"
        },
        {
            "source": "{{ container_config_directory }}/qemu.conf",
            "dest": "/etc/libvirt/qemu.conf",
            "owner": "root",
            "perm": "0600"
        }{% if nova_backend == "rbd" or cinder_backend_ceph | bool %},
        {
            "source": "{{ container_config_directory }}/secrets",
            "dest": "/etc/libvirt/secrets",
            "owner": "root",
            "perm": "0600",
            "merge": true
        }{% endif %}{% if nova_backend == "rbd" %},
        {
            "source": "{{ container_config_directory }}/{{ nova_cell_ceph_backend['cluster'] }}.conf",
            "dest": "/etc/ceph/{{ nova_cell_ceph_backend['cluster'] }}.conf",
            "owner": "nova",
            "perm": "0600"
        }{% endif %}
    ]
}


  1. qemu.conf

# ansible/roles/nova-cell/templates/qemu.conf.j2

stdio_handler = "file"

user = "nova"
group = "nova"

max_files =  {{ qemu_max_files }}
max_processes =  {{ qemu_max_processes }}

  1. libvirtd.conf

# ansible/roles/nova-cell/templates/libvirtd.conf.j2

{% if libvirt_tls | bool %}
listen_tls = 1
listen_tcp = 0
tls_port = "{{ nova_libvirt_port }}"
key_file = "/etc/pki/libvirt/private/serverkey.pem"
cert_file = "/etc/pki/libvirt/servercert.pem"
ca_file = "/etc/pki/CA/cacert.pem"
auth_tls = "{{ 'sasl' if libvirt_enable_sasl | bool else 'none' }}"
{% else %}
listen_tcp = 1
listen_tls = 0
auth_tcp = "{{ 'sasl' if libvirt_enable_sasl | bool else 'none' }}"
tcp_port = "{{ nova_libvirt_port }}"
ca_file = ""
{% endif %}
{% if nova_libvirt_logging_debug | bool %}
log_level = 1
log_outputs = "1:file:/var/log/kolla/libvirt/libvirtd.log"
{% else %}
log_level = 3
log_outputs = "3:file:/var/log/kolla/libvirt/libvirtd.log"
{% endif %}
listen_addr = "{{ migration_interface_address }}"
{% if enable_neutron_mlnx | bool %}
# Enable read-only access to libvirt socket
auth_unix_ro = "none"
{% endif %}



2. nova-libvirt 权限


# ansible/roles/nova-cell/defaults/main.yml

---
project_name: "nova"

nova_cell_services:
  nova-libvirt:
    container_name: nova_libvirt
    group: "{{ nova_cell_compute_group }}"
    enabled: "{{ enable_nova_libvirt_container }}"
    image: "{{ nova_libvirt_image_full }}"
    pid_mode: "host"
    cgroupns_mode: "host"
    privileged: True
    volumes: "{{ nova_libvirt_default_volumes + nova_libvirt_extra_volumes + lookup('vars', 'run_default_volumes_' + kolla_container_engine) }}"
    dimensions: "{{ nova_libvirt_dimensions }}"
    healthcheck: "{{ nova_libvirt_healthcheck }}"

pid_mode: "host"
cgroupns_mode: "host"
privileged: True


这三个配置项是关于`nova-libvirt`容器的权限和隔离设置,具体含义如下:

1. pid_mode: "host"

  • 作用:容器共享宿主机的PID命名空间。
  • 影响:容器内的进程ID与宿主机相同,容器内部可以直接看到和操作宿主机上的所有进程。这便于像虚拟化管理工具那样的进程通信和监控。

2. cgroupns_mode: "host"

  • 作用:容器共享宿主机的控制组(cgroup)命名空间。
  • 影响:容器内的cgroup配置与宿主机同步,允许容器内的应用程序直接影响和监控宿主机的资源控制,这是实现虚拟化资源隔离的关键。

3. privileged: True

  • 作用:以特权模式运行容器。
  • 影响:容器拥有几乎所有的宿主机权限,包括访问设备、修改内核参数等。这个设置使容器有极高的权限,几乎等于赋予其宿主机的控制权限,常用于虚拟化管理和需要底层硬件访问的场景。

简单总结:

这三个配置让nova-libvirt容器拥有极高的权限和强制共享宿主机的核心命名空间,方便虚拟化任务的无缝管理,但也意味着安全性更低。通常在虚拟化环境中采用,以确保虚拟化管理软件能正常操作底层硬件和资源。

3. nova-libvirt 文件映射

# ansible/roles/nova-cell/defaults/main.yml

nova_libvirt_default_volumes:
  - "{{ node_config_directory }}/nova-libvirt/:{{ container_config_directory }}/:ro"
  - "/etc/localtime:/etc/localtime:ro"
  - "{{ '/etc/timezone:/etc/timezone:ro' if ansible_facts.os_family == 'Debian' else '' }}"
  - "/lib/modules:/lib/modules:ro"
  - "/run:/run{{ ':shared' if kolla_container_engine == 'docker' else '' }}"
  - "/dev:/dev"
  - "{{ 'devpts:/dev/pts' if kolla_container_engine == 'podman' else '' }}"
  - "/sys/fs/cgroup:/sys/fs/cgroup"
  - "kolla_logs:/var/log/kolla/"
  - "libvirtd:/var/lib/libvirt"
  - "{{ nova_instance_datadir_volume }}:/var/lib/nova/"
  - "{% if enable_shared_var_lib_nova_mnt | bool %}/var/lib/nova/mnt:/var/lib/nova/mnt:shared{% endif %}"
  - "nova_libvirt_qemu:/etc/libvirt/qemu"
  - "{{ kolla_dev_repos_directory ~ '/nova:/dev-mode/nova' if nova_dev_mode | bool else '' }}"

/dev:/dev

  • 作用:挂载设备文件目录,允许容器访问宿主机设备。
  • 用途:虚拟机需要直接访问硬件设备。

/sys/fs/cgroup:/sys/fs/cgroup

  • 作用:挂载控制组(cgroup)文件系统。
  • 用途:支持资源限制和管理(CPU、内存等)系统功能。

kolla_logs:/var/log/kolla/

  • 作用:挂载日志存储目录,用于存放kolla的日志信息。
  • 用途:方便日志管理。

libvirtd:/var/lib/libvirt

  • 作用:挂载libvirt存储目录,用于存放虚拟机定义、状态等。
  • 用途:虚拟机配置和状态的持久化存储。

{{ nova_instance_datadir_volume }}:/var/lib/nova/

  • 作用:挂载Nova实例的数据目录。
  • 用途:存放虚拟机的磁盘镜像、实例信息等。

{% if enable_shared_var_lib_nova_mnt | bool %}/var/lib/nova/mnt:/var/lib/nova/mnt:shared{% endif %}

  • 作用:条件挂载,允许多个容器共享/var/lib/nova/mnt目录,用于共享数据。
  • 用途:跨虚拟机或实例共享存储

nova_libvirt_qemu:/etc/libvirt/qemu

  • 作用:挂载QEMU特定配置目录。
  • 用途:配置虚拟化的QEMU相关参数。

{{ kolla_dev_repos_directory ~ '/nova:/dev-mode/nova' if nova_dev_mode | bool else '' }}

  • 作用:在开发模式下挂载源代码仓库路径,用于调试或开发。
  • 用途:方便在开发环境中修改源码。

综述

这些映射主要用于:

  • 配置文件和时间同步
  • 访问硬件设备和内核模块
  • 存储和管理虚拟机镜像和状态
  • 共享和配置虚拟化相关的软件环境
  • 支持开发调试(在nova_dev_mode开启时)

整体目的是确保虚拟化容器能访问所需的资源、配置和存储,同时保持与宿主机的一致性和隔离性。

参考:

github.com/openstack/k…