Projet

Général

Profil

Openstack Management TTNN

Liens

Avant toute operation Openstack

Tres important avant toute operation Openstack lancer sur g1 :

root@g1:~# . os.conf
root@g1:~# tools/os-overview.sh 

Si une ligne n'est pas OK relancer le composant et relancer os-overview.

Création VMs

Example d'un VM sur ssd avec 2 disques (hard) additionels de 500G

$ openstack ttnn create --ip <ipv4> --ssd --disk-size 20 --flavor 1vcpu-1024ram --image debian-stretch-scsi <name>.tetaneutral.net
$ openstack volume create --type ceph --size 500 <name>.tetaneutral.net-disk-1
$ openstack volume create --type ceph --size 500 <name>.tetaneutral.net-disk-2
$ openstack server add volume <name>.tetaneutral.net <name>.tetaneutral.net-disk-1
$ openstack server add volume <name>.tetaneutral.net <name>.tetaneutral.net-disk-2

Ensuite dans la VM:

mkfs.ext4 -E nodiscard /dev/sdb
mkfs.ext4 -E nodiscard /dev/sdc
tune2fs -c 0 -i 0 -m 0 /dev/sdb
tune2fs -c 0 -i 0 -m 0 /dev/sdc

/!\ Ne pas mettre nodiscard pour les SSDs /!\

Opération sur les VMs (des membres)

Console série

Dans la VM, pour systemd:

$ systemctl enable serial-getty@ttyS0.service
$ systemctl start serial-getty@ttyS0.service

Dans la VM, pour sysv

$ cat >> /etc/inittab <<EOF
T2:2345:respawn:/sbin/getty ttyS0 115200 vt102
EOF
$ init q

Sur g1:

$ openstack ttnn log ns2.tetaneutral.net

Debian GNU/Linux 8 ns2 ttyS0
ns2 login:

Voir la console graphique sans spice-html5:

Copier le script suivant 'gvnc' sur ca machine:

#!/bin/bash
vm=$1
info=($(ssh openstack.tetaneutral.net -p 2222 -l root -- "mysql nova --skip-column-names --batch -e 'select host, uuid from instances where display_name=\"$vm\";'"))

if [ "${info[0]}" == "mysql" ]; then
    echo "Error in mysql request" 
    exit 1
fi

hypervisor=${info[0]}.tetaneutral.net
uuid=${info[1]}
spice_port=$(ssh ${hypervisor} -p 2222 -l root virsh domdisplay ${uuid} | awk -F: '{print $3}')

echo "$vm on $hypervisor port $spice_port" 
ssh -N $hypervisor -p 2222 -l root -L 5910:localhost:${spice_port} &
pid=$!

cleanup(){
    kill $pid
}

trap cleanup EXIT

sleep 2
remote-viewer spice://localhost:5910/

Puis

sudo apt-get install virt-viewer
./gvnc puppet.openstack.net

Reboot VM en error

openstack server set --state active xxx.tetaneutral.net
openstack server reboot --hard --wait xxx.tetaneutral.net

Shutdown une VM

openstack server stop xxx.tetaneutral.net

A noter que suspend fait une sauvegarde de la RAM comme sur un laptop. shelve est bugué ne pas utiliser.

Effacer une VM

openstack ttnn delete xxx.tetaneutral.net

Cette commande lance la suppression de la VM et des ces interfaces réseaux.
"--with-disk" peut être ajouter pour supprimer TOUT les disques de cette VM.

Changer CPU RAM

openstack server resize --flavor 2vcpu-2048ram VMNAME.tetaneutral.net # will stop VMNAME then start VMNAME on a new KVM
openstack server resize --confirm VMNAME.tetaneutral.net # get rid of freezed KVM

# openstack flavor list

Disques de VM

Pour renommer (et permettre a boot-disk de recreer) ou effacer :

openstack volume list
openstack volume set xxx.tetaneutral.net-bootdisk-old --name xxx.tetaneutral.net-bootdisk-new
openstack volume delete <ID_or_Name>

Offline fsck

Récuperer l'id et l'hyperviseur de la VM

