我可以使用 qemu/kvm 中的池啟用 cephx 身份驗證嗎?
(CentOS 7,Ceph Incunabulus,一切都已更新)
背景
我有一個工作的融合 Ceph/qemu/kvm 集群,啟用了 cephx 進行身份驗證。我正在嘗試使用它來儲存 qemu/kvm 虛擬機的塊設備——這不是一個不常見的配置。我想在 ceph 中為虛擬磁碟設置一個池,在 libvirt 中定義該池並對其進行身份驗證,然後使用該池創建虛擬機。所有教程和範例似乎都顯示了直接在每個磁碟文件上設置 cephx 身份驗證。鑑於我到目前為止的一天,我開始明白為什麼了!
問題
當我嘗試以下操作時,qemu-kvm 似乎通過了配置為
file=rbd:vmlive/testguest-vda:auth_supported=none
. 那應該讀auth_supported=cephx
,並且由於某種原因它沒有發生!我可以根據需要將所有身份驗證放入池中,還是必須在每個虛擬磁碟的 XML 中放置一個身份驗證部分?如果我能做到這一點,我在下面的錯誤在哪裡?
我現在正在嘗試什麼
語境
我有兩個節點:test1 和 test2。每個都有兩個 OSD,每個也是一個監視器(是的,我知道使用偶數個監視器執行是個壞主意)。每個都安裝了 libvirt,因此安裝了 qemu/kvm。我在 test1 上以 root 身份執行以下命令。UUID 已更改,您會看到我沒有在下面顯示任何鍵!
創建 Ceph 池和 client.kvm 使用者
SENSIBLE_PGS=512 # Calculate as OSDs * 100 / number of replicas, rounded up to next power of 2 ID=kvm POOL=vmlive ceph osd pool create $POOL $SENSIBLE_PGS $SENSIBLE_PGS KEY=`ceph auth get-or-create client.$ID | grep -v '^\[' | awk '{print $3}'` ceph auth caps client.$ID mon "allow r" osd "allow rwx pool=$POOL"
創建一個包含 Ceph 使用者密鑰的 libvirt 密鑰
SECRET_DEFINITION_FILE=~/secret-$ID.xml SECRET_UUID=12345678-1234-1234-1234-123456789abc cat > $SECRET_DEFINITION_FILE << EOF <secret ephemeral='no' private='no'> <uuid>$SECRET_UUID</uuid> <usage type='ceph'> <name>ceph client.$ID key</name> </usage> </secret> EOF virsh secret-define --file $SECRET_DEFINITION_FILE rm -f $SECRET_DEFINITION_FILE virsh secret-set-value "$SECRET_UUID" "$KEY"
創建一個libvirt儲存池,嘗試使用cephx認證
POOL_DEFINITION_FILE=~/pool-$POOL.xml cat > $POOL_DEFINITION_FILE << EOF <pool type="rbd"> <name>$POOL</name> <source> <name>$POOL</name> <host name="test1" port="6789" /> <host name="test2" port="6789" /> <auth username='$ID' type='ceph'> <secret uuid='$SECRET_UUID'/> </auth> </source> </pool> EOF virsh pool-define $POOL_DEFINITION_FILE rm -f $POOL_DEFINITION_FILE virsh pool-autostart $POOL virsh pool-start $POOL
使用 virt-install 創建來賓
NAME=testguest DEV=vda SIZE=8G IMAGE=CentOS-7-x86_64-Minimal-1503-01.iso VCPUS=1 RAM=512 MACLAST_HEX=10 IPLAST_DECIMAL=16 FILE=$NAME-$DEV qemu-img create -f rbd rbd:$POOL/$FILE $SIZE sudo virsh net-update default add-last ip-dhcp-host \ --xml "<host mac='52:54:00:00:00:$MACLAST_HEX' ip='192.168.122.$IPLAST_DECIMAL' name='$NAME'/>" --live --config sudo virt-install \ --connect qemu:///system \ --virt-type kvm \ --name $NAME \ --ram $RAM \ --vcpus=$VCPUS \ --disk vol=$POOL/$FILE \ --location /var/lib/libvirt/images/$IMAGE \ --vnc \ --noautoconsole \ --os-type linux \ --os-variant rhel7 \ --network=bridge:virbr0,model=virtio,mac=52:54:00:00:00:$MACLAST_HEX \ --autostart
結果
WARNING vmlive/testguest-vda may not be accessible by the hypervisor. You will need to grant the 'qemu' user search permissions for the following directories: ['vmlive', ''] Starting install... Retrieving file .treeinfo... Retrieving file vmlinuz... Retrieving file initrd.img... ERROR internal error: process exited while connecting to monitor: 2016-01-06T15:16:54.639890Z qemu-kvm: -drive file=rbd:vmlive/testguest-vda:auth_supported=none:mon_host=test1\:6789,if=none,id=drive-virtio-disk0,format=raw: error connecting 2016-01-06T15:16:54.640574Z qemu-kvm: -drive file=rbd:vmlive/testguest-vda:auth_supported=none:mon_host=test1\:6789,if=none,id=drive-virtio-disk0,format=raw: could not open disk image rbd:vmlive/testguest-vda:auth_supported=none:mon_host=test1\:6789: Could not open 'rbd:vmlive/testguest-vda:auth_supported=none:mon_host=test1\:6789': Operation not supported Domain installation does not appear to have been successful.
如果你已經讀到這裡……謝謝,恭喜,所有的幫助都感激不盡!
更新 1
更新:這似乎是 virt-install 部分(但不完全)解析池的問題。如果我使用
--print-xml
為磁碟生成的部分 XML 是:<disk type="network" device="disk"> <driver name="qemu"/> <source protocol="rbd" name="vmlive/testguest-vda"> <host name="test1" port="6789"/> </source> <target dev="vda" bus="virtio"/> </disk>
…其中包括大部分池定義,但不包括
auth
節。我會繼續調查。
正如你所說,XML 不包含
auth
節,這就是域安裝失敗的原因,但你可以添加auth
部分手冊編輯
/usr/share/virt-manager/virtinst/guest.py
如下#vim /usr/share/virt-manager/virtinst/guest.py import re ... #define the auth auth_secret = ''' <auth username='libvirt'> <secret type='ceph' uuid='e63e4b32-280e-4b00-982a-9d3xxxxxxx'/> </auth> ''' ceph_monitors = ''' <host name='172.16.200.104' port='6789'/> <host name='172.16.200.105' port='6789'/> <host name='172.16.200.106' port='6789'/> ''' #change func: _build_xml def _build_xml(self, is_initial): log_label = is_initial and "install" or "continue" disk_boot = not is_initial start_xml = self._get_install_xml(install=True, disk_boot=disk_boot) final_xml = self._get_install_xml(install=False) #add------------start rgx_qemu = re.compile('(<driver name="qemu"[^>]*?>)') rgx_auth = re.compile('(?<=<source protocol="rbd" name=")([^>]*?">).*?(?= *?</source>)',re.S) start_xml = rgx_qemu.sub('\\1' + auth_secret,start_xml) start_xml = rgx_auth.sub('\\1' + ceph_monitors,start_xml) final_xml = rgx_qemu.sub('\\1' + auth_secret,final_xml) final_xml = rgx_auth.sub('\\1' + ceph_monitors,final_xml) #add------------end logging.debug("Generated %s XML: %s", log_label, (start_xml and ("\n" + start_xml) or "None required")) logging.debug("Generated boot XML: \n%s", final_xml) return start_xml, final_xml
然後,
virt-install
再次執行sudo virt-install \ --connect qemu:///system \ --virt-type kvm \ --name $NAME \ --ram $RAM \ --vcpus=$VCPUS \ --disk vol=$POOL/$FILE \ --location /var/lib/libvirt/images/$IMAGE \ --vnc \ --noautoconsole \ --os-type linux \ --os-variant rhel7 \ --network=bridge:virbr0,model=virtio,mac=52:54:00:00:00:$MACLAST_HEX \ --autostart
更多資訊http://www.isjian.com/ceph/virt-install-create-vm-use-rbd-pool/
目前的方法(從 virt-inst 3.1 開始仍然被破壞):
- 與任何其他方法一樣設置機密
- 使用 rbd 創建儲存池。XML 看起來像這樣:
<pool type='rbd'> <name>volumes</name> <!-- libvirt pool name --> <source> <host name='10.1.1.1' port='6789'/> <host name='10.1.1.2' port='6789'/> <host name='10.1.1.3' port='6789'/> <name>volumes</name><!-- ceph pool name --> <auth type='ceph' username='hypervisor'> <secret uuid='ff831b04-65a6-4b1b-ae53-9318e65158e6'/> </auth> </source> </pool>
為簡單起見,可能希望保持 libvirt 和 ceph 池名稱相同
- 添加它(如果你想自動化它,複製 XML
/etc/libvirt/storage
並在 dir 中創建連結也可以,只需要重新啟動 libvirtd)./autostart
virsh pool-define volumes.xml virsh pool-start volumes
- 從那時起,您可以傳遞
vol=poolname/volumename
給 的--disk
選項virt-install
來指定它。