Centos

我可以使用 qemu/kvm 中的池啟用 cephx 身份驗證嗎?

  • November 26, 2020

(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 開始仍然被破壞):

  1. 與任何其他方法一樣設置機密
  2. 使用 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 池名稱相同

  1. 添加它(如果你想自動化它,複製 XML/etc/libvirt/storage並在 dir 中創建連結也可以,只需要重新啟動 libvirtd)./autostart
virsh pool-define volumes.xml 
virsh pool-start volumes
  1. 從那時起,您可以傳遞vol=poolname/volumename給 的--disk選項virt-install來指定它。

引用自:https://unix.stackexchange.com/questions/253642