# openstack server stop VMNAME.tetaneutral.net
# openstack server show VMNAME.tetaneutral.net | grep -e 'host ' -e ' id '
| OS-EXT-SRV-ATTR:host                 | g1                                                       |
| id                                   | 918e0ec7-0909-423c-9a67-15b5ef7c7ae0                     |

Aller sur l'hyperviseur en question, puis:

# guestfish -d 918e0ec7-0909-423c-9a67-15b5ef7c7ae0
><fs> run
><fs> list-filesystems
/dev/sda: iso9660
/dev/sdb1: ext4
><fs> e2fsck-f /dev/sdb1

# ou 
e2fsck /dev/sdb1 forceall:true

Ou bien sur la machine qui host la VM :

# virt-rescue 918e0ec7-0909-423c-9a67-15b5ef7c7ae0
><rescue> fsck -a /dev/sdb1

Si le fsck returns une erreur, c'est donc un probleme un peu plus grave on peut faire:

><fs> e2fsck -y /dev/sdb1

Ajout d'un disque

Note: Si la VM vient juste d'être créé bien attendre qu'elle est fini son premier boot avant ! Sinon sda et sdb sont inversé (Oui oui, merci nova...).

openstack volume create --type ceph --size 1000 --image debian-jessie-scsi zorun.tetaneutral.net-disk-1
openstack server add volume zorun.tetaneutral.net zorun.tetaneutral.net-disk-1

Puis dans la VM

mkfs.ext4 /dev/sdb
tune2fs -m 0 -i 0 -c 0 /dev/sdb

Agrandissement d'un disque (testé sur openstack ocata and ceph jewel)

/root/tools/os-grow-fs.sh bacasable.sileht.net-bootdisk 11

Puis sur la VM, plusieur cas de figure:

Disque sans partition:

# Note: dans un screen car plutot pas rapide
resize2fs -p /dev/sdb

Disque avec partition avec parted récent (>= 3.1, ie: jessie, ubuntu 13.10):

 
root@test4:~# parted /dev/sda print | grep sda
Disk /dev/sda: 64.4GB

root@test4# parted /dev/sda resizepart 1 
Warning: Partition /dev/sda1 is being used. Are you sure you want to continue?
Yes/No? Yes                                                               
End?  [42.9GB]? 64.4GB   # METTRE ICI LA TAILLE VU AU DESSUS                                                 
Information: You may need to update /etc/fstab.                           

root@test4:~# resize2fs /dev/sda1
resize2fs 1.42.9 (4-Feb-2014)
Filesystem at /dev/sda1 is mounted on /; on-line resizing required
old_desc_blocks = 3, new_desc_blocks = 4
The filesystem on /dev/sda1 is now 15722400 blocks long.

root@test4:~# df -h | grep sda
/dev/vda1        60G  797M   56G   2% /

Disque avec partition avec vieux parted (< 3.1, ie: wheezy, vielle ubuntu):

Pour debian wheezy, utilisation des packages ubuntu de 14.04 devrait permettre d'utiliser la méthod précendente sinon:
(pas encore testé, à voir si le kernel veut bien reload la table des partitions après)

sfdisk -d /dev/vda > vda.mbr
cp vda.mbr vda.mbr.ori
vi vda.mbr 
# mettre un tres grand nombre pour la fin de la partition
sfdisk -L -n --no-reread /dev/vda < vda.mbr
# cela va faire une erreur avec le max a mettre pour la fin de la partition
# changer la fin de la partition avec ce chiffre
sfdisk -L --no-reread /dev/vda < vda.mbr
reboot
resize2fs -p /dev/vda1

Ajout/Suppression IP/Subnet d'une VM existante (mode simple)

openstack ttnn add-ip VM_NAME 89.234.156.212
openstack ttnn remove-ip VM_NAME 89.234.156.212

Ajout/Suppression IP/Subnet d'une VM existante (mode avancé)

Le mode avancé permet d'ajouté les ipv6 et ipv4 que l'on veut pour la VM. Contrairement au mode simple qui ajoute l'ipv4, le fe80 et le subnet ipv6 à partir de l'ipv4

Voir les IPs actutelles de la VM:

