(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以降はまだ破損しています):
- 他の方法と同様に、秘密を設定してください。
- 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
ディレクトリにリンクを作成することもできます。libvirtdを再起動するだけです)./autostart
virsh pool-define volumes.xml
virsh pool-start volumes
- その時点からはオプション
vol=poolname/volumename
をに渡して簡単に指定できます。--disk
virt-install
答え3
これは現在virt-managerの既知のバグです。メールスレッドをご覧ください。https://www.redhat.com/archives/virt-tools-list/2016-January/msg00007.html。
その間、私はこの問題を解決するための別の方法を探してみましょう。