Posso ativar a autenticação cephx usando um pool no qemu / kvm?

4

(CentOS 7, Ceph Incunabulus, tudo atualizado até agora)

Antecedentes

Eu tenho um cluster Ceph / qemu / kvm convergente em funcionamento com o cephx ativado para autenticação. Eu estou tentando usar isso para armazenar dispositivos de bloco para máquinas virtuais qemu / kvm - não uma configuração incomum. Gostaria de configurar um pool para discos virtuais no ceph, definir esse pool e autenticar nele na libvirt e criar máquinas virtuais usando o pool. Todos os tutoriais e exemplos parecem mostrar a configuração da autenticação cephx diretamente em cada arquivo do disco. Dado o meu dia até agora, estou começando a ver o porquê!

Pergunta

Quando eu tento o seguinte, o qemu-kvm parece ter passado por uma unidade configurada como file=rbd:vmlive/testguest-vda:auth_supported=none . Isso deve ler auth_supported=cephx e, por alguma razão, isso não está acontecendo!

Posso colocar toda a autenticação no pool como eu quero, ou tenho que colocar uma seção de autenticação no XML de cada disco virtual? Se eu posso fazer isso, onde está o meu erro no que está abaixo?

O que estou tentando agora

Contexto

Eu tenho dois nós: test1 e test2. Cada um tem dois OSDs, cada um também é um monitor (sim, estou ciente de que correr com um número par de monitores é uma má ideia). Cada um tem libvirt instalado, portanto qemu / kvm. Estou executando os comandos abaixo como root no test1. O UUID foi alterado e você verá que não faço nenhuma tecla visível abaixo!

Crie um pool Ceph e um usuário 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"

Crie um segredo libvirt contendo a chave do usuário do Ceph

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"

Crie um pool de armazenamento libvirt, tentando usar a autenticação 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

Crie um convidado usando o 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

O resultado

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.

Se você leu até aqui ... obrigado, parabéns e tudo ajuda recebido com gratidão!

Atualização 1

Atualização: isso parece ser um problema com a virt-install parcialmente (mas de forma incompleta) analisando pools. Se eu usar --print-xml , o XML parcial gerado para o disco será:

<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>

... que inclui grande parte da definição do conjunto, mas não da estrofe auth .

Vou continuar investigando.

    
por Peter Crowther 06.01.2016 / 16:23

2 respostas

0

Este é atualmente um bug conhecido no virt-manager - veja o tópico de e-mail em link .

Nesse meio tempo, encontrarei outra maneira de contornar o problema.

    
por 18.01.2016 / 10:24
3

Como você disse, o XML não inclui auth stanza, é por isso que a instalação do domínio falhou, mas você pode adicionar o manual auth part

Edite /usr/share/virt-manager/virtinst/guest.py como segue

#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

Em seguida, execute virt-install novamente

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

Mais informações link

    
por 15.11.2016 / 18:05