# openstack port show backup.tetaneutral.net-eth0  -c  allowed_address_pairs -c fixed_ips
| allowed_address_pairs | {"ip_address": "2a01:6600:8083:d400::/56", "mac_address": "fa:16:3e:5f:07:45"}                |
| fixed_ips             | {"subnet_id": "d431cacd-3b60-4ca9-af24-eacc8e5d8671", "ip_address": "89.234.156.212"}         |
fixed_ips sont la liste des ip directement router dans le tap de la VM (on ne peut pas mettre de masque):
  • en ipv4, c'est le /32 de l'ipv4
  • en ipv6, c'est le /64 de l'ipv6

allowed_address_pairs sont des subnets à router:

  • en ipv4, via la premier ipv4 de fixed_ips (setup inutile et qui ne fonctionne pas, car bird ne re-export pas ce genre de route)
  • en ipv6, via la link local correspondant si elle existe dans fixed_ips, sinon directement dans le tap

Ajout/Suppression d'une ip dans fixed_ips (noter que les ip ici non pas de masque):

openstack ttnn add-ip --manual VM_NAME 89.234.156.212
openstack ttnn add-ip --manual VM_NAME fe80::80:12
openstack ttnn remove-ip --manual VM_NAME 89.234.156.212
openstack ttnn remove-ip --manual VM_NAME fe80::80:12

Ajout/Suppression d'une ip dans allowed_address_pairs (noter que les ip ici on a un masque):

openstack ttnn add-ip --manual VM_NAME 2a01:6600:8083:d400::/56
openstack ttnn remove-ip --manual VM_NAME 2a01:6600:8083:d400::/56

Ajout d'une interface réseau à une VM:

$ openstack ttnn tap add --ip 91.224.149.19 --port-name eth1 gizmo.sileht.net-eth1
Port gizmo.sileht.net-eth1 created:
+-------------------------------+-----------------------+----------------------------+--------------------------+-------------------+
| id                            | name                  | fixed_ips                  | allowed_address_pairs    | mac_address       |
+-------------------------------+-----------------------+----------------------------+--------------------------+-------------------+
| 39c262d6-df91-4c96-96bc-      | gizmo.sileht.net-eth1 | 91.224.149.19, fe80::81:13 | 2a03:7220:8081:1300::/56 | fa:16:3e:20:de:ba |
| f3573a37130a                  |                       |                            |                          |                   |
+-------------------------------+-----------------------+----------------------------+--------------------------+-------------------+
+--------------------------------------+------------------+------+---------------+--------+-----------------------------------------+
| id                                   | name             | host | flavor        | status | addresses                               |
+--------------------------------------+------------------+------+---------------+--------+-----------------------------------------+
| 0346263f-77f6-4009-bdb3-d8720ec583e9 | gizmo.sileht.net | g9   | 2vcpu-4096ram | ACTIVE | vlan-routed=91.224.148.3,               |
|                                      |                  |      |               |        | 91.224.149.214, fe80::80:03,            |
|                                      |                  |      |               |        | fe80::81:d6, 91.224.149.19, fe80::81:13 |
+--------------------------------------+------------------+------+---------------+--------+-----------------------------------------+

Dans la VM:

$ dmesg | tail 
[ 1315.826088] virtio-pci 0000:00:06.0: using default PCI settings
[ 1315.826102] virtio-pci 0000:00:07.0: no hotplug settings from platform
[ 1315.826102] virtio-pci 0000:00:07.0: using default PCI settings
[ 1315.826116] pci 0000:00:08.0: no hotplug settings from platform
[ 1315.826117] pci 0000:00:08.0: using default PCI settings
[ 1315.826382] virtio-pci 0000:00:08.0: enabling device (0000 -> 0003)
[ 1315.829281] virtio-pci 0000:00:08.0: setting latency timer to 64
[ 1315.829535] virtio-pci 0000:00:08.0: irq 50 for MSI/MSI-X
[ 1315.829555] virtio-pci 0000:00:08.0: irq 51 for MSI/MSI-X
[ 1315.829563] virtio-pci 0000:00:08.0: irq 52 for MSI/MSI-X

$ ip l   show dev eth1
4: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000
    link/ether fa:16:3e:6b:32:07 brd ff:ff:ff:ff:ff:ff

