背景

背景

(CentOS 7、Ceph Incunabulus、すべてが最新にパッチされています)

背景

認証のためにcephxを有効にして動作する統合Ceph / qemu / kvmクラスターがあります。私はこれを使用してqemu / kvm仮想マシン用のブロックデバイスを保存しようとしています。これは珍しい構成ではありません。 cephで仮想ディスク用のプールを設定し、libvirtでプールを定義して認証し、プールを使用して仮想マシンを作成したいと思います。すべてのチュートリアルと例は、各ディスクファイルに直接cephx認証を設定することを示しています。今私はその理由を理解し始めました!

質問

以下を試してみると、qemu-kvmが設定どおりに通過するようですが、file=rbd:vmlive/testguest-vda:auth_supported=none何らかのauth_supported=cephx理由で発生しません。

必要に応じてすべての認証をプールに入れることができますか?それとも、認証部分を各仮想ディスクのXMLに入れる必要がありますか?これを行うことができれば、以下のエラーはどこにありますか?

私が今何をしようとしているの?

コンテキスト

test1とtest2という2つのノードがあります。それぞれに2つの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

引き続き調査いたします。

答え1

おわかりのように、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/

答え2

現在のアプローチ(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ディレクトリにリンクを作成することもできます。libvirtdを再起動するだけです)./autostart
virsh pool-define volumes.xml 
virsh pool-start volumes
  1. その時点からはオプションvol=poolname/volumenameをに渡して簡単に指定できます。--diskvirt-install

答え3

これは現在virt-managerの既知のバグです。メールスレッドをご覧ください。https://www.redhat.com/archives/virt-tools-list/2016-January/msg00007.html

その間、私はこの問題を解決するための別の方法を探してみましょう。

関連情報