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 %}
]
}
- 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 }}
- 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
开启时)
整体目的是确保虚拟化容器能访问所需的资源、配置和存储,同时保持与宿主机的一致性和隔离性。