$ tail -15 /etc/network/interfaces
auto eth1
iface eth1 inet6 static
    pre-up /sbin/sysctl -w net.ipv6.conf.eth1.accept_ra=0
    pre-up /sbin/sysctl -w net.ipv6.conf.eth1.autoconf=0
    address 2a03:7220:8081:1300::1
    netmask 56
    gateway fe80::31
    up ip addr add fe80::81:13/64 dev eth0

iface eth1 inet manual
    pre-up /sbin/sysctl -w net.ipv6.conf.eth1.accept_ra=0
    pre-up /sbin/sysctl -w net.ipv6.conf.eth1.autoconf=0
    up ip link set eth1 up
    up ip addr add 91.224.149.19/32 dev eth1
    up ip route add default via 91.224.148.0 dev eth1 onlink

$ ifup eth1

Réinstallation/Réparation grub d'un VM

Récuperer l'id et l'hyperviseur de la VM

# openstack server stop VMNAME.tetaneutral.net
# openstack server show VMNAME.tetaneutral.net | grep -e 'host ' -e ' id '
| OS-EXT-SRV-ATTR:host                 | g1                                                       |
| id                                   | 918e0ec7-0909-423c-9a67-15b5ef7c7ae0                     |

Bien attendre que la VM soir éteinte, aller sur l'hyperviseur en question, et taper

virt-customize -v -d 918e0ec7-0909-423c-9a67-15b5ef7c7ae0 --run-command 'update-grub ; grub-install /dev/sda;'

Enfin, restart la VM

# openstack server start VMNAME.tetaneutral.net

Monter le disque d'un vm sur une machine hote pour dépannage.

L’exemple montre la modification du fichier /etc/ssh/sshd_config

Récuperer l'id et l'hyperviseur de la VM

# openstack server stop VMNAME.tetaneutral.net
# openstack server show -c OS-EXT-SRV-ATTR:host -c id VMNAME.tetaneutral.net
| OS-EXT-SRV-ATTR:host                 | g1                                                       |
| id                                   | 918e0ec7-0909-423c-9a67-15b5ef7c7ae0                     |

Aller sur l'hyperviseur en question, puis:


# virt-edit -d 918e0ec7-0909-423c-9a67-15b5ef7c7ae0 /etc/ssh/sshd_config

Fermer le fichier et restart la VM

# openstack server start VMNAME.tetaneutral.net

Convert du fs root en ext4 et passage en scsi (tester avec ceph jewel and openstack ocata)

/!\ à retester à chaque update openstack vu que ca fait du sql /!\

Dans la VM, préparation de grub et du fstab:

$ vi /etc/fstab
# Viré /proc
# Pour / (voir les autres) mettre: 
LABEL=cloudimg-rootfs  /  ext4   defaults,discard,noatime  0 0

$ e2label /dev/vda1 cloudimg-rootfs
$ apt-get install grub-pc
$ apt-get purge extlinux
$ rm -f /extlinux.conf 
$ grub-install /dev/vda
$ vi /etc/default/grub
# Ajouter: GRUB_CMDLINE_LINUX="elevator=noop console=tty0 console=ttyS0,115200n8" 
$ update-grub
$ shutdown -h now

Récuperer l'id et l'hyperviseur de la VM

# openstack server stop VMNAME.tetaneutral.net
# openstack server show -c OS-EXT-SRV-ATTR:host -c id VMNAME.tetaneutral.net
| OS-EXT-SRV-ATTR:host                 | g1                                                       |
| id                                   | 918e0ec7-0909-423c-9a67-15b5ef7c7ae0                     |

Aller sur l'hyperviseur en question, puis:

$ virt-rescue --suggest 918e0ec7-0909-423c-9a67-15b5ef7c7ae0 
...
# /dev/sdb1 is the root of a linux operating system
# type: linux, distro: debian, version: 8.0
# 8.0

mount /dev/sdb1 /sysroot/
mount --bind /dev /sysroot/dev
mount --bind /dev/pts /sysroot/dev/pts
mount --bind /proc /sysroot/proc
mount --bind /sys /sysroot/sys
  1. Utiliser le device proposé pour la convertion en ext4:
$ virt-rescue 918e0ec7-0909-423c-9a67-15b5ef7c7ae0 
> tune2fs -O extents,uninit_bg,dir_index /dev/sdb1
> e2fsck -fDC0 /dev/sdb1
> <CTRL+D>

Ajout des attributs scsi

openstack volume show VMNAME.tetaneutral.net-bootdisk
openstack volume set --image-property hw_scsi_model=virtio-scsi --image-property hw_disk_bus=scsi  VMNAME.tetaneutral.net-bootdisk

Puis supprimer et recréer la VM

openstack server show -c name -c flavor -c addresses VMNAME.tetaneutral.net 
openstack ttnn delete VMNAME.tetaneutral.net
openstack ttnn create --ip <ip> --flavor <flavor> VMNAME.tetaneutral.net # --volume disk-1 # pour les disques additionels

Déplacer une VM de pool ceph (dernier test avec ceph jewel / openstack ocata)

# openstack server show test246.tetaneutral.net -c id -c flavor -c addresses -c status
+-----------+------------------------------------------------------+
| Field     | Value                                                |
+-----------+------------------------------------------------------+
| addresses | vlan-routed=91.224.149.115, fe80::80:fe              |
| flavor    | 1vcpu-2048ram (7880cafc-bd0b-4045-9777-ef2e9201bd6c) |
| id        | 485f270a-eb2e-452e-8733-fc4c741cbe8f                 |
| status    | ACTIVE                                               |
+-----------+------------------------------------------------------+

# openstack server delete test246.tetaneutral.net
Request to delete server test246.tetaneutral.net has been accepted.

# openstack volume set --type ceph-ssd --retype-policy on-demand test246.tetaneutral.net

# watch -n1 -- 'openstack volume list --long | grep test246.tetaneutral.net-bootdisk'
| 82279cc1-9a34-4108-b7a6-6944f252a2c3 | test246.tetaneutral.net-bootdisk           | retyping  |    1 |  ceph
| 313dc3e5-a04a-435b-8b35-ecc5d7b5695c | test246.tetaneutral.net-bootdisk           | available |    1 |  ceph-ssd

Attendre qu'il n'y ai plus que le nouveau volume

| 313dc3e5-a04a-435b-8b35-ecc5d7b5695c | test246.tetaneutral.net                    | available |    1 |  ceph-ssd

# openstack ttnn create --ip 91.224.149.115 --flavor 1vcpu-2048ram test246.tetaneutral.net

Réaligne VM partition (guide pour vm avec une seul partition)

Prérequies:

  • VM utilse grub2 *

Récuperer l'id et l'hyperviseur de la VM, ainsi que l'id du disk

# openstack server stop VMNAME.tetaneutral.net
# openstack server show VMNAME.tetaneutral.net | grep -e 'host ' -e ' id '
| OS-EXT-SRV-ATTR:host                 | g1                                                       |
| id                                   | 918e0ec7-0909-423c-9a67-15b5ef7c7ae0                     |
# cinder list | grep puppet
| 213e894e-2f20-42b5-a27b-21f5a355c722 |   in-use  |          VMNAME.tetaneutral.net-bootdisk          |  20  |     ceph-ssd    |   true   | 918e0ec7-0909-423c-9a67-15b5ef7c7ae0 |

Aller sur l'hyperviseur en question, puis vérifier l'alignement:

$ virt-alignment-scan -d 918e0ec7-0909-423c-9a67-15b5ef7c7ae0 
/dev/sdb1        65536           512   bad (alignment < 4K)

Réalignemet, aller dans un espace ou il y a 2x l'espace utile de la VM, puis:

$ virt-tar-out -d 918e0ec7-0909-423c-9a67-15b5ef7c7ae0 / - | gzip --best > VMNAME.tar.gz
$ rbd -p ssds info volume-213e894e-2f20-42b5-a27b-21f5a355c722
rbd image 'volume-213e894e-2f20-42b5-a27b-21f5a355c722':
        size 20480 MB in 5120 objects
        order 22 (4096 kB objects)
        block_name_prefix: rbd_data.996cc92ae8944a
        format: 2
        features: layering
$ virt-make-fs --label=cloudimg-rootfs --partition=mbr --type=ext4 --format=raw --size=20480 VMNAME.tar.gz VMNAME.img
$ virt-customize -a VMNAME.img --run-command 'update-grub ; grub-install /dev/sda'
$ rbd mv ssds/volume-213e894e-2f20-42b5-a27b-21f5a355c722 ssds/volume-213e894e-2f20-42b5-a27b-21f5a355c722.unaligned
$ rbd import --image-format 2 VMNAME.img ssds/volume-213e894e-2f20-42b5-a27b-21f5a355c722

Vérification:

$ virt-alignment-scan -d 918e0ec7-0909-423c-9a67-15b5ef7c7ae0 
/dev/sdb1        65536           64K   ok

Création/Restauration snapshot

Création:

source os.conf
/root/tools/os-snapshot-vm.sh pano.tetaneutral.net bootdisk /
* Freezing / of pano.tetaneutral.net
* Snapshoting pano.tetaneutral.net-bootdisk
Snapshot pano.tetaneutral.net-bootdisk-20150125-1600 is in state creating ..
* pano.tetaneutral.net-bootdisk snapshoted
* / of pano.tetaneutral.net unfreezed

Restauration:

$ openstack snapshot-list
...
$ openstack volume create --size 101 --snapshot pano.tetaneutral.net-bootdisk-20150125-1600  pano-restauration-test
$ openstack server add volume pano.tetaneutral.net pano-restauration-test

Viré cloud-init sans accés à la VM:

# openstack server stop VMNAME.tetaneutral.net 
# openstack server show VMNAME.tetaneutral.net -c id -c OS-EXT-SRV-ATTR:host -c status -f value
g12
a82eb312-7d42-44e1-bce2-a81292916cc3
SHUTOFF

# virt-customize -v --connect "qemu+ssh://<SHORT HYPERVISOR HOSTNAME>:2222/system" -d <ID> --run-command "echo ::::::::::::::: ; DEBIAN_FRONTEND=noninteractive apt-get -y purge cloud-init cloud-initramfs-growroot ; echo :::::::::::: ; " 

Opération sur les hyperviseurs

Reboot d'un hyperviseur

Sur g1

# openstack ttnn evacuate HOST
Migration of :
- lagrandeourse.tetaneutral.net [g2/active]
- pontsjumeaux.tetaneutral.net [g2/active]
- log.tetaneutral.net [g2/active]
- jabber.tetaneutral.net [g2/active]
- vmfatal.tetaneutral.net [g2/active]
- zoe.tetaneutral.net [g2/active]
...

Continue (Y/n) ? Y
rollback script 'evacuate-rollback-g2.sh' created
Live migration of lagrandeourse.tetaneutral.net [g2/active]: Complete on g2 and still alive \o/
...

Sur l'hyperviseur en question:

# ps fauxwww|grep kvm           # verifier qu'il n'y a plus de VM lancé
# virsh list --all              # verifier qu'il n'y a plus de VM dans libvirt
# ceph osd set noout            # pour prevenir que les OSD vont revenir
# systemctl stop ceph-mon@*     # Stopper les osd 
# systemctl stop ceph-osd@*     # Stopper les osd 
# reboot

Une fois l'opération terminer, pour remettre l'hyperviseur en route, sur g1

ceph osd tree                   # Vérifier que les OSDs de cette hypervisuer sont revenur
./tools/os-overview.sh          # Vérifier que neutron et nova sont ok sur cette hyperviseur

ceph osd unset noout            
./evacuate-rollback-g2.sh       # Remettre les VMs dessus.

VM de management (nommé openstack)

Live Migration d'un host à l'autre

Cela fait tout à notre place niveau kvm/libvirt/ceph

virsh migrate --persistent --undefinesource --live --p2p openstack qemu+ssh://g2.tetaneutral.net:2222/system

Recover depuis une perte de la machine hote:

Créé un fichier openstack.xml à partir d'un backup de '/etc/libvirt/qemu/openstack.xml' ou utiliser l'exemple ici: attachment:openstack.xml

Note: il faut surement viré les uuid des interfaces openvswitch qui sont différent suivant le hosts

Puis on recréé la VM

$ virsh create openstack.xml
$ virsh start openstack.xml